使用CloudFormation在S3存储桶中创建Lambda通知

时间:2016-08-03 20:24:34

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

我正在尝试在CloudFormation模板中为Lambda函数创建一个S3触发器。 S3存储桶已存在,正在创建Lambda函数。

This表示无法使用CFT修改预先存在的基础架构(在本例中为S3),但this似乎表示存储桶必须预先存在。

  1. 似乎无法使用CFT类型“AWS :: Lambda ...”创建触发器,并且源服务需要创建触发器。就我而言,这是一个s3存储桶的NotificationConfiguration-LambdaConfiguration。这一切都是正确的吗?

  2. 当我尝试将NotificationConfiguration添加到带有CFT的现有S3存储桶时,它说我不能。有没有办法做到这一点?

2 个答案:

答案 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,以在对象上传到存储桶时触发等待条件)。

Launch Stack

BucketWatcher

答案 1 :(得分:0)

我使用另一种解决方案,因为我个人不喜欢自定义资源。我创建了一个云线索以捕获有关存储区的S3写入事件,然后创建具有S3事件模式的cloudwatch / eventbridge规则来触发我的Lambda函数。这样,我可以将Lambda函数挂接到现有的S3存储桶而无需接触它,并且可以通过cloudformation轻松完成。