我使用 CloudFormation YAML 一段时间了,发现它非常全面 - 直到现在。我正在努力尝试使用 SAM/CloudFormation 创建一个 Lambda 函数,每当将对象添加到现有 S3 存储桶时就会触发该函数。
到目前为止我看到的所有示例似乎都要求您在创建 Lambda 函数时在同一 CloudFormation 脚本中创建存储桶。这对我来说不起作用,因为我们的设计目标是能够使用 CloudFormation 将整个堆栈重新部署到不同的区域或 AWS 帐户并快速启动我们的应用程序。 S3 存储桶名称必须是全局唯一的,因此如果我在 CloudFormation 中创建存储桶,当我尝试将其部署到不同的区域/帐户时,脚本将会中断。我可能可以通过创建名称中包含帐户名称/区域的存储桶来解决此问题,但从存储桶蔓延的角度来看,这是不可取的。
那么,有没有人有解决方案可以在 CloudFormation 中创建由写入现有 S3 存储桶的对象触发的 Lambda 函数?
谢谢!
最佳答案
这是不可能的,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 的调用)。
Resources:
JoinLambdaToBucket:
Type: Custom::JoinLambdaToExistingBucket
Properties:
ServiceToken: !GetAtt LambdaToBucket.Arn
关于amazon-web-services - 如何在 CloudFormation 中添加带有 S3 触发器的 Lambda 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49979590/