CDKのプロジェクトを作成して、その中にNext.jsのプロジェクトを作成します。 cdk用ディレクトリ next-cdk の中に、Next.jsのプロジェクトディレクトリ next-app が存在する構成です。

next-cdk --  (CDK用プロジェクトディレクトリ)
          |- package.json (CDK用)
          |- tsconfig.json (CDK用)
          |- .... (CDK用)
          |
          |- next-app --  (Next.js用プロジェクトディレクトリ)
                       |- package.json (Next.js用)
                       |- tsconfig.json (Next.js用)
                       |- src --- app

Lambdaへのデプロイ方法については以下を参照

CDKのプロジェクト作成

CDKのプロジェクトを以下を参考に作成します。

例 プロジェクト名が "next-cdk" のとき、以下のようになります。

npm install -g aws-cdk
mkdir next-cdk
cd next-cdk
cdk init app --language=typescript
npm uninstall -g aws-cdk
これはaws-cdkをインストール後、プロジェクト用ディレクトリnext-cdkを作成しています。 その後、作成したディレクトに移動してCDKの初期化コマンドを実行しています。

package.json

CDK用package.json のscriptsには、いくつかコマンドが登録されていますが、cdkコマンド以外は必要ないので、以下のように削除しておきます。 特にビルドコマンドは、必要のないjsとd.tsファイルを作るので、削除した方が良いでしょう。

  "scripts": {
    "cdk": "cdk",
  },

tsconfig.json

Nxet.jsのプロジェクトをCDKプロジェクトの中に作成する場合、tsconfig.json は各プロジェクトごとに分けた方が便利です。 その場合、CDK用の tsconfig.json の exclude にNext.jsのディレクトリ名を追加します。

例 Next.js のディレクトリが next-app のときの tsconfig.json

{
    ...

  "exclude": [
    "node_modules",
    "cdk.out",
    "next-app"
  ]
}

Next.jsのプロジェクト作成

公式ドキュメントを参考に、CDKプロジェクトの中にNext.jsのプロジェクトを作成します。

CDKプロジェクトのディレクトリに入って、以下を実行します。

npx create-next-app@latest [プロジェクト名]

プロジェクト名を next-app とした場合、以下を実行します。

npx create-next-app@latest next-app

実行すると、以下のようにいくつか質問があるので、Yes か No を選択します。

✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like to use `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to customize the default import alias (@/*)? … No / Yes

すると、CDKプロジェクトディレクトリの中に、Next.jsのプロジェクトディレクトリ next-app が作成されます。

drwxr-xr-x   8 mikan mikan   4096 Aug 16 00:38 .
drwxr-xr-x   5 mikan mikan   4096 Aug 16 00:03 ..
drwxr-xr-x   8 mikan mikan   4096 Aug 16 00:24 .git
-rw-r--r--   1 mikan mikan     93 Aug 16 00:04 .gitignore
-rw-r--r--   1 mikan mikan     65 Aug 16 00:04 .npmignore
-rw-r--r--   1 mikan mikan    745 Aug 16 01:06 Dockerfile
-rw-r--r--   1 mikan mikan    536 Aug 16 00:04 README.md
drwxr-xr-x   2 mikan mikan   4096 Aug 16 00:04 bin
-rw-r--r--   1 mikan mikan   3421 Aug 16 00:04 cdk.json
-rw-r--r--   1 mikan mikan    157 Aug 16 00:04 jest.config.js
drwxr-xr-x   2 mikan mikan   4096 Aug 16 00:04 lib
drwxr-xr-x   6 mikan mikan   4096 Aug 16 00:21 next-app
drwxr-xr-x 223 mikan mikan  12288 Aug 16 00:04 node_modules
-rw-r--r--   1 mikan mikan 159526 Aug 16 00:04 package-lock.json
-rw-r--r--   1 mikan mikan    533 Aug 16 00:04 package.json
drwxr-xr-x   2 mikan mikan   4096 Aug 16 00:04 test
-rw-r--r--   1 mikan mikan    663 Aug 16 00:04 tsconfig.json

CDKを使ってNext.jsをLambdaにデプロイする方法については以下を参照

Standaloneモード

Next.jsは、本番環境で必要となるファイルのみをまとめて出力する Standaloneモードがあります。 この設定を行うとビルド成果物のサイズを大幅に削減できます。

Standaloneモードにする場合、next.config.mjsを以下のように修正します。

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

export default nextConfig;

設定後、Next.jsのディレクトリでビルドコマンドを実行するとStandaloneモードのアプリが作成されています。

npm run build

ビルドが成功すると.nextディレクトリにファイルが作成されます。

$ ls -al .next/
total 232
drwxr-xr-x 7 mikan mikan   4096 Aug 17 12:30 .
drwxr-xr-x 6 mikan mikan   4096 Aug 16 21:50 ..
-rw-r--r-- 1 mikan mikan     21 Aug 17 12:29 BUILD_ID
-rw-r--r-- 1 mikan mikan   1196 Aug 17 12:29 app-build-manifest.json
-rw-r--r-- 1 mikan mikan    107 Aug 17 12:29 app-path-routes-manifest.json
-rw-r--r-- 1 mikan mikan    967 Aug 17 12:29 build-manifest.json
drwxr-xr-x 5 mikan mikan   4096 Aug 16 00:32 cache
-rw-r--r-- 1 mikan mikan     94 Aug 17 12:29 export-marker.json
-rw-r--r-- 1 mikan mikan    511 Aug 17 12:29 images-manifest.json
-rw-r--r-- 1 mikan mikan   7269 Aug 17 12:30 next-minimal-server.js.nft.json
-rw-r--r-- 1 mikan mikan 108375 Aug 17 12:30 next-server.js.nft.json
-rw-r--r-- 1 mikan mikan     20 Aug 17 12:29 package.json
-rw-r--r-- 1 mikan mikan   1314 Aug 17 12:29 prerender-manifest.js
-rw-r--r-- 1 mikan mikan   1187 Aug 17 12:29 prerender-manifest.json
-rw-r--r-- 1 mikan mikan      2 Aug 17 12:29 react-loadable-manifest.json
-rw-r--r-- 1 mikan mikan   4537 Aug 17 12:29 required-server-files.json
-rw-r--r-- 1 mikan mikan    922 Aug 17 12:29 routes-manifest.json
drwxr-xr-x 5 mikan mikan   4096 Aug 17 12:29 server
drwxr-xr-x 4 mikan mikan   4096 Aug 17 12:30 standalone
drwxr-xr-x 6 mikan mikan   4096 Aug 17 12:29 static
-rw-r--r-- 1 mikan mikan  34852 Aug 17 12:30 trace
drwxr-xr-x 3 mikan mikan   4096 Aug 17 12:29 types

Standaloneモードのアプリは以下になります。

.next/standalone/server.js
起動するときは以下を実行します。
node .next/standalone/server.js
起動後 http://127.0.0.1:3000/ にアクセスして正しく表示されたら成功です。