メインコンテンツまでスキップ

Lambda Web Adapter を利用したコンテナイメージ作成

AWS Lambda にデプロイするためのコンテナイメージ作成方法を説明したドキュメントです。

Lambda Web Adapter が利用できるランタイム方式

Node.js など通常の Lambda ランタイムで利用する方法(この場合、Lambda Layer に LWA を設定)もありますが、本カタログでは設定のしやすさからコンテナイメージ(Docker)を利用する方法を取っています。

Dockerfile の内容

Dockerfile は以下のように構成します。各記述に関する詳細はインラインコメントをご参考ください。

FROM public.ecr.aws/lambda/nodejs:22 as builder

WORKDIR "/var/task"

ADD . .

# React Router v7 はビルド結果に node_modules を含めないため、--omit=dev 指定で npm install を実行しておきます。
RUN npm install \
&& npm run build \
&& cp package.json .dist/server/ \
&& cp package-lock.json .dist/server/ \
&& cd .dist/server/ \
&& npm install --omit=dev

# AWS public ECR に登録されている公式イメージの利用を推奨
FROM public.ecr.aws/lambda/nodejs:22

# Lambda Web Adapter
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.9.1 /lambda-adapter /opt/extensions/lambda-adapter

# React Router v7 は、ビルドすると .dist/server と .dist/client が分かれて生成されます。
# .dist/server の内容はコンテナに入れて AWS Lambda にデプロイし、
# .dist/client の内容もそのままコンテナに入れるか、別途 S3 に保存して CloudFront から振り分けることでキャッシュ戦略のカスタマイズや最適化を行うことが可能です。

# Server side assets
COPY --from=builder /var/task/.dist/server/index.js /var/task/index.js
COPY --from=builder /var/task/.dist/server/assets /var/task/assets
COPY --from=builder /var/task/.dist/server/node_modules /var/task/node_modules
COPY --from=builder /var/task/.dist/server/package.json /var/task/package.json

# Client side assets
COPY --from=builder /var/task/.dist/client/ /var/task/public/

# Next.js やその他のウェブアプリケーションは、それぞれ静的ファイルに対するアプローチや設定が異なるため、
# フレームワーク独自のカスタムヘッダーなど、
# 構成上問題が起きないように設定などをカスタマイズする必要が出てくる場合があります。
# Dockerfile で対応するか、CloudFront や Lambda@Edge で対応するかといった設計の検討と確認を行ってください。

# React Router v7 はその構成のシンプルさ、可能な限り Web Standards に合わせるという方針によって
# Lambda Web Adapter を利用するフロントエンドアプリケーションとして、親和性・相性に優れています。

WORKDIR "/var/task"

ENV NODE_ENV=production
ENV PORT=3000

CMD ["npm", "run", "start"]

参考資料

Lambda Web Adapter を利用した Dockerfile 作成の詳細についてもっと知りたい方は、以下の公式 GitHub のドキュメントをご参考ください。