きっかけ
S3へのファイル格納をトリガーとしたLambdaFunctionを作成した。
そして
運用自動化のため、SAMのファイルに定義を記述していざ、
デプロイしようとしたときである
問題発生
下記のエラーが発生した
Transform AWS::Serverless-2016-10-31 failed with: Invalid Serverless Application Specification document. Number of errors found: 1. Resource with id [hoge] is invalid. Event with id [hogeUpload] is invalid. S3 events must reference an S3 bucket in the same template.
よくよく見てみると
S3 events must reference an S3 bucket in the same template.
「同じテンプレート内のS3を参照〜」と記述されているので
SAMファイルから生成したCFnのファイル内でAWSの画面コンソールから作成しようとしても
変更セット作成時に同一のエラーが発生した。
原因
どうやら
「対象バケットは同一テンプレート内で定義したものしかサポートしない」らしい
参考URL
https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#s3
issueも上がっている
https://github.com/awslabs/serverless-application-model/issues/124
対応
同一テンプレート内のS3バケットであれば[!GetAtt]で問題なく定義できる。
所感
AWS的にはアプリの機能毎にテンプレートを分けて欲しい為の仕様と思われる
アプリの立ち上げ時にS3、EC2、RDS、etcというAWSの機能単位でテンプレートを作成していた為、当事象に直面した。
他にもアプリを機能単位でまとめないと
CloudFormationのテンプレート内で使う組み込み関数での参照時に
循環依存の問題にぶち当たる事が多々ある
AWS的なベストプラクティスは
アプリの機能毎にテンプレートを分ける
という事なのだろうか?