我正在尝试在CloudFormation模板中为Lambda函数创建一个S3触发器。 S3存储桶已存在,正在创建Lambda函数。
This表示无法使用CFT修改预先存在的基础架构(在本例中为S3),但this似乎表示存储桶必须预先存在。
似乎无法使用CFT类型“AWS :: Lambda ...”创建触发器,并且源服务需要创建触发器。就我而言,这是一个s3存储桶的NotificationConfiguration-LambdaConfiguration。这一切都是正确的吗?
当我尝试将NotificationConfiguration添加到带有CFT的现有S3存储桶时,它说我不能。有没有办法做到这一点?
答案 0 :(得分:15)
不幸的是,官方AWS::CloudFormation
模板只允许您控制Amazon S3 NotificationConfiguration
作为父AWS::S3::Bucket
资源的NotificationConfiguration
property,这意味着您无法附加对于任何现有存储桶的此配置,您必须将其应用于CloudFormation管理的存储桶才能工作。
解决方法是使用PUT Bucket Notification
API JavaScript API调用直接将Lambda-backed Custom Resource调用作为putBucketNotificationConfiguration
来实现。但是,由于修改S3存储桶上的NotificationConfiguration仅限于存储桶的创建者,因此您还需要添加AWS::S3::BucketPolicy
资源,授予您对Lambda Function的s3:PutBucketNotification
操作访问权限。
这是一个完整的,自包含的CloudFormation模板,演示了如何使用2个Lambda-Backed自定义资源({}将文件添加到现有 S3存储桶时触发Lambda函数({ {1}}设置存储桶通知配置,BucketConfiguration
将对象上传到存储桶)和第三个Lambda函数(S3Object
,以在对象上传到存储桶时触发等待条件)。
BucketWatcher
答案 1 :(得分:0)
我使用另一种解决方案,因为我个人不喜欢自定义资源。我创建了一个云线索以捕获有关存储区的S3写入事件,然后创建具有S3事件模式的cloudwatch / eventbridge规则来触发我的Lambda函数。这样,我可以将Lambda函数挂接到现有的S3存储桶而无需接触它,并且可以通过cloudformation轻松完成。