1
0

TypeScriptで書いたLambdaを、node_modulesを含めてデプロイする

Posted at

したいこと

  • 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のメンテナンスをどうしていることが多いのか気になりつつ 結論を出したのでメモ。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0