Skip to content

docs(infra): 運用手順を private runbook へ移し README には境界だけ残す - #112

Merged
yook11 merged 2 commits into
mainfrom
docs/aws-readme-ops-boundary
Aug 4, 2026
Merged

docs(infra): 運用手順を private runbook へ移し README には境界だけ残す#112
yook11 merged 2 commits into
mainfrom
docs/aws-readme-ops-boundary

Conversation

@yook11

@yook11 yook11 commented Aug 4, 2026

Copy link
Copy Markdown
Owner

背景

CLAUDE.md の Public Repository Hygiene はこう定めている。

deploy / rollback / restore の具体手順は commit しない。
docs では設計意図と境界を説明し、運用者だけが使う詳細手順や復旧コマンドは公開しない。

しかし infra/aws/README.md の「DB 踏み台」「DB 初期構築」の 2 節は、コマンド列をそのまま持っていた。置き場である .claude/commands/private-production-runbook.md.gitignore に登録済みだったが未使用だったので、そちらへ移す。

本番へ z10 / z11 を適用する作業で、この 2 節の記述が実地とズレていることも判明したため、あわせて境界の説明として書き直す。

移したもの (private runbook 側)

踏み台の生成 / トンネル / 撤去、hosts の追加削除、alembic の実行 URL、db-provision.sql と Better Auth CLI の実行、instance-id / endpoint の取り方。

残したもの (境界と設計判断)

踏み台

  • 平常時は存在せず、素の apply が撤去を兼ねる。public IP も SSH ポートも ingress 規則も持たない
  • admin 専用なのは設計であって権限不足ではない。 role に permissions boundary を付けられず (boundary が ssmmessages:* を Deny)、boundary 無しの role 作成を terraform-applyDenyRoleCreationWithoutBoundary で拒否する。ssm:StartSession も持たない。CI 経路で通らないのは fail-closed が効いた結果で、穴を開けて通すものではない
  • トンネル越しに verify-full を保つ方法が client で違う。 libpq は host / hostaddr を分離できるが asyncpg / pg には無い。証明書の検証を落として解決しない — db_ssl.py は「検証なし TLS というモードを持たない」と宣言しており、手順書に抜け道を作るとその宣言が意味を失う

旧記述の「内側の TLS は require で足りる」は誤りだった。requiredb_ssl が verify-full に格上げするため CN 不一致で落ちる。逆に sslmode を省くと asyncpg 既定の prefer に落ち、検証なし TLS で繋がってしまう (rds.force_ssl=1 は満たすので気づけない)。

DB の構築と migration

  • schema の作成主体が Better Auth CLI と alembic に割れており、CLI が先でないと FK 作成で落ちる。統合テストは create_all で焼くため、この順序依存は migration 経路でしか現れない
  • app role は IAM 認証で password を持たない。password 認証を続けるのは migration owner だけで、その値はどこにも保存していない
  • contract は新コードの後、expand は先。判定は MIGRATION_KINDscripts/migration_gate.py
  • 初回構築の destructive gate は b1 の legacy テーブル削除が要求する

公開範囲

実 endpoint 名・アカウント ID・instance-id は README に含まない (grep で 0 件を確認)。private runbook 側は gitignored で、そこにも秘密の値そのもの (password / token) は書かず取り出し方だけを置いている。

経緯

先行して #111 を出していたが、あちらは運用手順を公開 README に厚く書き足す方向だったため取り下げた。

🤖 Generated with Claude Code

yook11 and others added 2 commits August 4, 2026 12:09
Public Repository Hygiene は「deploy / restore の具体手順は commit しない、
docs では設計意図と境界を説明する」と定めているが、踏み台と DB 初期構築の 2 節が
コマンド列をそのまま持っていた。置き場 (.claude/commands/private-production-runbook.md)
は .gitignore に登録済みで未使用だったので、そちらへ移す。

あわせて、今回の作業で判明した 2 点を境界の説明として書き直す。

- 踏み台が admin 専用なのは設計。role に boundary を付けられず (boundary が
  ssmmessages:* を Deny)、boundary 無しの role 作成を terraform-apply が拒否する。
  CI 経路で通らないのは fail-closed が効いた結果で、穴を開けて通すものではない。
- トンネル越しに verify-full を保つ方法が client で違う。libpq は host/hostaddr を
  分離できるが asyncpg / pg には無い。検証を落として解決しない (db_ssl は
  「検証なし TLS を持たない」と宣言しており、手順書に抜け道を作ると宣言が
  意味を失う)。旧記述の「内側の TLS は require で足りる」は誤り。

DB 初期構築節は手順を落とし、順序を決めている制約 (schema 作成主体が
Better Auth CLI と alembic に割れている / 統合テストは create_all なので
この順序依存が現れない) を残す。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
「DB 初期構築」節は README から private runbook へ移したため、コメントの参照が
存在しない節を指していた。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@yook11
yook11 merged commit 4115a9d into main Aug 4, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant