Lambda Web Functions で Next.js をデプロイする完全ガイド【約5分で公開】

約15分で読めます by ぽんたぬき
Lambda Web Functions で Next.js をデプロイする完全ガイド【約5分で公開】

Lambda Web Functions で Next.js をデプロイする完全ガイド【約5分で公開】

2026年10月12日、AWS が Lambda Web Functions を正式リリースしました。従来の Lambda では Next.js を動かすために各種アダプターやカスタムハンドラーが必要でしたが、この新機能によってアダプター不要・1コマンドでデプロイできる時代がやってきました。

本記事では、Next.js アプリを Lambda Web Functions にデプロイし、CloudFront と WAF でセキュリティを固めるまでの全手順をステップバイステップで解説します。


Lambda Web Functions とは何か

従来の Event Functions との違い

これまでの Lambda(Event Functions)は、handler(event, context) という形式でイベント1件につき実行環境1つが起動する設計でした。Next.js をそのまま載せることはできず、サードパーティ製のアダプターを経由してリクエスト/レスポンスを変換する必要がありました。

Lambda Web Functions は根本的にアーキテクチャが異なります。Express・Hono・Fastify・Next.js などの標準的な HTTP サーバーをそのまま起動できる設計になっており、ローカル環境と本番環境で全く同じコードが動作します。

最大128同時処理の仕組み

Lambda Web Functions の大きな特徴のひとつが、1つの実行環境で最大128リクエストを同時処理できる点です(デフォルトは64)。

従来の Event Functions では1リクエスト = 1実行環境だったため、100並列リクエストが来れば100の実行環境が必要でした。Lambda Web Functions では少ない実行環境で多くのリクエストをさばけるため、コールドスタートの発生頻度が大幅に低減し、同時実行クォータの消費も抑えられます。

CPU / メモリ分離課金モデル

課金モデルも刷新されています。従来は「実行時間 × メモリ」で一律に課金されていましたが、Lambda Web Functions では以下のように分離されています。

  • CPU 使用時間:アプリがアクティブに処理している時間のみ
  • メモリ確保時間:実行環境が起動している時間

外部 API や DB の応答を待っている間は CPU 課金が発生しません。I/O 集約型のアプリケーション(BFF、ダッシュボード等)では、Event Functions と比較して約25%安価になるケースがあります。


完成構成のイメージ

本記事で構築する最終的なアーキテクチャは以下のとおりです。

ユーザー → CloudFront(エッジキャッシュ + WAF) → OAC署名 → Lambda Web Functions(Next.js)

このシンプルな構成で、HTTPS 公開・CDN キャッシュ・DDoS 保護・アプリ層攻撃対策のすべてを実現できます。

前提条件

  • Node.js 20 以上、AWS CLI 最新版がインストール済み
  • Next.js 14 以降のプロジェクトが手元にある
  • IAM 権限:Lambda・S3・CloudFront・WAF の操作権限

ステップ1:Next.js プロジェクトを standalone 構成にする

next.config.ts に output: "standalone" を追加

next.config.ts(または next.config.js)に以下の1行を追加します。

// next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
  output: "standalone",
};

module.exports = nextConfig;

output: "standalone" を指定すると、npm run build 実行時に .next/standalone ディレクトリが生成されます。このディレクトリには Next.js サーバーの起動に必要な最小限のファイルのみが含まれており、node_modules 全体をコピーすることなくデプロイできます。

エントリーポイント index.js を作成する

Lambda Web Functions は環境変数 AWS_LAMBDA_HTTP_ENDPOINT でリッスンすべきホストとポートを通知します。この情報を使って HTTP サーバーを起動するエントリーポイントを作成します。

// index.js(プロジェクトルートに配置)
const { createServer } = require("http");
const { parse } = require("url");
const next = require("next");

const app = next({ dev: false });
const handle = app.getRequestHandler();

const endpoint = process.env.AWS_LAMBDA_HTTP_ENDPOINT || "http://localhost:3000";
const url = new URL(endpoint);
const hostname = url.hostname;
const port = parseInt(url.port, 10) || 3000;

app.prepare().then(() => {
  createServer((req, res) => {
    const parsedUrl = parse(req.url, true);
    handle(req, res, parsedUrl);
  }).listen(port, hostname, () => {
    console.log(`> Ready on http://${hostname}:${port}`);
  });
});

よくあるミス:ポートを 3000 などにハードコードしてしまうと、Lambda Web Functions が指定したポートと食い違い、起動直後に 502 エラーが発生します。必ず AWS_LAMBDA_HTTP_ENDPOINT から動的に取得してください。

ビルドと必要ファイルのコピー

# Next.js をビルドする
npm run build

# 静的ファイルを standalone ディレクトリにコピーする
cp -r public .next/standalone/
cp -r .next/static .next/standalone/.next/
cp index.js .next/standalone/

