したいこと
- TypeScriptで書いたLambdaをnode_modulesを含めてDeployしたい
- 長期使用する前提で、メンテナンスの手数やメンテ時のオペミスリスクを減らしておきたい
- CodeBuildを使用してCI/CDする前提
結論
- Build後 dist/内に node_modules を配置した上でzipにして、Deployする形式を採用
処理の流れ
事前準備
- Lambdaの容量制限を気にして node_modulesの容量を削減するため、処理に必要なモジュール以外は
npm install -D
で devDependencies として入れる- 処理に必要な内、例外的にaws-sdkは LambdaのNode.jsランタイム内に含まれているので devDependencies 側としてinstallする
CodeBuildの処理
-
npm ci
で devDependencies込みでnode_modulesを入れる - Testの実行
- TypeScriptをBuild
- (Build環境のtmp内の容量節約が必要な際は ここで一度
rm -rf ./node_modules
) -
cp package.json package-lock.json ./dist/{foo}
する- (dist以下の階層は実態に合わせ適宜調整)
-
cd ./dist/{foo} && npm ci --omit=dev
で、dist内にdevDependenciesを除くnode_modulesを入れる -
zip -r ${LAMBDA_NAME}.zip .
でZIP化- (zipのファイル名とLambda名が異なると正しくDeployできないため注意)
-
aws lambda update-function-code --function-name ${LAMBDA_NAME} --zip-file fileb://${LAMBDA_NAME}.zip --publish
でLambdaに反映
経緯
- LambdaLayerでも実現できるが、先々メンテナンスの際にLambdaLayerの方もメンテの必要が出る
- また、雑にやるとLambda側のバージョン指定とLambdaLayerのバージョン間で齟齬が発生するリスクがある
- CodeBuildなどで LambdaとLambdaLayerを同時に更新するようにするなどの方法はあるが、手数的にはnode_modulesごと反映してしまうほうが楽だろうと判断
実際Lambda Layerのメンテナンスをどうしていることが多いのか気になりつつ 結論を出したのでメモ。