AWS Organizations Terraform運用設計書
用語補足:
- マネジメントアカウント: AWS Organizationsを作成したアカウント(awscloud.jp43: 703480710002)
- fd-security-tooling: セキュリティサービスの委任管理者アカウント(860801568046)
- fd-log-archive: 監査ログ集約専用アカウント(385800115893)
1. 方針
Terraform管理の範囲
| 対象 | Terraform管理 | 管理場所 | 理由 |
|---|---|---|---|
| SCP | する | fd-security-tooling | 変更が継続的に発生。コードレビューが必要 |
| 組織トレイル | する | fd-security-tooling | 恒久的な設定 |
| Log Archive S3バケット | する | fd-log-archive | ライフサイクル等の設定が複雑 |
| セキュリティサービス組織設定 | する | fd-security-tooling | GuardDuty/Security Hub等の組織統合設定 |
| OU作成 / アカウント作成 | しない | マネジメントアカウント(手動) | 1回限りの操作 |
| Trusted Access / Delegated Admin | しない | マネジメントアカウント(手動) | 1回限りの操作。委任できない |
Terraformバージョン
新規アカウント(fd-security-tooling / fd-log-archive)は最新バージョンを使用する。
既存アカウント(1.4.5)とは独立しているため、バージョンを合わせる必要はない。認証方式
fd-security-toolingアカウントでTerraformを実行する。
マネジメントアカウントにはTerraform用の認証を入れない。
マネジメントアカウントでTerraform運用しない理由(セキュリティ観点):
・SCPが効かない唯一のアカウントであり、ガードレールで制限できない
・Terraform実行用のIAMロールを作ると、そのロールは制限なしで全操作が可能になる
・Organization全体の管理権限(SCP変更・削除、アカウント削除等)に直結する
・認証の入口を増やすほど攻撃面が広がる
・terraform destroyの事故でSCPやOUが消えた場合、全アカウントのガードレールが消失する
fd-security-toolingで実行するメリット:
・SCPが効くため、IAMロールの権限が広くてもSCPで最後の防御ができる(多層防御)
・SCP管理はResource-based delegation policyで委任可能
・マネジメントアカウントへの認証が不要になり、攻撃面が増えない
SCP管理の流れ:
fd-security-tooling で terraform apply
→ delegation policy により
→ マネジメントアカウントのOrganizationに対してSCPを作成・適用
※ delegation policyの初回作成はマネジメントアカウントで手動実施
※ 現時点ではSCP管理のみ委任。将来必要に応じてRCP/Tag Policy等を追加実行方式
ローカル実行を基本とする。GitHub Actionsは使用しない。
理由:
・セキュリティ周りの設定はクリティカルであり、GitHub Actionsは攻撃面になりうる
・SCP/セキュリティサービスの設定変更は頻繁に発生しない
・ローカルに閉じることで攻撃面を最小化する
・SREのみが操作権限を持つため、手動実行で十分
実行フロー:
1. ローカルでコード変更 → PRオープン
2. コードレビュー(PR上でdiffを確認)
3. ローカルで terraform plan を実行して差分確認
4. PRマージ
5. ローカルで terraform apply を実行
将来の自動化:
・頻度が上がった場合、AWSに閉じたパイプライン(CodePipeline + CodeBuild)を検討
→ 認証がAWS内で完結し、外部からの攻撃面がない(最も安全な方式)
→ ただし構築コストが高いため、変更頻度に見合うかで判断する
・GitHub Actionsはセキュリティ設定の管理には使用しない方針を維持
→ ワークロード管理(既存環境)では実績があり問題ないが、
SCP等のOrganization設定はクリティカルなため外部パイプラインに依存しない秘匿情報の管理
既存運用と同じ方式:
・機密情報はterraform.tfvarsに記載
・S3バケット(fd-tfvars-xxx)に保存
・download-tfvar.sh / upload-tfvar.sh で取得・更新2. ディレクトリ構成
terraform_for_aws/
├── fastdoctor-template/ ← 既存(ワークロード管理)
│ ├── common/
│ │ ├── production/
│ │ ├── staging/
│ │ ├── ...
│ │ ├── security-tooling/ ← 新規(fd-security-toolingアカウント)
│ │ │ ├── backend.tf
│ │ │ ├── provider.tf
│ │ │ ├── main.tf ← アカウント内リソース(IAM, 組織トレイル, GuardDuty等)
│ │ │ ├── scp.tf ← SCP定義(delegation policy経由で適用)
│ │ │ ├── variable.tf
│ │ │ ├── download-tfvar.sh
│ │ │ └── upload-tfvar.sh
│ │ └── log-archive/ ← 新規(fd-log-archiveアカウント)
│ │ ├── backend.tf
│ │ ├── provider.tf
│ │ ├── main.tf ← S3バケット、バケットポリシー、ライフサイクル等
│ │ ├── variable.tf
│ │ ├── download-tfvar.sh
│ │ └── upload-tfvar.sh
│ └── services/ディレクトリの役割
| ディレクトリ | 実行アカウント | 内容 |
|---|---|---|
| fastdoctor-template/common/security-tooling/ | fd-security-tooling | アカウント内リソース + SCP管理(delegation policy経由) |
| fastdoctor-template/common/log-archive/ | fd-log-archive | S3バケット、バケットポリシー、ライフサイクル等 |
SCP管理について:
・SCPの適用先はOrganization(マネジメントアカウント)だが、
実行はfd-security-toolingからdelegation policy経由で行う
・認証先が同じアカウントなので、ディレクトリも同じsecurity-tooling/に統合コードオーナー
fastdoctor-template/common/security-tooling/ および
fastdoctor-template/common/log-archive/ のコードオーナーはSREのみとする。
CODEOWNERS:
/fastdoctor-template/common/security-tooling/ @fastdoctor-jp/sre
/fastdoctor-template/common/log-archive/ @fastdoctor-jp/sre3. tfstate管理
S3バケット
既存の命名規則に従う:
| アカウント | tfstateバケット | tfvarバケット |
|---|---|---|
| fd-security-tooling (860801568046) | fd-tfstate-security-tooling | fd-tfvars-security-tooling |
| fd-log-archive (385800115893) | fd-tfstate-log-archive | fd-tfvars-log-archive |
各アカウント内にS3バケットを作成(手動、初回のみ):
・バージョニング: 有効
・暗号化: SSE-S3
・パブリックアクセス: 完全ブロック
※ DynamoDB Lock は既存環境で使用していないため、合わせて使用しないstateの分離
| state | 保存先 | 内容 |
|---|---|---|
| common.tfstate | fd-tfstate-security-tooling | fd-security-toolingのアカウント内リソース + SCP定義 |
| common.tfstate | fd-tfstate-log-archive | fd-log-archiveのアカウント内リソース |
4. IAMロール設計
fd-security-tooling (860801568046)
| ロール | 認証元 | 権限 | 用途 |
|---|---|---|---|
| read-only-role | 踏み台アカウント(770217130318)からAssumeRole | ReadOnlyAccess | 参照用 |
| administrator-role | 踏み台アカウント(770217130318)からAssumeRole | AdministratorAccess + IAM操作制限 | 管理用・terraform apply用 |
terraform実行時の認証:
・ローカルからAssumeRole(MFA付き)でfd-security-toolingにアクセス
・administrator-roleでplan/applyを実行
・SCP管理はdelegation policy経由でOrganization APIを呼び出すfd-log-archive (385800115893)
| ロール | 認証元 | 権限 | 用途 |
|---|---|---|---|
| read-only-role | 踏み台アカウント(770217130318)からAssumeRole | ReadOnlyAccess | 参照用 |
| administrator-role | 踏み台アカウント(770217130318)からAssumeRole | AdministratorAccess + IAM操作制限 | 管理用・terraform apply用 |
5. 初期構築タスク
マネジメントアカウント(最初に実施)
【手動(コンソール or CLI)】
□ Resource-based delegation policy 作成
・SCP管理をfd-security-toolingに委任
□ fd-security-toolingからSCPの読み取り・作成が可能であることを確認fd-security-tooling アカウント
【手動(コンソール or CLI)】
□ tfstate S3バケット作成(fd-tfstate-security-tooling)
・バージョニング有効、暗号化SSE-S3、パブリックアクセスブロック
□ tfvar S3バケット作成(fd-tfvars-security-tooling)
・同上
□ IAMロール作成
・read-only-role(踏み台からAssumeRole、ReadOnlyAccess)
・administrator-role(踏み台からAssumeRole、AdministratorAccess + IAM制限)
□ CLIプロファイル追加(~/.aws/config)
□ AssumeRoleでアクセスできることを確認
【Terraformコード作成】
□ fastdoctor-template/common/security-tooling/ ディレクトリ作成
□ backend.tf(fd-tfstate-security-tooling)
□ provider.tf
□ variable.tf
□ download-tfvar.sh / upload-tfvar.sh
□ terraform init / plan が正常に動作することを確認
【import】
□ IAMロール(read-only-role, administrator-role)をterraform import
□ terraform plan で差分がないことを確認
□ 以降はTerraformで管理fd-log-archive アカウント
【手動(コンソール or CLI)】
□ tfstate S3バケット作成(fd-tfstate-log-archive)
□ tfvar S3バケット作成(fd-tfvars-log-archive)
□ IAMロール作成
・read-only-role(踏み台からAssumeRole、ReadOnlyAccess)
・administrator-role(踏み台からAssumeRole、AdministratorAccess + IAM制限)
□ CLIプロファイル追加(~/.aws/config)
□ AssumeRoleでアクセスできることを確認
【Terraformコード作成】
□ fastdoctor-template/common/log-archive/ ディレクトリ作成
□ backend.tf(fd-tfstate-log-archive)
□ provider.tf
□ variable.tf
□ download-tfvar.sh / upload-tfvar.sh
□ terraform init / plan が正常に動作することを確認
【import】
□ IAMロール(read-only-role, administrator-role)をterraform import
□ terraform plan で差分がないことを確認
□ 以降はTerraformで管理リポジトリ設定
□ CODEOWNERS ファイルにsecurity-tooling / log-archive のエントリを追加
□ Terraformバージョン指定(.terraform-version ファイル)動作確認
□ fd-security-toolingからterraform plan/applyが正常に実行できること
□ fd-log-archiveからterraform plan/applyが正常に実行できること
□ fd-security-toolingからSCPの作成・適用ができること(delegation policy経由)