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
他の手段
- 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