public と .next/static のコピーを忘れると、CSS・画像・フォントなどのすべての静的ファイルが 404 になります。standalone ビルドにはこれらが含まれていないため、手動でコピーする必要があります。


ステップ2:1コマンドでデプロイする

aws lambda-web deploy を実行

準備が整ったら、以下の1コマンドを実行します。

aws lambda-web deploy \
  --name my-next-app \
  --code .next/standalone \
  --region ap-northeast-1

約30秒で以下のリソースが自動的に作成されます。

  • Lambda 実行環境(IAM ロール付き)
  • コードを格納する S3 バケット
  • HTTPS エンドポイント

コマンド完了後、ターミナルに以下のような出力が表示されます。

✓ Deployed successfully
Endpoint: https://xxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/

動作確認

# curl で疎通確認
curl -I https://xxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/

HTTP/2 200 が返ってくれば成功です。ブラウザでアクセスしてページが表示されることも確認しておきましょう。

502 が返る場合は、エントリーポイントのポートハードコードを疑ってください。静的ファイルが 404 になる場合は、public と .next/static のコピーが正しくできているかを確認します。詳細なログは CloudWatch Logs(ロググループ名:/aws/lambda/my-next-app)で確認できます。


ステップ3:CloudFront + WAF でセキュリティを固める

なぜ直接公開してはいけないのか

ステップ2で払い出されたエンドポイントをそのまま本番公開することは推奨しません。理由は2つあります。

  1. セキュリティリスク:DDoS やアプリ層攻撃(SQLi・XSS)が Lambda に直撃する
  2. コスト・パフォーマンスの損失:静的アセットのキャッシュが効かず、エッジでのTLS終端による低レイテンシーの恩恵も受けられない

CloudFront ディストリビューションを作成する

AWS マネジメントコンソールまたは CLI で CloudFront ディストリビューションを作成し、先ほどの Lambda Web Functions エンドポイントをオリジンに設定します。

キャッシュポリシーは用途に応じて使い分けます。

