如何在CloudFormation中添加带有S3触发器的Lambda函数?

时间:2018-04-23 11:05:51

标签: amazon-web-services amazon-s3 aws-lambda amazon-cloudformation

我一直在使用CloudFormation YAML一段时间,并发现它是全面的 - 直到现在。我正在努力尝试使用SAM / CloudFormation创建一个Lambda函数,只要将对象添加到现有的 S3存储桶中就会触发该函数。

到目前为止,我见过的所有示例似乎都要求您在创建Lambda函数时在相同的CloudFormation脚本中创建存储桶。这对我不起作用,因为我们的设计目标是能够使用CloudFormation将我们的整个堆栈重新部署到不同的区域或AWS账户,并快速启动我们的应用程序。 S3存储桶名称必须全局唯一,因此如果我在CloudFormation中创建存储桶,当我尝试将其部署到不同的区域/帐户时,脚本将会中断。我可以通过在名称中创建具有帐户名称/区域的存储桶来解决这个问题,但从存储桶蔓延的角度来看,这是不可取的。

那么,有没有人有一个在CloudFormation中创建Lambda函数的解决方案,该函数由写入现有 S3存储桶的对象触发?

谢谢!

1 个答案:

答案 0 :(得分:0)

这是不可能的,according to the SAM team。这是底层CloudFormation服务无法做到的事情。

如果您实现自定义资源,可以触发单独的Lambda函数来修改现有存储桶并将其链接到您要部署的Lambda函数,则可能有一种解决方法。

由于“实现自定义资源”不是非常具体:Here is an AWS github repo with scaffold code to help write it,然后在模板中声明类似以下内容(其中LambdaToBucket)是您编写的自定义函数。我发现你需要在该函数中配置两个东西:一个是存储桶上的存储桶通知配置(告诉Lambda有关更改),另一个是函数的Lambda权限(说允许从S3调用)。 / p>

    Resources:
      JoinLambdaToBucket:
      Type: Custom::JoinLambdaToExistingBucket
      Properties:
        ServiceToken: !GetAtt LambdaToBucket.Arn