SAM は CloudFormation の拡張であり、通常CloudFormationでは設定がややこしい項目を簡単に設定できるようになっている。
https://github.com/aws/serverless-application-model/blob/master/versions/2016-10-31.md#s3 にあるとおり、SAM では作成済みバケットに紐づくトリガーは設定することができず、template.yamlにバケットの定義も含める必要がある。 これは CloudFormation の制約のようなのでどうすることもできなさそうだ。
Cannot reference existing bucket as event source · Issue #1061 · aws/aws-sam-cli · GitHub
workaround
Lambda はSAMで作成して、それとは別に aws s3api put-bucket-notification-configuration
コマンドでトリガー
https://github.com/aws/serverless-application-model/issues/124#issuecomment-511779961
FUNCARN=$(aws cloudformation describe-stacks \
--stack-name "my-stack-name" \
--query 'Stacks[0].Outputs[0].OutputValue'
)
JSON=$(cat <<-EOF
{
"LambdaFunctionConfigurations": [
{
"Id": "MyEventsName",
"LambdaFunctionArn": ${FUNCARN},
"Events": [
"s3:ObjectCreated:*"
]
}
]
}
EOF
)
aws s3api \
put-bucket-notification-configuration \
--bucket="my-bucket-name" \
--notification-configuration "$JSON"
他の手段
- Create Amazon S3 notification configurations for Lambda on S3 buckets | AWS re:Post
- CloudFormation 一撃で既存のS3バケットでAWS LambdaのS3のオブジェクト作成通知を追加作成してみた | DevelopersIO
S3通知設定を更新するLambdaを一緒にデプロイするということのようだ。パワープレイ💪感あるが公式ブログでも紹介されているし問題ないのかな
Tips
AWS CLIでput-bucket-notification-configurationするときにjqで既存の設定と追加差分を上手いことマージするAWS - Qiita