AWS
sam

ローカルでビルドしたものをpackageするときは --template-file オプションはつけない


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