Overview
- AWS SAM を使ってpackageを実行するとき、
--template-file
オプションでテンプレートファイルを指定してしまうと--template-file
で指定したファイルのCodeUri
にあるリソースをもとに package を実行しようとする - ローカルでビルドしたものをデプロイするときは
--teplate-file
オプションはつけてはいけない
問題に気づいた経緯
- ローカルでビルドしたものをデプロイするさいに、
node_modules
配下のファイルが Lambda Function にデプロイされていない -
.aws-sam/build
配下にはnode_modules
配下のリソースが生成されている
build、package 実行時のコマンドは以下でした
sam build
sam package \
--template-file template.yaml \
--output-template-file packaged.yaml \
--s3-bucket my-bucket \
;
原因
AWS SAM を使ってデプロイするとき、 --template-file
オプションでテンプレートファイルを指定すると --template-file
で指定したファイルの CodeUri
にあるリソースをデプロイしようとするため.
CodeUri にはビルド前のリソースが指定されているので、これをデプロイしようとすると node_modules
配下は含まれていないため、デプロイ後の Lambda Function にも node_modules
が含まれていない.
解決方法
ローカルでビルドしたものをpackageするときは --template-file
オプションはつけない
sam build
sam package \
--output-template-file packaged.yaml \
--s3-bucket my-bucket \
;
教訓
ツールが中でどんな処理を行っているのかちゃんと把握しよう。
アーティファクトの依存関係からして当たり前っちゃ当たり前ですね。。
template.yaml
(入力) => sam build
=> pacakged.yaml
(出力) という関係なので、
次のステップで sam package
を実行するときに入力として template.yaml
を指定するのはおかしいわけです。
package
でこのオプションを指定するのは、ローカルでビルドした資材を直接 Lambda Function にデプロイする場合です。
参考
GitHub に Issue が上がっていました
https://github.com/awslabs/aws-sam-cli/issues/908