Lambda関数のdocker依存周りを調べた
運用中のシステムにおけるLambda関数のビルド周りについてちゃんと理解できてなかったのでメモ。
前提
- Lambdaのruntimeは Node.js、言語はTypeScript
- Lambdaのリソース作成、デプロイにCDKを使用
- aws-cdk-lib.aws_lambda_nodejsを使ってLambdaリソースを定義
疑問に思ったこと
ローカルで cdk synth
や cdk deploy
でビルドが走ったとき、ローカルのDockerが起動していないとエラーになるというもの。
なぜここに依存しているのかがよくわかっていなかった。
なぜDockerの起動状態に依存するか
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