概要
リポジトリ全体を pnpm workspaces によるモノレポ構成に再構築し、以下の構成に分離する。
+-- apps/
| +-- cdk/ # AWS CDK インフラ
| +-- webapp/ # Next.js アプリ
| +-- async-job/ # 非同期ジョブハンドラー
| `-- migration-runner/ # DB マイグレーション
`-- packages/
+-- db/ # Prisma スキーマ・クライアント
`-- shared-types/ # 共有型定義
v3ロードマップにて触れられている内容
背景・動機
現在、Next.js アプリと非同期ジョブハンドラーは単一の webapp/ パッケージに同居しているが、ビルド・デプロイは別々のアーティファクトとして行われている:
Dockerfile → Next.js Lambda(next build の standalone 出力)
job.Dockerfile → ジョブハンドラー Lambda + マイグレーション Lambda(esbuild で src/jobs/*.ts をバンドル)
これにより以下の問題が生じている:
- 依存関係の肥大化: ジョブハンドラーの Docker イメージビルド時に
npm ci で Next.js / React 等の不要な依存もすべてインストールされる
- 単一 package.json: デプロイターゲットごとに依存関係を独立管理できない
- migration Lambda の混在: DB マイグレーション用の
migration-runner.ts が job.Dockerfile で非同期ジョブと一緒にバンドルされている。migration runner は Prisma の db push を実行するだけのインフラ寄りの処理であり、ビジネスロジックである非同期ジョブとは責務が異なるが、同一イメージに同梱されている
提案する構成
apps/
| パッケージ |
内容 |
現在の場所 |
apps/cdk |
AWS CDK インフラコード |
cdk/ |
apps/webapp |
Next.js アプリ(UI + Server Actions) |
webapp/src/app/, components/, hooks/ |
apps/async-job |
非同期ジョブハンドラー |
webapp/src/jobs/async-job-runner.ts, async-job/ |
apps/migration-runner |
DB マイグレーション |
webapp/src/jobs/migration-runner.ts |
packages/
| パッケージ |
内容 |
現在の場所 |
packages/db |
Prisma スキーマ・クライアント・マイグレーションファイル・Zod 生成型 |
webapp/prisma/, webapp/src/lib/prisma.ts, webapp/src/lib/generated/ |
packages/shared-types |
ジョブペイロード型、共有ユーティリティ(events, auth 等) |
webapp/src/lib/ |
依存関係の方向
apps/webapp ──→ packages/shared-types ←── apps/async-job
│
packages/db
↑
apps/migration-runner
apps/cdk は他のパッケージに直接依存しない(Docker ビルドパスのみ参照)
packages/db: prisma、@prisma/client、zod に依存
packages/shared-types: packages/db、@aws-sdk/*(events/auth)に依存
apps/webapp: packages/shared-types、packages/db、react、next、aws-amplify、UI ライブラリに依存
apps/async-job: packages/shared-types、packages/db、@aws-sdk/client-translate に依存
apps/migration-runner: packages/db に依存
- アプリ同士は相互に依存しない
共有型の整理
現在 webapp/src/lib/jobs.ts が @/jobs/async-job-runner から JobPayloadProps をインポートしてジョブ呼び出しの型安全性を確保している。分離後は:
JobPayloadProps 型とペイロードスキーマを packages/shared-types に移動し、apps/webapp と apps/async-job の両方から参照可能にする
apps/webapp は Lambda 呼び出し時の型として使用、apps/async-job は受信イベントのバリデーションに使用
技術的アプローチ
pnpm Workspaces
pnpm-workspace.yaml でモノレポを定義:
packages:
- "apps/*"
- "packages/*"
内部依存は workspace:* プロトコルで解決:
// apps/webapp/package.json
{ "dependencies": { "@webapp/shared-types": "workspace:*", "@webapp/db": "workspace:*" } }
// apps/async-job/package.json
{ "dependencies": { "@webapp/shared-types": "workspace:*", "@webapp/db": "workspace:*" } }
// apps/migration-runner/package.json
{ "dependencies": { "@webapp/db": "workspace:*" } }
// packages/shared-types/package.json
{ "dependencies": { "@webapp/db": "workspace:*" } }
概要
リポジトリ全体を pnpm workspaces によるモノレポ構成に再構築し、以下の構成に分離する。
v3ロードマップにて触れられている内容
背景・動機
現在、Next.js アプリと非同期ジョブハンドラーは単一の
webapp/パッケージに同居しているが、ビルド・デプロイは別々のアーティファクトとして行われている:Dockerfile→ Next.js Lambda(next buildの standalone 出力)job.Dockerfile→ ジョブハンドラー Lambda + マイグレーション Lambda(esbuild でsrc/jobs/*.tsをバンドル)これにより以下の問題が生じている:
npm ciで Next.js / React 等の不要な依存もすべてインストールされるmigration-runner.tsがjob.Dockerfileで非同期ジョブと一緒にバンドルされている。migration runner は Prisma のdb pushを実行するだけのインフラ寄りの処理であり、ビジネスロジックである非同期ジョブとは責務が異なるが、同一イメージに同梱されている提案する構成
apps/
apps/cdkcdk/apps/webappwebapp/src/app/,components/,hooks/apps/async-jobwebapp/src/jobs/async-job-runner.ts,async-job/apps/migration-runnerwebapp/src/jobs/migration-runner.tspackages/
packages/dbwebapp/prisma/,webapp/src/lib/prisma.ts,webapp/src/lib/generated/packages/shared-typeswebapp/src/lib/依存関係の方向
packages/db:prisma、@prisma/client、zodに依存packages/shared-types:packages/db、@aws-sdk/*(events/auth)に依存apps/webapp:packages/shared-types、packages/db、react、next、aws-amplify、UI ライブラリに依存apps/async-job:packages/shared-types、packages/db、@aws-sdk/client-translateに依存apps/migration-runner:packages/dbに依存共有型の整理
現在
webapp/src/lib/jobs.tsが@/jobs/async-job-runnerからJobPayloadPropsをインポートしてジョブ呼び出しの型安全性を確保している。分離後は:JobPayloadProps型とペイロードスキーマをpackages/shared-typesに移動し、apps/webappとapps/async-jobの両方から参照可能にするapps/webappは Lambda 呼び出し時の型として使用、apps/async-jobは受信イベントのバリデーションに使用技術的アプローチ
pnpm Workspaces
pnpm-workspace.yamlでモノレポを定義:内部依存は
workspace:*プロトコルで解決: