🚀

Lambda関数のdocker依存周りを調べた

に公開

運用中のシステムにおけるLambda関数のビルド周りについてちゃんと理解できてなかったのでメモ。

前提

  • Lambdaのruntimeは Node.js、言語はTypeScript
  • Lambdaのリソース作成、デプロイにCDKを使用
  • aws-cdk-lib.aws_lambda_nodejsを使ってLambdaリソースを定義

疑問に思ったこと

ローカルで cdk synthcdk deploy でビルドが走ったとき、ローカルのDockerが起動していないとエラーになるというもの。
なぜここに依存しているのかがよくわかっていなかった。

なぜDockerの起動状態に依存するか

https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_lambda_nodejs-readme.html#local-bundling

If esbuild is available it will be used to bundle your code in your environment. Otherwise, bundling will happen in a Lambda compatible Docker container with the Docker platform based on the target architecture of the Lambda function.

esbuild が利用可能な場合はそれをつかってバンドルが行われるけど、そうでない場合はDockerコンテナ内で行われるとのこと。
なのでDockerに依存させたくないのであればesbuildをインストールしておけば良さそう。

For macOS the recommended approach is to install esbuild as Docker volume performance is really poor.

macOSの場合はesbuildをインストールすることを推奨している。

一方でDockerコンテナ内でのバンドルを強制させる場合は bundling.forceDockerBundling オプションを利用するとのこと。
ネイティブ依存を含むモジュールをインストールする場合は必要。
具体のケースとしては画像やPDF系などのOS依存のものがある場合など。

Discussion