[AWS-CDK] NodejsFunction の snapshot test がCI環境で落ちる
課題
ローカルで通した aws-cdk の NodejsFunction
の snapshot test が、GitHub Actions 上でコケる。
tl;dr
解決方法は以下の通り。
- package.json の dependencies に
esbuild
を入れる - props の
bundling.forceDockerBundling
をfalse
にする
bundling: {
forceDockerBundling: false,
},
原因
aws-cdk の NodejsFunction
では、気を使っていないと docker を用いてビルドが行われる。(以下コード)
この docker image の tag を決めているのが以下のコードであるが、node_modules/aws-cdk-lib/lib/aws-lambda-nodejs/lib
の絶対パスに依存するため、実行環境が変わると hash がずれる。
この結果、ここ
で計算される fingerprint が変わってしまい、bundle 後の zip ファイル名が変わるため、snapshot test の結果が変わってしまう。解決策
package.json の dependencies に esbuild
を入れ、かつ NodejsFunction
の props の bundling.forceDockerBundling
を false
にする。
こうすることでビルドに docker が使われなくなるため、CI 環境上でも結果がズレなくなる。
調査の背景
aws-cdk で typescript の lambda をデプロイするのはめっちゃ簡単。 NodejsFunction
を使うだけ。
NodejsFunction
は中で esbuild
を使っていて、compile, bundle, deploy まで全部やってくれる。尊い。
個人的には aws-cdk のテストは snapshot test を必ず入れるようにしている。
これがあると aws-cdk のアップデートも怖くない。尊い。
snapshot test があれば v2 へのアップデートも怖くない。尊い。
aws-cdk のアウトプット(CloudFormation テンプレート)は hash 値が使われている場合がある。(lambda や s3-deploy など)
このような場合では入力が一定になるようにテスト用のダミーファイルをインプットにする必要があるが、今回はなかなか hash を固定できなかったため、調べた。
Discussion