@@ -98,19 +98,45 @@ compose.yaml の PostgreSQL を廃止し、開発用 DSQL クラスタを使用
9898
9999## migration-runner の設計
100100
101+ ### 責務の分離
102+
103+ 3 つの責務を明確に分離する。各層は隣接する層だけに依存し、飛び越えた依存を持たない。
104+
105+ 1 . ** マイグレーションコアロジック** (` packages/db/src/migrate.ts ` , ` check-dsql-compat.ts ` )
106+ - ` pg.Pool ` を受け取り、SQL ファイルを 1 文ずつ BEGIN/COMMIT で実行する
107+ - drizzle-kit 出力の DSQL 自動変換(statement-breakpoint → 空行、INDEX → ASYNC、FK 除去)
108+ - CDK にも Drizzle にも依存しない。ORM に関わらず使える汎用層
109+ - 将来的に独立パッケージとして切り出し可能な境界
110+
111+ 2 . ** Lambda ハンドラー** (` apps/cdk/lib/constructs/dsql-migrator/handler.ts ` )
112+ - コアロジックの ` migrate() ` を呼ぶ薄いラッパー。Lambda イベントを受けて Pool を生成し、結果を返すだけ
113+ - CDK Construct と 1:1 で対応するが、ロジックは持たない
114+
115+ 3 . ** CDK Construct** (` apps/cdk/lib/constructs/dsql-migrator/index.ts ` )
116+ - DockerImageFunction + CDK Trigger でデプロイ時自動実行を構成する
117+ - Database Construct から endpoint と IAM 権限を受け取る
118+ - マイグレーションの中身には関与しない
119+
120+ この分離により:
121+ - コアロジックは Drizzle 以外の ORM(Prisma、手書き SQL)でも利用可能
122+ - Lambda ハンドラーは CDK 以外のデプロイツール(Terraform、SAM)でも利用可能
123+ - CDK Construct はマイグレーション SQL の生成方法に依存しない
124+
101125### 配置
102126
103127` packages/db ` にコアロジック・CLI・マイグレーション SQL を同居させる。スキーマ定義とマイグレーションが同一パッケージに閉じ、` pnpm --filter @repo/db run migrate ` でローカル実行可能。
104128
105129```
106130packages/db/
107131 src/
108- schema.ts # Drizzle スキーマ定義
109- client.ts # DSQL クライアント(IAM 認証)
110- migrate.ts # マイグレーションコアロジック(Pool を受け取る、環境非依存)
111- cli.ts # CLI エントリポイント(cli.ts → migrate.ts)
112- migrations/ # SQL ファイル
113- package.json # scripts: { "migrate": "tsx src/cli.ts" }
132+ schema.ts # Drizzle スキーマ定義
133+ client.ts # DSQL クライアント(IAM 認証)
134+ migrate.ts # マイグレーションコアロジック(Pool を受け取る、環境非依存)
135+ check-dsql-compat.ts # drizzle-kit 出力の DSQL 自動変換 + バリデーション
136+ cli.ts # CLI エントリポイント(cli.ts → migrate.ts)
137+ drizzle.config.ts # drizzle-kit 設定(generate 用、DB 接続不要)
138+ migrations/ # SQL ファイル + meta/ (drizzle-kit snapshot)
139+ package.json # scripts: { "generate": "...", "migrate": "..." }
114140```
115141
116142CDK 側は ` apps/cdk/lib/constructs/dsql-migrator/ ` に Lambda ハンドラー(handler.ts)と Construct を配置。handler.ts は ` @repo/db ` の migrate() を import する薄いラッパー。現行の ` event-bus/handler.mjs ` と同じパターン。将来的に独立 Construct として切り出す余地を残す。
0 commit comments