generated from amazon-archives/__template_MIT-0
-
Notifications
You must be signed in to change notification settings - Fork 38
Open
Labels
enhancementNew feature or requestNew feature or request
Milestone
Description
概要
リポジトリ全体を 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:*" } }Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request