Skip to content

Commit 9cb6eae

Browse files
committed
docs: document DSQL admin role as known limitation
All Lambdas (webapp, async-job, migrator) connect to DSQL using the admin role (dsql:DbConnectAdmin), granting DDL privileges that runtime components do not need. Add ADR-004 recording the decision to keep admin for v3.0.0: custom role separation requires GRANT management per table, circular CDK-to-migration dependency for IAM mapping, and adds complexity disproportionate to the risk (IAM temp tokens already scope access to the target cluster). Add a "DB role and privilege model" section to design.ja.md summarizing the two-tier model and linking to the ADR.
1 parent 6d5cc8a commit 9cb6eae

2 files changed

Lines changed: 55 additions & 0 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# ADR-004: DSQL admin ロールの維持
2+
3+
## ステータス
4+
5+
採択(v3.0.0)
6+
7+
## コンテキスト
8+
9+
Aurora DSQL は2種類のデータベースロールを提供する:
10+
11+
- **admin ロール**: IAM アクション `dsql:DbConnectAdmin` で接続。DDL + DML の全権限を持つ。クラスタ作成時に自動生成される唯一の組み込みロール
12+
- **カスタムロール**: IAM アクション `dsql:DbConnect` で接続。DML のみ。`admin``CREATE ROLE ... WITH LOGIN``AWS IAM GRANT <role> TO '<IAM ARN>'` → テーブルごとの `GRANT` で作成する
13+
14+
`@aws/aurora-dsql-node-postgres-connector` は接続時の `user` パラメータでトークン種別を決定する:
15+
16+
```js
17+
if (user === "admin") token = await signer.getDbConnectAdminAuthToken();
18+
else token = await signer.getDbConnectAuthToken();
19+
```
20+
21+
現状、全 Lambda(webapp、async-job、migrator)が `user: 'admin'` + `dsql:DbConnectAdmin` で接続している。最小権限の原則に従えば、ランタイム(webapp、async-job)は DML のみのカスタムロールに分離すべきである。
22+
23+
## 決定
24+
25+
v3.0.0 では全 Lambda で `admin` ロールを維持する。
26+
27+
カスタムロールへの分離は以下の理由で見送る:
28+
29+
1. **GRANT 管理の複雑さ**: テーブル追加のたびにマイグレーションで `GRANT SELECT, INSERT, UPDATE, DELETE ON <table> TO <role>` が必要。`ALTER DEFAULT PRIVILEGES` の DSQL 対応状況が未確認で、対応していない場合は全マイグレーションに手動で GRANT 文を追加する運用になる
30+
2. **CDK → マイグレーション間の循環的依存**: カスタムロールの `AWS IAM GRANT` には Lambda 実行ロールの ARN が必要。CDK でロールを作成 → マイグレーションで IAM マッピング → という順序依存が生じ、初回デプロイのブートストラップが複雑になる
31+
3. **リスクの限定性**: 認証は IAM 一時トークン(15分有効期限、自動リフレッシュ)で保護されている。Lambda 実行ロールの IAM ポリシーは対象クラスタの ARN にスコープされており、他のクラスタへのアクセスは不可。admin ロールによる追加リスクは「Lambda 内のコードが意図しない DDL を実行する可能性」に限定される
32+
33+
### 却下した代替案
34+
35+
- _カスタムロール分離_: 上記1–2の複雑さがスターターキットの「コピーして育てる」コンセプトに見合わない。本番プロダクトに育てる段階で導入を検討すべき
36+
- _migrator のみ admin、ランタイムはカスタムロール_: 部分的な分離でも GRANT 管理と IAM マッピングの複雑さは同じ
37+
38+
## 結果
39+
40+
- webapp と async-job の Lambda は DDL 実行権限を持つ。アプリケーションコードのバグにより意図しないスキーマ変更が実行されるリスクがある
41+
- 本番ワークロードでは [DSQL のカスタムデータベースロール](https://docs.aws.amazon.com/aurora-dsql/latest/userguide/using-database-and-iam-roles.html) を使用した最小権限への移行を推奨する
42+
- CDK の `Database.grantConnect()` メソッドは将来の分離に備えて `grantConnect`(DML)/ `grantConnectAdmin`(DDL)への分割が可能な設計になっている

.serverless-full-stack-webapp-starter-kit/docs/v3.0.0/design.ja.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ v3 では DB エンジン(Aurora Serverless v2 → Aurora DSQL)、ORM(Pris
99
- [ADR-001: Aurora DSQL + Drizzle ORM + カスタムマイグレーションランナー](adr-001-dsql-drizzle-migrator.ja.md)
1010
- [ADR-002: pnpm workspaces モノレポ](adr-002-pnpm-workspaces.ja.md)
1111
- [ADR-003: oxlint + oxfmt](adr-003-oxlint-oxfmt.ja.md)
12+
- [ADR-004: DSQL admin ロールの維持](adr-004-dsql-admin-role.ja.md)
1213

1314
## ターゲットアーキテクチャ
1415

@@ -46,6 +47,18 @@ DSQL は IAM 認証でのみ接続を受け付ける。`@aws/aurora-dsql-node-po
4647

4748
`@aws/aurora-dsql-postgres-js-connector`(Postgres.js 用)も存在するが、Drizzle の node-postgres ドライバとの組み合わせで `AuroraDSQLPool` を使う方がシンプル。
4849

50+
### DB ロールと権限モデル
51+
52+
DSQL は PostgreSQL のロールシステムを IAM と統合した2層の権限モデルを持つ:
53+
54+
- **admin ロール**`dsql:DbConnectAdmin`): DDL + DML。クラスタ作成時に自動生成される唯一の組み込みロール
55+
- **カスタムロール**`dsql:DbConnect`): DML のみ。`admin` で接続して `CREATE ROLE ... WITH LOGIN` + `AWS IAM GRANT` で作成し、テーブルごとに `GRANT` で権限を付与する
56+
57+
本キットでは全 Lambda(webapp、async-job、migrator)が `admin` ロールで接続する。最小権限の観点では webapp と async-job は DML のみで十分だが、以下の理由で `admin` を維持する判断をした。詳細は [ADR-004](adr-004-dsql-admin-role.ja.md) を参照。
58+
59+
- カスタムロールの導入にはマイグレーション時の `GRANT` 管理、Lambda 実行ロール ARN の CDK → マイグレーション間の受け渡し、`DEFAULT PRIVILEGES` の DSQL 対応状況の確認が必要で、スターターキットとしての複雑さに見合わない
60+
- 認証自体は IAM 一時トークンで保護されており、Lambda 実行ロールは対象クラスタにスコープされている
61+
4962
### DDL 制約
5063

5164
出典: https://docs.aws.amazon.com/aurora-dsql/latest/userguide/ (2026-03-21 確認)

0 commit comments

Comments
 (0)