AWS Lambdaで動作するDockerイメージの構築方法
公開日
2025年1月15日
更新日
2025年5月10日
6
分で読める
AWS
この文章では、AWS Lambdaで動作するDockerイメージの構築方法を探討します。ここでは、マルチステージビルド技術を採用してイメージ体系を軽量化し、キャッシュを最大限利用して構築速度を向上させます。
マルチステージビルドとは何か?
マルチステージビルドはDockerが提供する構築方式の1つで、単一のDockerfileの中で複数の構築ステージを分離することで、結果的に更に精緻化された最終的なイメージを作成できます。各ステージは初めから開始できるし、前のステージの出力を基にすることも可能です。最終的には、本番環境に必要なファイルのみを実行ステージにコピーします。
この方式の利点は以下の通りです:
- イメージ体系の軽量化: 実行に必要なファイルのみを含むため、構築ツールや開発依存性を除外します。
- 安全性の向上: 不要なパッケージが本番環境に暴露されることを減らします。
- 構築効率の向上: Dockerのキャッシュを最大限利用して、依存性の再インストールを避けることが可能です。
Dockerfile
# 構築ステージ
FROM public.ecr.aws/docker/library/node:22.12.0-alpine AS builder
WORKDIR /app
# 依存性のインストール
COPY package*.json ./
RUN npm ci
# プロジェクトファイルのコピーと構築
COPY . .
RUN npm run build
###################################
# 抽出ステージ
FROM public.ecr.aws/docker/library/node:22.12.0-alpine AS extractor
WORKDIR /app
# 必要なファイルのみをコピー
COPY --from=builder /app/build ./build
COPY --from=builder /app/package.json ./package.json
COPY --from=builder /app/package-lock.json ./package-lock.json
# 本番環境の依存性のみをインストール
RUN npm ci --omit=dev
###################################
# 実行ステージ
FROM public.ecr.aws/docker/library/node:22.12.0-alpine
# Lambda Adapterの追加
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter
WORKDIR /var/task
# 実行に必要なファイルのみをコピー
COPY --from=extractor /app/node_modules ./node_modules
COPY --from=extractor /app/build ./build
COPY --from=extractor /app/package.json ./package.json
# ポートの暴露
EXPOSE 3000
# アプリの起動
CMD ["npm", "run", "start"]
ポイント解説
- 基礎イメージの選択
- 基礎イメージにnode:22.12.0-alpineを選択しています。これにより軽量化されたイメージを実現できます。
- 構築ステージ
- package.jsonやpackage-lock.jsonを分けてコピーすることでDockerキャッシュを最大限利用します。プロジェクトコードの更新でも依存性が変化されない場合、再インストールを回避できます。
RUN npm run buildで構築を完了し、buildフォルダのみを次のステージに伝達します。
- 抽出ステージ
--from=builderを使用して構築出力を抽出します。npm ci --omit=devで本番環境の依存性のみをインストールし、開発依存性を含まないようにします。
- 実行ステージ
- buildフォルダ、node_modules、およびpackage.jsonのみを保存し、構築ツールや開発ファイルを除外します。
- AWS Lambda Adapterを組み込むことで、Lambda環境との互換性を実現します。
- 最終イメージ
- マルチステージビルドにより、最終イメージは実行に必要な内容のみを含むため、イメージ体系が大幅に軽量化されます。
最後
最適化されたDockerfileは、マルチステージビルド、キャッシュメカニズム、および依存性の精緻化を駆使して、構築効率と実行性能を大幅に向上させました。この方式は、続く構築およびデプロイが必要な現代的なクラウドネイティブアプリに特に適しています。また、このDockerfileはAWS Lambda環境に特化されており、Lambda Adapterと組み合わせることで、アプリをLambda上で完全に動作させることができます。
マルチステージビルドを用いることで、開発環境と本番環境のイメージを軽量化し、不要なサイズを削減し、安全性を向上することが可能です。