リクエストの種類 キャッシュポリシー
/_next/static/** などの静的アセット 長期キャッシュ(TTL: 31536000秒)
SSR ページ・API ルート キャッシュバイパス(Cache-Control: no-store)

OAC で直接アクセスを遮断する

Origin Access Control(OAC) を設定すると、CloudFront からのリクエストにのみ署名が付与され、Lambda のエンドポイントへの直接アクセスは 403 で弾かれるようになります。

設定後、以下のコマンドで直接アクセスが遮断されていることを確認します。

# 直接アクセス → 403 が返ることを確認
curl -I https://xxxxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/

# CloudFront 経由 → 200 が返ることを確認
curl -I https://your-distribution.cloudfront.net/

AWS WAF を適用する

CloudFront ディストリビューションに AWS WAF を関連付けることで、アプリケーション層の攻撃を防御できます。実際の開発現場では、以下の順序で有効化するのがベストプラクティスです。

① マネージドルールを追加する

AWSManagedRulesCommonRuleSet     # SQLi・XSS・既知の攻撃パターン
AWSManagedRulesKnownBadInputsRuleSet  # 既知の悪性入力
AWSManagedRulesAmazonIpReputationList # 悪性 IP アドレス

② レートベースルールでブルートフォース対策

同一 IP からのリクエスト数に上限を設けます(例:5分間で1,000リクエスト超で Block)。

③ Count モードで検証してから Block に切り替える

最初はすべてのルールを Count モード(カウントのみ・ブロックなし)で適用し、CloudWatch Logs で誤検知がないことを確認してから Block モードに切り替えるのが安全です。


コストとパフォーマンスの実測値

レスポンスタイム

条件 中央値
コールドスタート 0.8〜1.2秒
ウォームスタート 54〜156ms

同時処理数が最大128まで拡張されるため、コールドスタートの発生頻度は従来の Lambda と比べて大幅に低減します。

料金シミュレーション

月間リクエスト数 Lambda Web Functions Fargate(0.5vCPU + ALB)
10万 約 $0.8 約 $35.2
1,000万 約 $18.4 約 $35.2

Fargate と比較すると、低〜中トラフィックのアプリケーションでは半額以下になるケースがあります。ただし、CPU を長時間占有する重い処理(画像変換・機械学習推論等)が多いアプリケーションでは、CPU 時間の課金が積み上がる可能性があるため注意が必要です。


よくある疑問(FAQ)

Q:既存の Next.js アプリをそのまま移行できますか? A:output: "standalone" の追加と、エントリーポイント index.js の作成のみで対応できます。アプリケーションコード自体の変更は不要です。

Q:API Gateway は不要ですか? A:不要です。HTTPS エンドポイントはデプロイ時に自動生成されます。

Q:Cognito などの認証は使えますか? A:Cognito は使えますが、トークン検証ロジックはアプリケーション側(ミドルウェア等)で実装する必要があります。Lambda Web Functions はリクエストをそのまま渡すだけです。

Q:ISR・画像最適化・Server Actions は動きますか? A:いずれも動作します。Next.js の機能はアダプターによる制約がなくなったため、ローカルで動くものは原則としてそのまま動作します。

Q:App Runner の代替になりますか? A:軽量 Web アプリの用途では十分な代替になります。2026年4月に App Runner が新規登録を停止したことから、Lambda Web Functions は事実上の後継ポジションとして注目されています。


まとめ

本記事で行ったことを振り返ります。

  • output: "standalone" で Next.js をスタンドアロン構成にビルド
  • AWS_LAMBDA_HTTP_ENDPOINT を使ったエントリーポイントを作成
  • aws lambda-web deploy の1コマンドでデプロイ完了
  • CloudFront をオリジンとして設定し、キャッシュポリシーを構成
  • OAC で Lambda エンドポイントへの直接アクセスを遮断
  • AWS WAF でアプリケーション層の攻撃を防御

Lambda Web Functions は「アダプター不要」「1コマンドデプロイ」「分離課金」という三拍子が揃った、Next.js の新しいホスティング先として非常に有力な選択肢です。段階的に理解を深めていきましょう。

次に試したいこと

  • CI/CD の自動化:GitHub Actions から aws lambda-web deploy を呼び出すワークフローを設定する
  • 独自ドメインの設定:CloudFront に ACM 証明書を紐付けてカスタムドメインを適用する
  • 可観測性の強化:CloudWatch メトリクスダッシュボードの構築と X-Ray によるトレーシングの有効化

ホスティング選定の指針

サービス 向いているケース
Lambda Web Functions I/O集約型・低〜中トラフィック・コスト重視
Vercel / Amplify フロントエンド中心・開発速度重視
Fargate 高トラフィック・長時間処理・コンテナ単位の管理が必要

関連記事

OpenMontage で無料AI動画は作れるか?Piper TTS × FFmpeg でゼロコスト検証した全記録

OpenMontage で無料AI動画は作れるか?Piper TTS × FFmpeg でゼロコスト検証した全記録

OpenMontage で無料AI動画は作れるか?Piper TTS × FFmpeg でゼロコスト検証した全記録 --- 導入:有料API課金ゼロで、AI動画はどこまで作れるのか 2026年、AI動画制作ツールの月額課金は当たり前になりました。Runway、Kling、Soraといったサービスは月数千円〜数万円のサブスクリプションを要求し、「ちょっと試したいだけ」というエンジニアにはハードルが高...

REAとは?AIエージェントでリバースエンジニアリングを自動化するMCPサーバーを徹底解説

REAとは?AIエージェントでリバースエンジニアリングを自動化するMCPサーバーを徹底解説

REAとは?AIエージェントでリバースエンジニアリングを自動化するMCPサーバーを徹底解説 「このアプリの検索機能、どう実装されているんだろう」「ソースコードが残っていないレガシーシステムの挙動を把握しなければならない」——こうした需要は、セキュリティエンジニアから一般の開発者まで幅広く存在します。しかし従来、リバースエンジニアリングにはGhidraやIDA Proといった専門ツールの習熟が必要で...

Claude Haiku 5.5徹底解説|コスト75%削減を実現したAnthropicの最軽量モデルの実力と使いどころ

Claude Haiku 5.5徹底解説|コスト75%削減を実現したAnthropicの最軽量モデルの実力と使いどころ

Claude Haiku 5.5徹底解説|コスト75%削減を実現したAnthropicの最軽量モデルの実力と使いどころ 「LLMを本番導入したら、APIコストが想定の3倍に膨らんだ」——こうした失敗談は、AI活用が進む現場で繰り返し耳にします。モデル選択を誤ると、精度だけでなくコスト構造そのものが崩壊します。 2026年10月7日、Anthropicが発表したClaude Haiku 5.5は、そ...

CapCut代替のOSS動画編集ツール「OpenCut」完全ガイド|Rustコア・プラグイン・AI統合で何が変わるのか

CapCut代替のOSS動画編集ツール「OpenCut」完全ガイド|Rustコア・プラグイン・AI統合で何が変わるのか

CapCut代替のOSS動画編集ツール「OpenCut」完全ガイド|Rustコア・プラグイン・AI統合で何が変わるのか 1. はじめに:なぜいま「CapCutの代わり」を探す人が増えているのか GitHubスター93,800超——OSS動画編集ツール史上最速クラスの成長 2025年6月、ある動画編集ツールのリポジトリがGitHubに公開されました。わずか1年余りで93,800以上のスターと9,20...

コメント

0/2000