AWS M&G Vol1|Organizations×Control Tower×Service Catalog

目次

なぜ Management & Governance Vol1 か — ガバナンス4層アーキテクチャ概観

Management & Governance本番運用シリーズ ナビゲーション

Vol1(ガバナンス基盤・本記事) — 統制する・標準化する・監査する
Organizations × Control Tower × Service Catalog × CloudTrail Lake

| 章 | テーマ | 主な施策 |
|—-|——–|———|
| §2 | AWS Organizations 本番運用 | OU階層設計・SCP継承・Delegated Administrator |
| §3 | AWS Control Tower 本番運用 | Landing Zone・Guardrails 3種・AFT自動化 |
| §4 | AWS Service Catalog 本番運用 | ポートフォリオ設計・製品バージョン管理・制約設計 |
| §5 | AWS CloudTrail Lake 本番運用 | イベントデータストア・クエリ最適化・組織トレイル |
| §6 | 詰まりポイント7選 | 頻出パターンの解決策 |
| §7 | アンチパターン演習(5問) | 落とし穴を体感する演習問題 |

読者対象

| 職種 | 活用シーン |
|——|———–|
| Cloud Architect | マルチアカウントガバナンスフレームワーク設計・OU/SCP体系の策定 |
| Platform Engineer | Landing Zone構築・アカウント自動プロビジョニングパイプラインの運用 |
| Security Engineer | SCP多層防御設計・CloudTrail Lake監査クエリの構築・コンプライアンス対応 |

前提知識(読む前に確認)

– IAM基礎(ロール・ポリシー・アクセスキー管理): 第1軸記事で習得済みを前提とします
– CloudTrail/Config基礎(ログ設計・ルール設定): 第18軸記事で習得済みを前提とします
– Terraform基礎: §3のAFT設計を深く読む場合に有用(必須ではありません)

ガバナンスなきマルチアカウントが招く混乱

AWSの利用が組織全体に拡大するにつれ、プロジェクト・チーム・環境ごとにアカウントを分割するマルチアカウント構成は今や標準アーキテクチャです。本番/ステージング/開発の分離、本番サービスごとの爆発半径(Blast Radius)の限定、コストの可視化——マルチアカウントはこれらを実現する最善の構造です。

しかし「とにかくアカウントを分けた」だけでは、次のような混乱に直面します。

  • 管理不能な増殖: フラットに配置された50アカウントはどのアカウントが何の目的で存在するか追跡不能になります
  • 権限の野放図な拡大: SCP未設定では開発者が誤って本番データを削除するコマンドを実行できてしまいます
  • 設定漏れによるリスク: 手動で作成したアカウントはCloudTrailが未設定・S3パブリックアクセスが許可された状態で稼働し続けることがあります
  • 標準化されないリソース展開: チームごとに異なる構成・ネーミング規則でリソースが作成され、コスト管理もセキュリティ監査も困難になります

これらは「気をつければ防げる」問題ではなく、仕組みとして構造的に防ぐ必要があります。AWS Management & Governanceサービス群が提供するのは、この「ガバナンスの仕組み」そのものです。

本記事では4つのコアサービス(Organizations・Control Tower・Service Catalog・CloudTrail Lake)が連携して形成するガバナンスフレームワークを、設計判断の根拠と実装コードも含めて体系的に解説します。個々のサービスドキュメントに分散した情報を「本番で使えるひとつの設計パターン」として統合することが、本記事の目的です。

ガバナンス4層アーキテクチャとは

AWSガバナンス基盤を4つの機能層として捉えると、各サービスの役割と依存関係が明確になります。

サービス主な役割カバーする範囲
第1層 — 統制するAWS OrganizationsOU階層・SCP・アカウント管理権限の上限設定・組織構造定義
第2層 — 自動化するAWS Control TowerLanding Zone・Guardrails・AFTセキュアなアカウントプロビジョニング
第3層 — 標準化するAWS Service Catalogポートフォリオ・製品・制約承認済みリソースのセルフサービス展開
第4層 — 監査するAWS CloudTrail Lakeイベントデータストア・SQL分析組織横断の操作ログ長期保持・分析

4層は独立したサービスの集合ではなく、下位層の上に上位層が成立する依存関係を持ちます。第1層(Organizations)でOU/SCP体系が整備されていなければ、第2層(Control Tower)のGuardrails適用対象が不明確になります。第2層でアカウントプロビジョニングが自動化されていなければ、第3層(Service Catalog)の製品展開先が統制されません。そしてすべての層での操作が第4層(CloudTrail Lake)によって監査されます。

ガバナンス基盤の強化は第1層から順に積み上げていくことが原則です。まずOrganizationsでOU構造とSCPを確立し、その上にControl TowerのLanding Zoneを構築します。

各サービスが担う機能

AWS Organizations — 権限統制の最強の防壁

OrganizationsはマルチアカウントAWS環境の管理基盤です。OU(Organizational Unit)と呼ばれる組織単位を階層的に設計し、SCP(Service Control Policy)をOU・アカウントに割り当てることで、アカウント内のポリシーがどれだけ強力でも超えることができない「権限の上限」を設定できます。

アカウントファクトリ(Account Factory)では、新規AWSアカウントの作成→適切なOUへの配置→初期設定の適用を標準化フローで実行でき、手動作業による設定漏れを構造的に排除します。

AWS Control Tower — 自動化されたLanding Zone

Control Towerは、OrganizationsのOU構造の上にセキュリティベースライン(Landing Zone)を自動構築するマネージドサービスです。Guardrails(ガードレール)として定義された予防的・検出的コントロールを3種類(Mandatory/Strongly Recommended/Elective)に分類し、全アカウントに自動適用します。

AFT(Account Factory for Terraform)を導入すると、アカウント申請→作成→OU配置→Guardrails適用→カスタムTerraform適用までをGitOpsフローで完全自動化できます。5アカウント以上の環境では手動運用は現実的でなく、AFT導入が標準解です。

AWS Service Catalog — 標準化リソースのセルフサービス

Service Catalogは、プラットフォームチームが承認・管理するCloudFormationテンプレートやTerraformモジュールを「製品(Product)」として登録し、エンドユーザー(開発チーム)がセルフサービスで安全に起動できる仕組みを提供します。ポートフォリオ(製品群)→製品(IaCテンプレート)→制約(Launch Constraint/Template Constraint)の3階層で、自由度と統制のバランスを保ちます。

AWS CloudTrail Lake — 組織横断の監査分析基盤

CloudTrail LakeはAWS全アカウントのAPI操作ログをマネージドなイベントデータストアに集約し、標準SQLで直接分析できるサービスです。従来のCloudTrail→S3→Athenaという分析パスと比較して、パーティション管理不要・組織横断クエリ対応・最大7年間のログ保持が大きなメリットです。「誰が・いつ・どのリソースに・何の操作をしたか」を秒単位で追跡できるガバナンス監査の中核を担います。

本記事を読み終えると達成できること

  • (a) OrganizationsでOU階層設計・SCP継承・Delegated Administratorを確立し、マルチアカウントの権限統制基盤を構築できる
  • (b) Control TowerでLanding Zone・Guardrails 3種・AFT自動化を実装し、セキュアなアカウント自動プロビジョニングパイプラインを構築できる
  • (c) Service Catalogでポートフォリオ→製品→制約の標準化パイプラインを設計し、承認済みリソースのセルフサービス提供を実現できる
  • (d) CloudTrail LakeでイベントデータストアのSQL分析・組織横断監査・コスト最適化を実装できる
  • (e) 詰まりポイント7選とアンチパターン演習5問で、本番ガバナンス設計の落とし穴を体感し、実務に直結する判断力を習得できる
Management & Governance Vol1 ガバナンス4層アーキテクチャ全体像
図1: Management & Governance Vol1 — Organizations・Control Tower・Service Catalog・CloudTrail Lakeのガバナンス4層アーキテクチャ

AWS Organizations 本番運用

マルチアカウント環境でのガバナンスを実現する上で、AWS Organizationsは第1層の基盤サービスです。OU(Organizational Unit)の設計とSCP(Service Control Policy)の継承構造を正しく設計することで、数十〜数百アカウントを一元的に統制できます。

OU階層設計 — Security・Infrastructure・Workloads・Sandboxの4本柱

OU設計の基本原則は機能別の第1軸・環境別の第2軸で階層を構成することです。AWSが推奨するOU構造は以下の4種類のOUを起点とします。

Security OU(セキュリティ専用)

セキュリティ監査・ログ集約に特化したアカウントを配置するOUです。このOUには必ず以下の2種類のアカウントを配置します。

  • Log Archive Account: 全アカウントのCloudTrail・Config・VPCフローログの集約先。書き込みは各アカウントのサービスのみに制限し、人間の直接アクセスは禁止します
  • Audit Account: セキュリティ審査・コンプライアンス確認を行うアカウント。読み取り専用アクセスで全アカウントの設定状態を確認できます

Security OUは「変更禁止」のSCPで保護します。Security OU配下のアカウントでのリソース変更は、指定された自動化パイプライン経由のみに制限することがベストプラクティスです。

Infrastructure OU(共有インフラ)

全アカウントが共用するネットワーク・共有サービスを管理するOUです。

  • Network Account: Transit Gateway・Direct Connect・VPN・共有VPCのハブアカウント
  • Shared Services Account: Active Directory連携・内部DNS・共有ツール類のアカウント

Transit Gatewayによるハブ&スポーク型のネットワーク構成において、Network Accountは中心的な役割を担います。複数のWorkloads OUアカウントからの通信はすべてNetwork Accountを経由させる設計が標準です。

Workloads OU(業務アプリケーション)

実際のビジネスアプリケーションを稼働させるアカウントを配置するOUです。環境ごとにサブOUを設けます。

  • Production OU: 本番環境アカウント群(各サービスごとに独立したアカウント)
  • Staging OU: ステージング/UAT環境アカウント群
  • Development OU: 開発・実験用アカウント群

Workloads OUでは環境別にSCPの強度を変え、本番アカウントはより厳格なSCPを適用します。開発アカウントは実験を許容するため、一部の制限を緩和することも可能です。

Sandbox OU(自由実験環境)

開発者が自由に実験・学習できる短命なアカウントを配置するOUです。本番データへのアクセスは全て遮断するSCPを必ず設定します。Sandbox OUのアカウントは最長3ヶ月でクローズし、リソースをリセットする運用サイクルを設けることが推奨されます。コスト上限もSCPでのBudgetsアラート強制と組み合わせて制御します。

SCP設計 — Deny優先の多層防御アーキテクチャ

SCPはポリシーで付与された権限の上限を設定するメカニズムです。SCPが「拒否」しているアクションは、アカウント内のポリシーがどれだけ強力な「許可」を持っていても実行できません。

SCP継承のルール

SCPはRoot OU → 子OU → アカウントの順に継承され、上位層での拒否は下位層では上書きできません。Root OUに設定したSCPは全メンバーアカウントに自動的に適用されます。

重要な注意点として、管理アカウント(Management Account)にはSCPが適用されません。メンバーアカウントのみが対象です。このため管理アカウント自体のポリシー設計は特別に厳格にする必要があります。

リージョン制限SCP

日本のエンタープライズ環境では、利用リージョンを東京(ap-northeast-1)、大阪(ap-northeast-3)、グローバルサービス用の米国東部(us-east-1)に限定するSCPが多く採用されています。

{
  "Version": "2012-10-17",
  "Statement": [
 {
"Sid": "DenyOutsideApprovedRegions",
"Effect": "Deny",
"NotAction": [
  "iam:*",
  "organizations:*",
  "support:*",
  "budgets:*"
],
"Resource": "*",
"Condition": {
  "StringNotEquals": {
 "aws:RequestedRegion": [
"ap-northeast-1",
"ap-northeast-3",
"us-east-1"
 ]
  }
}
 }
  ]
}

NotActionを使ってIAM・Organizations・Support・Budgetsをリージョン制限の対象外とするのがポイントです。これらはグローバルサービスであり、リージョン指定での制限が機能しない、または制限すると運用に支障をきたします。

ルートユーザー操作禁止SCP

メンバーアカウントのルートユーザーによる操作を全て禁止するSCPです。

{
  "Version": "2012-10-17",
  "Statement": [
 {
"Sid": "DenyRootUser",
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
  "StringLike": {
 "aws:PrincipalArn": "arn:aws:iam::*:root"
  }
}
 }
  ]
}

ルートユーザーによる操作は監査ログに残りにくく、多要素認証なしでの実行リスクもあります。SCPでメンバーアカウントのルートユーザー操作を全面禁止し、緊急時はBreak Glass手順でのみ対応することが推奨されます。

危険操作禁止SCP(Organizations構造保護)

OU構造やSCPの設定変更を一般メンバーアカウントから禁止するSCPです。

{
  "Version": "2012-10-17",
  "Statement": [
 {
"Sid": "DenyOrgStructureModification",
"Effect": "Deny",
"Action": [
  "organizations:LeaveOrganization",
  "organizations:DeleteOrganizationalUnit",
  "organizations:DetachPolicy"
],
"Resource": "*"
 }
  ]
}

アカウントファクトリ — 新規アカウント作成の標準化

Account Factoryは、Organizations管理下でのAWSアカウント作成を標準化するコンポーネントです。手動でのアカウント作成は以下のリスクを持ちます。

  • OU配置の誤り(Workloads OUに入れるべきアカウントをRoot直下に配置)
  • CloudTrailの設定漏れ(新アカウントのAPI操作が記録されない)
  • 初期セキュリティ設定の未適用(S3パブリックアクセスブロックが無効のまま)
  • タグの不統一(コスト配賦・リソース管理が不能になる)

Account Factoryでは、アカウント作成時のOU配置・初期設定・タグ付けを標準テンプレートで統一します。Control Tower環境ではAFT(Account Factory for Terraform)と組み合わせ、GitOpsフローでの完全自動化が実現します(詳細は§3で解説)。

Delegated Administrator — 管理アカウントからの権限委任

Organizations環境では、管理アカウントに全ての管理権限が集中しますが、これはリスク集中を招きます。Delegated Administrator機能を使い、特定のサービス管理を指定メンバーアカウントに委任することが推奨されます。

サービス委任先アカウント推奨委任できる操作
AWS Organizations(ポリシー管理)セキュリティ管理アカウントポリシー作成・更新・アタッチ
AWS ConfigAudit Account集約ビュー・コンプライアンスレポート
Amazon S3 Storage LensFinOpsアカウントストレージ使用状況の組織横断分析
AWS Cost ExplorerFinOpsアカウントコスト分析・予算アラート管理

Delegated AdministratorアカウントはSCPの適用対象であり、管理アカウントとは異なりSCPによる制限を受けます。これはセキュリティ観点では好ましい特性であり、委任先アカウントでの誤操作・意図しない操作をSCPで制限できます。

組織ポリシー — タグ・バックアップ・AIオプトアウト

OrganizationsはSCP以外にも複数の組織ポリシーをサポートしています。

タグポリシー(Tag Policy)

全アカウントのリソースに適用するタグの命名規則・必須タグキーを強制するポリシーです。コスト配賦・セキュリティ分類・運用自動化の前提となるタグ(Project・Environment・Owner・CostCenter等)を組織レベルで標準化します。

{
  "tags": {
 "Environment": {
"tag_value": {
  "@@assign": ["production", "staging", "development", "sandbox"]
},
"enforced_for": {
  "@@assign": ["ec2:instance", "rds:db", "s3:bucket"]
}
 }
  }
}

バックアップポリシー(Backup Policy)

AWS Backupを使用したバックアップ計画を組織レベルで強制するポリシーです。特定のOUやアカウント配下のリソースに対して、定期バックアップのスケジュール・保持期間・バックアップボールトを自動適用します。RDSデータベースやEBSボリュームへのバックアップポリシーを組織全体で一元管理できます。

AIサービスオプトアウトポリシー(AI Services Opt-out Policy)

Amazon Rekognitionなどのサービスがユーザーデータをモデルの改善に使用することを組織全体でオプトアウトするポリシーです。個人情報を扱う企業・医療・金融分野では必須の設定として検討が必要です。optOutTypeALLに設定することで、対象AIサービスの全機能でのデータ利用を停止できます。

flowchart TD
 A["Root OU\n[DenyRootUser SCP]\n[DenyRegionRestriction SCP]"] --> B["Security OU\n[DenyResourceMutation SCP]"]
 A --> C["Infrastructure OU"]
 A --> D["Workloads OU"]
 A --> E["Sandbox OU\n[DenyProductionAccess SCP]"]

 B --> F["Log Archive Account\n(全ログ集約先)"]
 B --> G["Audit Account\n(読み取り専用審査)"]

 C --> H["Network Account\n(TGW・VPN・共有VPC)"]
 C --> I["Shared Services Account\n(AD・DNS・共有ツール)"]

 D --> J["Production OU\n[DenyNonCriticalActions SCP]"]
 D --> K["Staging OU"]
 D --> L["Development OU\n(一部制限緩和)"]

 J --> M["App-A 本番Account"]
 J --> N["App-B 本番Account"]

 style A fill:#ff6b6b,color:#fff
 style B fill:#ffd93d
 style C fill:#6bcb77
 style D fill:#4d96ff,color:#fff
 style E fill:#c0c0c0
 style J fill:#ff9999
SCP設計の鉄則: Deny優先 + 最小権限の多層防御

SCP(Service Control Policy)はポリシーで付与された権限より上位の制御レイヤーです。設計の鉄則を守ることで、人的ミスやアカウント侵害時の影響範囲を最小化します。

鉄則1: Root OUにはDenyリストを配置する

Root OUには「全アカウントで絶対に許可しない操作」をDenyするSCPを配置します。リージョン制限・ルートユーザー操作禁止・Organizations構造変更禁止が典型です。デフォルトでアタッチされているFullAWSAccessポリシーは必ず残したまま、Denyポリシーを追加する形で設計します。

鉄則2: 管理アカウントにSCPは適用されない

管理アカウント(Organizations管理者アカウント)はSCPの対象外です。このため管理アカウント自体のポリシー設計は特別に厳格にする必要があります。日常業務での管理アカウントログインは禁止し、Delegated Administratorで業務を委任することを推奨します。

鉄則3: SCP変更前にAccess Analyzerで影響確認

SCPをRoot OUに適用する前に、IAMコンソールのAccess Analyzerでサービス最終アクセス日を確認し、実際に使用されているサービスへの影響を事前調査します。テスト用の隔離OUでSCPを先行適用してから本番OUに展開するステップを必ず踏みます。

鉄則4: OU単位でのSCP設計を原則とする

SCPをアカウント単位で設定すると、アカウント数が増えるにつれて管理が複雑化します。OU単位でのSCP設計を原則とし、アカウント固有の例外は最小限に留めます。

Delegated Administrator — 管理アカウント負荷とリスクの分散

Organizations管理アカウントへの権限集中はリスク集中と同義です。Delegated Administratorを活用してサービス管理を適切なメンバーアカウントに委任します。

委任の効果

リスク分散: 管理アカウントへのアクセス頻度を最小化。ログインはOrganizations構造変更等の限定的な作業のみに制限
最小権限の実現: 各委任先アカウントは担当サービスの管理権限のみを持ち、不要な権限を持たない
SCPによる保護: 委任先アカウントはSCPの適用対象であるため、誤操作・意図しない操作をSCPで制限できる(管理アカウントにはSCPが効かない点と対照的)

委任設定の手順

1. 委任先メンバーアカウントがOrganizationsに登録済みであることを確認
2. 管理アカウントから aws organizations register-delegated-administrator コマンドまたはマネジメントコンソールで委任設定
3. 委任先アカウントにサービス管理用のロールを作成
4. 委任先アカウントでの管理操作がCloudTrail Lakeに集約ログとして記録されることを確認

注意点: Organizations自身のポリシー管理(SCP作成・修正等)の委任は、Organizations Delegated Policies機能(別機能)を使います。通常のDelegated Administratorとは異なる設定手順が必要です。

AWS Control Tower 本番運用

AWS Control Tower は、Organizations の上にランディングゾーン(Landing Zone)を自動構築し、マルチアカウント環境のガバナンスを一元管理するサービスです。初期セットアップはわずか1時間以内に完了し、数百〜数千アカウントの規模まで対応できます。Control Tower は Organizations・Service Catalog・IAM Identity Center を内部でオーケストレーションし、「マルチアカウントのベストプラクティス基盤」を宣言的に構築します。

ランディングゾーンの構造

Control Tower がランディングゾーンをセットアップすると、3つの専用アカウントと2つのOUが自動作成されます。

アカウント / OU役割
Management Account(管理アカウント)Organizations のルートアカウント。Control Tower の設定・変更権限を持つ
Log Archive Account全アカウントの CloudTrail ログ・Config ログを集約保存。書き込み保護が自動設定される
Audit Accountセキュリティチームがクロスアカウントで全アカウントを監査する専用アカウント
Security OULog Archive + Audit アカウントを格納。厳格な Guardrails が適用される
Sandbox OU実験・検証用アカウント向けの隔離OU。本番OUより緩めの制約設定が可能

ランディングゾーンはあくまで「最初の安全な足場」です。この3アカウント構造を基盤として、Workloads OU・Infrastructure OU・Data OU などの業務用OUを追加構築していきます。

ランディングゾーン設計の重要ポイント:

  • Log Archive Account は隔離が原則: 本番アカウントのエンジニアが Log Archive アカウントへのアクセス権を持つとログ改ざんリスクが生まれます。アクセスはセキュリティ/Audit チームのみに限定してください。
  • 管理アカウントへの直接ログイン禁止: 日常業務での管理アカウント直接利用はリスクが高いため、IAM Identity Center 経由のフェデレーションアクセスに一本化することを推奨します。
  • ホームリージョン選択: ランディングゾーンのホームリージョンは後から変更が困難です。東京リージョン(ap-northeast-1)など、組織のメインリージョンを初回設定時に慎重に選択してください。
  • バージョンアップデートの定期適用: Control Tower は定期的にランディングゾーンの新バージョンをリリースします。ドリフトを防ぐため、四半期ごとに「ランディングゾーンの更新」を計画的に実施してください。

Guardrails(ガードレール)3種の詳細

Control Tower の Guardrails は「ガイダンスレベル(Mandatory / Strongly Recommended / Elective)」と「実装方式(Preventive / Detective / Proactive)」の2軸で分類されます。

ガイダンスレベルの分類:

レベル説明代表例
Mandatory(必須)Control Tower が自動適用。無効化・変更不可CloudTrail の有効化、S3パブリックアクセスブロック、Log Archive への書き込み保護
Strongly Recommended(強く推奨)AWS が本番環境での有効化を推奨ルートユーザー MFA の強制、不要なIAMキーの検出、EC2 デフォルトVPCの削除
Elective(任意)組織要件・業界規制に応じて選択特定リージョンの利用制限、特定サービスの無効化、特定インスタンスタイプの制限

実装方式の分類:

方式動作タイミング仕組み用途
Preventive(予防的)アクション実行前SCP で操作を物理的にブロック禁止操作の強制・セキュリティ境界の確保
Detective(検出的)アクション実行後AWS Config Rules で継続監視・違反を検出コンプライアンス違反の検知・アラート通知
Proactive(プロアクティブ)CloudFormation デプロイ前CloudFormation Hooks で設定値を事前検査非準拠リソースのデプロイを事前阻止
Guardrails 3種の使い分け — 実践的な判断基準

Mandatory Guardrails(自動適用・変更不可)

Control Tower が全管理アカウントへ自動適用します。設定変更・無効化は一切できません。

CT.CLOUDTRAIL.PR.1: 全リージョンでの CloudTrail 有効化(予防的)
CT.S3.PR.1: S3 パブリックアクセスブロックの強制(予防的)
CT.KMS.PR.1: Log Archive アカウントの CloudTrail KMS キー削除禁止(予防的)
CT.CLOUDTRAIL.PV.1: Log Archive S3 バケットへのパブリックアクセス禁止(プロアクティブ)

ランディングゾーン構築前に Mandatory Guardrails の一覧を把握し、既存システムとの干渉がないかを事前に確認してください。

Strongly Recommended Guardrails(本番環境では全有効化を推奨)

CT.IAM.PR.5: ルートユーザーのアクセスキー作成禁止(予防的)
CT.CLOUDWATCH.PR.1: CloudWatch アラームに SNS トピック設定(予防的)
CT.EC2.PR.2: デフォルトVPCへのインターネットゲートウェイ接続禁止(予防的)
CT.IAM.PV.1: IAM ルート資格情報の無効化(プロアクティブ)

Strongly Recommended は有効化に操作が必要です。ランディングゾーン構築後、速やかに全件有効化することを推奨します。

Elective Guardrails(業界規制・組織ポリシーに応じて選択)

CT.LAMBDA.PR.1: Lambda 関数の VPC 外デプロイ禁止(予防的)
CT.EC2.PR.4: EC2 インスタンスの非準拠AMI使用禁止(予防的)
CT.DYNAMODB.PR.1: DynamoDB Point-in-time Recovery の強制(予防的)
CT.S3.PR.10: S3 バケットの MFA 削除有効化要求(予防的)

金融・医療・行政など規制業種では Elective Guardrails を活用して業界固有のコンプライアンス要件を Control Tower で一元管理できます。OU単位で適用範囲を制御できるため、「本番OUのみ厳格に・開発OUは緩め」といった柔軟な運用が可能です。

Account Factory によるアカウント標準化作成

Account Factory は、事前定義したテンプレートに基づいてメンバーアカウントを標準化作成する Control Tower の機能です。アカウント作成時に以下の設定が自動適用されます。

  • 指定OUへの自動配置
  • 有効化された Guardrails の自動適用
  • 上位OUからの SCP 継承適用
  • IAM Identity Center への自動登録
  • CloudTrail の自動有効化

Account Factory の利用方法(AWS CLI):

aws servicecatalog provision-product \
  --product-name "AWS Control Tower Account Factory" \
  --provisioning-artifact-name "AWS Control Tower Account Factory" \
  --provisioned-product-name "app-prod-account" \
  --provisioning-parameters \
 Key=AccountName,Value=app-prod-account \
 Key=AccountEmail,Value=app-prod@example.com \
 Key=OUName,Value=Production \
 Key=ManagedOrganizationalUnit,Value="Production (ou-xxxx-xxxxxxxx)" \
 Key=SSOUserEmail,Value=admin@example.com \
 Key=SSOUserFirstName,Value=Admin \
 Key=SSOUserLastName,Value=User

コンソールからは「Control Tower → アカウントファクトリー → アカウントのプロビジョニング」で同等の操作が可能です。ただし、アカウント数が増えるにつれて手動操作は管理コストが増大するため、次に解説する AFT への移行を強く推奨します。

AFT(Account Factory for Terraform)による GitOps 完全自動化

Control Tower ランディングゾーン + Guardrails構成図
図2: AWS Control Tower — ランディングゾーン構成とGuardrails 3種(Mandatory/Strongly Recommended/Elective)の適用フロー

AFT(Account Factory for Terraform)は、アカウント作成から Guardrails 適用・カスタマイズまでをTerraformの GitOps フローで完全自動化します。git push するだけでアカウントが作られ、標準設定が適用されます。

AFT の構成要素:

コンポーネント役割
AFT 管理アカウントAFT インフラ(CodePipeline, Step Functions, DynamoDB)を格納する専用アカウント。Control Tower 管理アカウントとは別に用意する
アカウントリクエストリポジトリアカウント作成の入力トリガーとなる Terraform ファイルを管理
アカウントカスタマイズリポジトリ作成後のアカウントに適用するカスタム設定(IAMロール追加・CloudWatch設定等)を管理
グローバルカスタマイズリポジトリ全アカウントに共通で適用する設定を管理
Step Functions ステートマシンアカウント作成〜カスタマイズのパイプライン全体を実行・トレース
flowchart LR
 A["開発者がアカウント申請\naccount-request.tf を git push"] --> B["AFT アカウントリクエスト\nCodePipeline 起動"]
 B --> C["Account Factory\nアカウント作成 + OU配置"]
 C --> D["Guardrails 自動適用\nSCP 継承"]
 D --> E["グローバルカスタマイズ\nTerraform 適用(全アカウント共通)"]
 E --> F["アカウント固有カスタマイズ\nTerraform 適用"]
 F --> G["新アカウント\n利用開始(約20〜30分)"]

AFT の Terraform ディストリビューション選択:

オプション特徴推奨用途
Terraform Open Source(Community)無料。ステートはS3+DynamoDBで管理スタートアップ・中小企業
Terraform CloudHashiCorp Cloud で一元管理。コスト発生中〜大規模組織
Terraform EnterpriseオンプレミスまたはVPC内インストール。最高のセキュリティエンタープライズ・規制業種
AFT(Account Factory for Terraform)実践設計 — 5アカウント以上で必須

AFT 導入の前提条件:

1. Control Tower ランディングゾーンが稼働中であること
2. AFT 専用の管理アカウントを Control Tower 管理下に作成済みであること(Control Tower 管理アカウントとは別アカウント)
3. Terraform(v0.15以上)の実行環境が準備されていること

AFT でアカウントをリクエストする Terraform の例:

module "app_prod_account" {
  source = "github.com/aws-ia/terraform-aws-control_tower_account_factory//modules/aft-account-request"

  control_tower_parameters = {
 AccountEmail  = "app-prod@example.com"
 AccountName= "app-prod-account"
 ManagedOrganizationalUnit = "Production (ou-xxxx-xxxxxxxx)"
 SSOUserEmail  = "admin@example.com"
 SSOUserFirstName = "Platform"
 SSOUserLastName  = "Team"
  }

  account_tags = {
 Environment = "production"
 Team  = "platform"
 CostCenter  = "platform-001"
  }

  change_management_parameters = {
 change_requested_by = "platform-team"
 change_reason = "New application account provisioning"
  }
}

git push するとAFT の CodePipeline が自動起動し、Account Factory 経由でアカウント作成→OU配置→Guardrails適用→カスタマイズまで約20〜30分で完了します。

AFT の重要な制約と注意点:

– AFT はアカウント・Control Tower設定のプロビジョニング専用です。EC2・RDS等のアプリケーションリソースのデプロイには使用しないでください。
– AFT 管理アカウントは Control Tower の管理アカウントとは別の専用アカウントが必要です。同一アカウントへの AFT デプロイは非サポートです。
– 既存アカウントを AFT 管理下に置くには「アカウントの登録(Enroll)」操作が必要です。Enroll 時にアカウントへの Guardrails 適用が行われるため、既存リソースへの影響確認を事前に実施してください。
– AFT のカスタマイズには「グローバルカスタマイズ」と「アカウント固有カスタマイズ」の2レベルがあります。全アカウント共通の設定(デフォルトVPC削除等)はグローバルに、アカウントごとの差異(特定IAMロール・通知設定等)はアカウント固有カスタマイズで管理してください。

ドリフト検出と修復

Control Tower の「ドリフト(Drift)」とは、Control Tower が管理するリソースが Tower 外で手動変更され、期待状態からズレることを指します。

ドリフトが発生する主なパターン:

ドリフトの種類発生原因影響
SCP ドリフトGuardrails が使用する SCP を Organizations コンソールから手動編集Guardrails が機能しなくなる
OU ドリフトControl Tower 管理外でのOU作成・移動アカウントが Guardrails 対象外になる
アカウントドリフトメンバーアカウントの設定を直接変更Log Archive・Audit アカウントの保護設定が無効化される
ランディングゾーンドリフトControl Tower バージョンアップ後に設定が古くなるセキュリティアップデートが未適用になる

ドリフトを検出した場合、Control Tower コンソールの「ランディングゾーン設定」→「ランディングゾーンの再設定(Re-register)」を実行することで修復できます。

# Control Tower ランディングゾーンのドリフトステータス確認
aws controltower get-landing-zone \
  --landing-zone-identifier "arn:aws:controltower:ap-northeast-1::landingzone/XXXX" \
  --query 'landingZone.driftStatus'

# 出力例: "IN_SYNC" (正常) / "DRIFTED" (ドリフト発生)

定期的なドリフトチェックをパイプラインに組み込み(週次または月次)、検出時は速やかに Re-register を実行する運用フローを確立してください。

IAM Identity Center 統合 — シングルサインオンとアクセス管理

Control Tower は IAM Identity Center(旧 AWS SSO)と深く統合されており、Landing Zone セットアップと同時に IAM Identity Center が有効化されます。これにより、全メンバーアカウントへのアクセスをシングルサインオンで一元管理できます。

IAM Identity Center × Control Tower の統合ポイント:

統合機能動作メリット
自動アカウント登録新規アカウント作成時に IAM Identity Center へ自動追加手動登録不要・設定漏れゼロ
Permission SetAWS マネージドポリシーまたはカスタムポリシーでロールを定義全アカウントで同一の権限セットを使い回せる
グループ割り当てActive Directory グループまたは IAM Identity Center グループで一括管理組織変更に伴うアクセス権更新が1ヶ所で完結
アクセスポータルエンドユーザーはWebポータルからアカウント一覧を確認して切り替えAWS コンソールに直接ログインする必要がなくなる

Permission Set の設計例:

# Terraform で Permission Set を定義する例
resource "aws_ssoadmin_permission_set" "platform_admin" {
  name = "PlatformAdmin"
  instance_arn  = data.aws_ssoadmin_instances.main.arns[0]
  session_duration = "PT8H"
  description= "プラットフォームチーム用管理者権限"
}

resource "aws_ssoadmin_managed_policy_attachment" "platform_admin_policy" {
  instance_arn = data.aws_ssoadmin_instances.main.arns[0]
  permission_set_arn = aws_ssoadmin_permission_set.platform_admin.arn
  managed_policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess"
}

アクセス権付与のライフサイクル管理:

Control Tower 環境でのアクセス権管理は「誰がどのアカウントにどの Permission Set でアクセスできるか」を Terraform または CloudFormation で宣言的に管理することを推奨します。Account Factory(AFT)のカスタマイズリポジトリにアクセス権付与の設定を含めることで、アカウント作成時から適切な権限が付与された状態でエンジニアが作業を開始できます。

Control Tower 運用上の注意点とベストプラクティス

スケール時の設計考慮点:

Control Tower は数千アカウントを管理できますが、以下の設計上の制約に注意してください。

項目制限対策
OU の深さ最大5階層必要最小限の深さで設計する
1OU あたりのアカウント数制限なし(推奨は 100 アカウント以内)アカウントが増えたら OU を分割
Guardrails の適用遅延Elective Guardrails は OU 単位で有効化大規模 OU への Guardrails 適用は時間を要する場合がある
AFT pipeline の並列実行同時実行数に制限あり大量アカウント作成時は順次実行を計画する

ランディングゾーン更新手順(定期メンテナンス):

Control Tower の新バージョンがリリースされたら、以下の手順でランディングゾーンを更新します。

  1. Control Tower コンソールで「更新が利用可能」の通知を確認
  2. 「ランディングゾーンの設定」→「更新」をクリック
  3. 影響を受ける OU・アカウントを確認してから実行
  4. 更新完了後、ドリフトステータスが IN_SYNC であることを確認

更新は通常30分〜2時間かかります。更新中も既存アカウントの通常業務への影響は最小限ですが、メンテナンスウィンドウを設定して業務時間外に実施することを推奨します。

AWS Service Catalog 本番運用

AWS Service Catalog は「誰でも・素早く・正しい設定で」AWSリソースをプロビジョニングできるセルフサービスポータルを組織内に構築するサービスです。CloudFormation テンプレートや Terraform モジュールを製品(Product)としてカタログ化し、ポートフォリオ(Portfolio)で管理・配布することで、インフラのセルフサービス化と標準化を同時に実現します。

エンドユーザーはポータルから製品を選択しパラメータを入力するだけでリソースを作成でき、管理者は制約(Constraint)によって承認済みの設定値以外での起動を防止できます。Organizations との統合により、このカタログを組織全体・OU単位で配布することも可能です。

Service Catalog ポートフォリオ→製品→起動フロー
図3: AWS Service Catalog — ポートフォリオ設計→製品バージョン管理→制約適用→エンドユーザー起動の全体フロー

ポートフォリオ設計:チーム × 環境マトリクス

ポートフォリオは「誰に」「何を」提供するかを定義する器です。設計の基本はチーム(開発/インフラ/データ/セキュリティ)× 環境(本番/ステージング/開発)のマトリクスです。

ポートフォリオ設計例:

ポートフォリオ名対象チーム提供製品例環境
Platform-Common-Prod全チームVPC標準テンプレート、IAMロールセット本番
Platform-Common-Dev全チームVPC標準テンプレート(開発版)開発/ステージング
Data-Analytics-ProdデータチームS3データレイク、Glueジョブ、Athenaワークグループ本番
App-Service-Prod開発チームECS Fargateサービス、RDS Aurora、ElastiCache本番
Security-BaselinesセキュリティチームConfig Rules セット、CloudTrail設定全環境

ポートフォリオ設計のアンチパターンと正解パターン:

アンチパターン正解パターン
1つのポートフォリオに全製品を詰め込むチーム・環境単位で分割
ポートフォリオを個人ユーザーに直接アサインIAMグループ・IAM Identity Center グループに付与
本番・開発を同じポートフォリオで管理環境ごとに別ポートフォリオ(制約強度を変えるため)
全員に全ポートフォリオのアクセス権を付与最小権限の原則でチーム必要分のみアクセス許可

製品バージョン管理

製品(Product)は CloudFormation テンプレートまたは Terraform モジュールとして定義します。ポートフォリオ内の各製品は複数バージョンを保持でき、エンドユーザーはバージョンを選択して起動できます。

ポートフォリオ設計原則 — 製品バージョン管理と組織共有の鉄則

バージョニング戦略の基本:

製品バージョンは「廃止(Inactive)」にするまで並行して提供し続けます。既存のプロビジョニング済みリソースに影響を与えないよう、新バージョンは古いバージョンをすぐに削除せず、段階的に移行してください。

バージョン命名規則(推奨):

v1.0.0-cfn  → 初版(CloudFormation)
v1.1.0-cfn  → マイナーアップデート(後方互換あり)
v2.0.0-cfn  → 破壊的変更(パラメータ変更等)
v1.0.0-tf→ Terraform 版

CloudFormation 製品に新バージョンを追加する例:

aws servicecatalog create-provisioning-artifact \
  --product-id prod-xxxxxxxxxxxx \
  --parameters '{
 "Name": "v2.0.0",
 "Description": "VPC構成をシングルNATからマルチNATに変更",
 "Info": {
"LoadTemplateFromURL": "https://s3.amazonaws.com/my-catalog-templates/vpc-v2.0.0.yaml"
 },
 "Type": "CLOUD_FORMATION_TEMPLATE"
  }'

バージョン廃止の手順:

古いバージョンを「廃止(Inactive)」にすると新規起動はブロックされますが、既存のプロビジョニング済みリソースは影響を受けません。既存ユーザーへの移行通知後、6ヶ月程度の猶予期間を設けてから廃止するのがベストプラクティスです。

Organizations 単位でのポートフォリオ共有:

# Organizations 全体へポートフォリオを共有
aws servicecatalog create-portfolio-share \
  --portfolio-id port-xxxxxxxxxxxx \
  --organization-node '{"Type": "ORGANIZATION", "Value": "o-xxxxxxxxxxxx"}'

# 特定OU へのみ共有する場合
aws servicecatalog create-portfolio-share \
  --portfolio-id port-xxxxxxxxxxxx \
  --organization-node '{"Type": "ORGANIZATIONAL_UNIT", "Value": "ou-xxxx-xxxxxxxx"}'

共有されたポートフォリオは受け取り側アカウントの管理者がインポートし、ローカルユーザー・グループに割り当てることで利用可能になります。

制約設計:Launch / Template / Notification Constraint

制約(Constraint)は製品の起動時に適用されるビジネスルールです。3種類の制約を組み合わせてセキュリティと利便性を両立します。

制約の種類動作用途
Launch Constraint指定した IAM ロールで CloudFormation を実行エンドユーザーに必要以上の権限を付与せずプロビジョニングを実現
Template ConstraintCloudFormation パラメータの選択肢・範囲を制限承認済みのインスタンスタイプ・リージョン・AMI のみ使用可能にする
Notification Constraint起動・更新・削除時に SNS トピックへ通知承認フロー・監査ログ・Slack 通知との連携

Launch Constraint の設定(最重要制約):

Launch Constraint を設定しない場合、エンドユーザーが CloudFormation を実行するには cloudformation:* 等の広範な権限が必要です。Launch Constraint を設定すると、Service Catalog が指定 IAM ロールを assume して CloudFormation を実行するため、エンドユーザーの権限を最小化できます。

# Launch Constraint の設定(製品起動時に assume するロールを指定)
aws servicecatalog create-constraint \
  --portfolio-id port-xxxxxxxxxxxx \
  --product-id prod-xxxxxxxxxxxx \
  --type LAUNCH \
  --parameters '{"LocalRoleName": "ServiceCatalogLaunchRole"}'

Template Constraint の設定(パラメータ制限):

# EC2 インスタンスタイプを t3.micro と t3.small のみに制限
aws servicecatalog create-constraint \
  --portfolio-id port-xxxxxxxxxxxx \
  --product-id prod-xxxxxxxxxxxx \
  --type TEMPLATE \
  --parameters '{
 "Rules": {
"rule-instance-type": {
  "Assertions": [{
 "Assert": {
"Fn::Contains": [["t3.micro", "t3.small"], {"Ref": "InstanceType"}]
 },
 "AssertDescription": "開発環境では t3.micro または t3.small のみ利用可能です"
  }]
}
 }
  }'

組織共有とOU単位の製品配布

Organizations との統合により、ポートフォリオを組織全体または特定OU単位で一括配布できます。

Organizations Root
├── Security OU← Security-Baselines ポートフォリオのみ
├── Infrastructure OU← Platform-Common + Network ポートフォリオ
└── Workloads OU
 ├── Production OU← App-Service-Prod ポートフォリオ(制約強め)
 ├── Staging OU← App-Service-Staging ポートフォリオ
 └── Development OU  ← App-Service-Dev ポートフォリオ(制約緩め)

OU 単位でポートフォリオを分けることで、本番環境では承認済みのインスタンスタイプ・サイズのみに制限し、開発環境では柔軟な選択肢を提供するといった環境差異のある制約設計が実現できます。

Terraform 対応:Service Catalog × Terraform の実装

Service Catalog の Terraform 対応 — Open Source から Enterprise まで

Service Catalog は CloudFormation 以外に Terraform 製品(Open Source / Cloud / Enterprise)をサポートしています。既存の Terraform モジュール資産をそのまま Service Catalog 製品として登録できる点が最大のメリットです。

Terraform Open Source 製品の作成フロー:

# 1. Terraform 設定を tar.gz にアーカイブ
tar -czf vpc-module-v1.0.0.tar.gz ./vpc-module/

# 2. S3 バケットにアップロード
aws s3 cp vpc-module-v1.0.0.tar.gz \
  s3://my-service-catalog-artifacts/vpc-module-v1.0.0.tar.gz

# 3. Service Catalog 製品を作成
aws servicecatalog create-product \
  --name "Standard VPC Module" \
  --product-type TERRAFORM_OPEN_SOURCE \
  --provisioning-artifact-parameters '{
 "Name": "v1.0.0",
 "Description": "標準VPC(パブリック/プライベートサブネット/NAT Gateway)",
 "Info": {
"LoadFromS3Bucket": "my-service-catalog-artifacts",
"LoadFromS3Key": "vpc-module-v1.0.0.tar.gz"
 },
 "Type": "TERRAFORM_OPEN_SOURCE"
  }'

Terraform vs CloudFormation 製品の選択基準:

| 観点 | CloudFormation 製品 | Terraform 製品 |
|——|——————-|—————|
| 対象チーム | CloudFormation 経験者・AWS ネイティブ志向 | Terraform 経験者・既存IaC資産活用 |
| ステート管理 | Service Catalog 内部管理(ユーザー意識不要) | S3 + DynamoDB または Terraform Cloud |
| モジュール再利用 | スタック・ネストで実現 | 既存 Terraform モジュールをそのまま流用 |
| ドリフット検出 | CloudFormation ドリフト検出機能 | terraform plan によるドリフット確認 |
| 推奨場面 | AWS 標準のリソース構成・新規チーム | 既存 Terraform モジュール資産の活用 |

エンドユーザー体験:セルフサービスポータル:

エンドユーザーは Service Catalog コンソールの「製品リスト」から製品を選択し、パラメータを入力して「起動」するだけでリソースを作成できます。Template Constraint でパラメータが制限されるため、誤った設定での起動が防止されます。

起動後のライフサイクル管理(更新・終了)も同じポータルから実行でき、「プロビジョニングされた製品(Provisioned Products)」として一覧管理されます。エンドユーザーは自分が作成したリソースのみを表示・管理でき、他チームのリソースには干渉できません。

Terraform 製品のプロビジョニングフロー:

Terraform 製品を起動すると Service Catalog が内部で Terraform エンジンを実行します。ステートファイルは Service Catalog が管理する S3 バケットに自動保存されるため、エンドユーザーが Terraform の環境構築をする必要はありません。更新・削除も Service Catalog コンソールからワンクリックで実行でき、Terraform のコマンドライン操作なしに Infrastructure as Code の恩恵を受けられます。

Service Catalog の承認フロー設計

本番環境では、エンドユーザーが製品を起動する前に承認フローを設けることが重要です。Notification Constraint と AWS Step Functions を組み合わせることで、承認ワークフローを構築できます。

承認フローの構成例:

エンドユーザーが製品起動 → SNS通知 → Lambda起動 → 管理者にSlack/メール通知
  ↓
  管理者が承認
  ↓
  Service Catalog が起動を継続 または キャンセル

Notification Constraint の設定:

aws servicecatalog create-constraint--portfolio-id port-xxxxxxxxxxxx--product-id prod-xxxxxxxxxxxx--type NOTIFICATION--parameters '{"NotificationArns": ["arn:aws:sns:ap-northeast-1:123456789012:sc-approval-topic"]}'

SNS トピックにサブスクライブした Lambda がSlackや Teams に通知を送り、管理者が承認することで起動が完了するフローを構築できます。

Service Catalog の監査とコンプライアンス確認

Service Catalog は AWS CloudTrail と統合されており、全ての操作ログが記録されます。定期的な監査でコンプライアンス状態を確認してください。

CloudTrail での Service Catalog 監査クエリ(SQL):

SELECT
  eventTime,
  userIdentity.arn,
  eventName,
  requestParameters,
  responseElements
FROM <cloudtrail-lake-store-id>
WHERE eventTime > '2024-01-01 00:00:00'
  AND eventTime < '2024-01-31 23:59:59'
  AND eventSource = 'servicecatalog.amazonaws.com'
  AND eventName IN (
 'ProvisionProduct',
 'TerminateProvisionedProduct',
 'UpdateProvisionedProduct'
  )
ORDER BY eventTime DESC

コンプライアンス確認チェックリスト:

月次で以下を確認することを推奨します。

  • 全製品に Launch Constraint が設定されているか
  • 廃止バージョンが残っている製品はないか(移行猶予期間を超えたもの)
  • Organizations 共有ポートフォリオで権限の過剰付与がないか
  • Provisioned Products のステータスに ERRORTAINTED がないか

Provisioned Products のヘルスチェック:

# ステータスが AVAILABLE 以外の製品を一覧表示
aws servicecatalog scan-provisioned-products--query 'ProvisionedProducts[?Status!=`AVAILABLE`].[Name,Status,StatusMessage]'--output table

TAINTED は前回の更新に失敗した状態を示します。原因を調査し、製品テンプレートを修正してから再更新を実施してください。

AWS CloudTrail Lake 本番運用

CloudTrail Lake イベントデータストア + クエリフロー
図4: AWS CloudTrail Lake — イベントデータストア設計・SQLクエリ最適化・組織横断分析・Insights連携フロー

AWS CloudTrail Lake は、CloudTrail イベントをマネージドなイベントデータストアに集約し、SQL クエリで直接分析できるサービスです。従来の S3 + Athena を組み合わせた分析アーキテクチャと比較して、パーティション管理が不要でクエリ準備コストがゼロになる点が最大の強みです。本番環境では、管理イベントとデータイベントを分離したイベントデータストア設計と、組織横断トレイルの設定が運用品質を左右します。

イベントデータストア作成と保持期間設定

イベントデータストアはリージョン単位で作成します。マルチリージョン環境では、--multi-region-enabled オプションで全リージョンのイベントを1つのデータストアに集約できます。

# イベントデータストアの作成(管理イベント専用)
aws cloudtrail create-event-data-store \
  --name "management-events-store" \
  --retention-period 365 \
  --multi-region-enabled \
  --organization-enabled \
  --advanced-event-selectors '[
 {
"Name": "Management Events",
"FieldSelectors": [
  {"Field": "eventCategory", "Equals": ["Management"]}
]
 }
  ]'

保持期間は2つのモードがあります。1年保持(デフォルト)は通常運用・コスト重視の環境に適しています。7年保持はコンプライアンス要件(SOC 2、PCI DSS、HIPAA など)で長期保持が義務付けられる場合に選択します。

保持期間用途備考
1年(Standard)通常運用・コスト重視デフォルト。大半の本番環境はこれで十分
7年(Long-Term)コンプライアンス準拠長期保存追加料金あり。監査証跡要件確認後に設定

管理イベント vs データイベントの分離設計

イベントデータストアは用途に応じて分離して設計することがベストプラクティスです。全てのイベントを1つのデータストアに集約すると、S3 オブジェクトレベルのデータイベントがコストを急増させるリスクがあります。

推奨構成(3ストア分離):

  • 管理イベントストア: IAM変更・EC2起動停止・ネットワーク変更など。コストが予測しやすく、全環境で必須。
  • S3データイベントストア: 特定バケットのオブジェクトアクセスログ。対象バケットを限定してコスト抑制。
  • Lambda/DynamoDBデータイベントストア: 重要アプリケーションの呼び出しログ。対象関数・テーブルを絞って運用。
# データイベントストアの作成(S3特定バケット限定)
aws cloudtrail create-event-data-store \
  --name "s3-data-events-store" \
  --retention-period 90 \
  --advanced-event-selectors '[
 {
"Name": "S3 Data Events - Critical Buckets Only",
"FieldSelectors": [
  {"Field": "eventCategory", "Equals": ["Data"]},
  {"Field": "resources.type", "Equals": ["AWS::S3::Object"]},
  {"Field": "resources.ARN", "StartsWith": [
 "arn:aws:s3:::critical-bucket-prod/"
  ]}
]
 }
  ]'

クエリ最適化

CloudTrail Lake の SQL クエリは標準 SQL に近い構文で記述できます。eventTime による範囲絞り込みと eventSource フィルタを組み合わせることで、クエリコストを大幅に削減できます。

基本構文:

SELECT
  eventTime,
  eventSource,
  eventName,
  awsRegion,
  userIdentity.principalId,
  userIdentity.arn,
  sourceIPAddress,
  errorCode,
  errorMessage
FROM <event-data-store-id>
WHERE eventTime > '2024-01-01 00:00:00'
  AND eventTime < '2024-01-31 23:59:59'
  AND eventSource = 'iam.amazonaws.com'
ORDER BY eventTime DESC
LIMIT 100

eventTime 範囲指定(必須の最適化):

クエリには必ず eventTime の範囲を指定してください。範囲未指定のクエリは全データストアをスキャンしてコストが急増します。調査対象期間の ±1 日を範囲として指定するのが基本です。

頻出クエリテンプレート — 不正アクセス調査(認証失敗集計):

SELECT
  sourceIPAddress,
  userIdentity.principalId,
  COUNT(*) AS attempt_count,
  MIN(eventTime) AS first_attempt,
  MAX(eventTime) AS last_attempt
FROM <event-data-store-id>
WHERE eventTime > '2024-01-01 00:00:00'
  AND eventTime < '2024-01-07 23:59:59'
  AND errorCode IN ('AccessDenied', 'UnauthorizedAccess', 'InvalidClientTokenId')
GROUP BY sourceIPAddress, userIdentity.principalId
HAVING COUNT(*) > 10
ORDER BY attempt_count DESC

IAM ロール使用状況分析クエリ:

SELECT
  userIdentity.sessionContext.sessionIssuer.arn AS assumed_role,
  eventName,
  eventSource,
  awsRegion,
  COUNT(*) AS call_count
FROM <event-data-store-id>
WHERE eventTime > '2024-01-01 00:00:00'
  AND eventTime < '2024-01-31 23:59:59'
  AND userIdentity.type = 'AssumedRole'
GROUP BY
  userIdentity.sessionContext.sessionIssuer.arn,
  eventName,
  eventSource,
  awsRegion
ORDER BY call_count DESC
LIMIT 50

リソース変更追跡クエリ(変更操作の特定):

SELECT
  eventTime,
  userIdentity.arn,
  eventName,
  requestParameters,
  responseElements,
  errorCode
FROM <event-data-store-id>
WHERE eventTime > '2024-01-01 00:00:00'
  AND eventTime < '2024-01-31 23:59:59'
  AND eventName IN (
 'DeleteBucket', 'PutBucketPolicy',
 'CreateRole', 'AttachRolePolicy', 'DeleteRole',
 'ModifyInstanceAttribute', 'TerminateInstances'
  )
  AND errorCode IS NULL
ORDER BY eventTime DESC

組織トレイルと組織レベルのイベントデータストア

組織トレイルを使用すると、Organizations 配下の全メンバーアカウントのイベントを1つのイベントデータストアに集約できます。新規アカウントが Organizations に参加した時点から自動的にログ収集が開始されるため、手動設定漏れがなくなります。

# 組織レベルのイベントデータストア(管理アカウントで実行)
aws cloudtrail create-event-data-store \
  --name "org-wide-management-events" \
  --retention-period 365 \
  --organization-enabled \
  --multi-region-enabled \
  --advanced-event-selectors '[
 {
"Name": "All Management Events",
"FieldSelectors": [
  {"Field": "eventCategory", "Equals": ["Management"]}
]
 }
  ]'

組織トレイルの運用ポイント:

  • 組織レベルのイベントデータストアは管理アカウントでのみ作成可能です。
  • 組織全体クエリはアカウント数 × イベント量に比例してコストが増大するため、recipientAccountId フィルタで対象アカウントを絞ることを強く推奨します。
  • 分析用クエリは Log Archive アカウントまたは Audit アカウントから実行する設計が標準的なパターンです。
-- 特定アカウントのみを対象に絞るフィルタ(コスト削減)
SELECT eventTime, eventName, userIdentity.arn
FROM <org-event-data-store-id>
WHERE eventTime > '2024-01-01 00:00:00'
  AND eventTime < '2024-01-07 23:59:59'
  AND recipientAccountId = '123456789012'
  AND eventSource = 'iam.amazonaws.com'
ORDER BY eventTime DESC

CloudTrail Insights — 異常 API 呼び出しパターンの検出

CloudTrail Insights は、通常の API 呼び出しパターンと比較して異常なアクティビティを自動検出する機能です。機械学習ベースのベースライン分析により、突発的な API 呼び出し急増(リソース大量作成・認証試行の急増など)を検知してアラートを発報します。

Insights の有効化:

Insights はイベントデータストア単位ではなく、CloudTrail トレイル単位で有効化します。ApiCallRateInsight(API 呼び出し件数の異常増加)と ApiErrorRateInsight(エラー率の異常上昇)の2種類があります。

# 既存トレイルへの Insights 有効化
aws cloudtrail update-trail \
  --name my-org-trail \
  --insight-selectors '[
 {"InsightType": "ApiCallRateInsight"},
 {"InsightType": "ApiErrorRateInsight"}
  ]'

Insights 分析フロー:

  1. Insights イベントが S3 バケット(トレイル設定先)に出力される
  2. EventBridge ルールで Insights イベントを検知
  3. SNS または Lambda でアラート通知(Slack・メール等)
  4. CloudTrail Lake で通常イベントと突き合わせて原因を特定

Insights が検知する代表的な異常パターン:

パターンInsights タイプ
API 呼び出し急増短時間での大量 EC2 起動ApiCallRateInsight
エラー率急上昇権限変更後の AccessDenied 急増ApiErrorRateInsight
深夜の管理操作業務時間外の S3 バケット削除ApiCallRateInsight
CloudTrail Lake vs 従来の S3 ログ分析 — 移行判断基準

CloudTrail Lake と従来の S3 + Athena 構成には、それぞれ明確な強みがあります。移行判断は「クエリ頻度」と「保持期間要件」で決まります。

| 比較軸 | CloudTrail Lake | S3 + Athena |
|——–|—————-|————-|
| セットアップ | パーティション管理不要・即クエリ可 | S3・Glueカタログ・Athena 設定が必要 |
| クエリ性能 | 最適化済み(範囲指定で高速) | パーティション設計次第で変動 |
| 組織横断クエリ | ネイティブサポート | 複数バケット集約が複雑 |
| 保持期間 | 最大7年(マネージド保証) | S3 ライフサイクルで自由設計 |
| コスト(低頻度クエリ) | データストア保持料金が割高になりやすい | S3 Standard + Glacier で低コスト長期保持 |
| コスト(高頻度クエリ) | クエリコストが予測しやすい | Athena スキャン料金が累積しやすい |

CloudTrail Lake を選ぶべきケース:
– セキュリティチームが日常的に SQL クエリで調査を行う場合
– 組織横断(マルチアカウント)のイベント相関分析が必要な場合
– コンプライアンス要件で 3〜7 年の長期保持が必要な場合

S3 + Athena を維持すべきケース:
– クエリ頻度が低く、年数回の監査目的のみの場合
– 既存の分析基盤(Splunk・OpenSearch 等)と S3 が統合済みの場合
– データイベント(S3 全件)のような超大量ログを安価に長期保持したい場合

イベントデータストアのコスト最適化 — 実践チェックリスト

CloudTrail Lake のコストは「インジェスト量 × 保持期間」で決まります。以下のチェックリストで本番環境のコストを最適化してください。

ストア設計の最適化:
– 管理イベントとデータイベントを別ストアに分離(データイベントは対象を限定する)
– S3 データイベントは全バケットではなく「重要バケットのみ」を対象に設定
– Lambda データイベントは本番関数のみ、開発・テスト関数は除外
– DynamoDB データイベントは対象テーブルを resources.ARN フィルタで限定

保持期間の最適化:
– 管理イベント: 365 日(監査目的には十分。コンプライアンス要件がある場合のみ7年に延長)
– S3 データイベント: 90 日(インシデント調査の実効期間に合わせる)
– Lambda/DynamoDB データイベント: 30〜90 日(対応サイクルに合わせて調整)

クエリコストの最適化:
– 全クエリに eventTime の範囲フィルタを強制(クエリテンプレート化を推奨)
– 組織全体クエリでは recipientAccountId で対象アカウントを絞る
– 定常クエリは CloudTrail Lake の「保存クエリ」機能で再利用
– Cost Explorer で CloudTrail Lake のサービスコストを週次モニタリング

インジェスト量の見積もり目安:

100アカウント・1リージョン環境での管理イベントは概ね 50〜200 万イベント/日。データイベント(S3 全件)は最大 10〜100 倍の規模になるため、データイベントの有効化前に必ずコスト試算を行うことが重要です。

詰まりポイント7選 図解

AWSマルチアカウント・ガバナンス運用で頻出する7つの詰まりパターンを、症状・原因・解決策のセットで体系化します。本番環境で実際に発生した設計ミスをもとに、再発防止のポイントをまとめています。


詰まり1: SCPが意図しないアカウントにも継承されて業務停止

詰まり1: SCP継承による予期しない業務停止

症状

Root OUまたは上位OUに設定したSCP(Service Control Policy)が、想定していなかった子OUや子アカウントにも継承され、特定のAWSサービスが利用できなくなり業務が停止した。グローバルサービスへのアクセスが全滅するケースが特に多い。

原因

SCPはOU階層を通じて強制的に下位に継承されます。Root OUに「ap-northeast-1以外のリージョン禁止」のDeny SCPを適用すると、全メンバーアカウントのus-east-1操作(IAM・Route 53等のグローバルサービス含む)がブロックされます。グローバルサービスの除外条件を設定し忘れると、IAM操作不能・Route 53の名前解決停止など重大な障害が発生します。

解決策

1. SCP適用前は必ずSandbox OUのテストアカウントで検証する
2. グローバルサービス(IAM・Route 53・CloudFront・Support)の操作は NotAction で明示的に除外する
3. IAM Policy Simulatorで継承影響を事前確認する

{
  "Version": "2012-10-17",
  "Statement": [
 {
"Sid": "DenyNonApNortheast1",
"Effect": "Deny",
"NotAction": [
  "iam:*",
  "route53:*",
  "cloudfront:*",
  "support:*",
  "organizations:*",
  "sts:*"
],
"Resource": "*",
"Condition": {
  "StringNotEquals": {
 "aws:RequestedRegion": "ap-northeast-1"
  }
}
 }
  ]
}

NotAction でグローバルサービスを除外することで、リージョン制限SCPによる誤ブロックを防止できます。本番適用前は必ずSandboxアカウントで動作確認を行ってください。

詰まり2: Control Towerドリフトを放置してGuardrails無効化

詰まり2: Control Towerドリフト放置によるGuardrails無効化

症状

Control Tower外でアカウント設定やOUを手動変更(AWS ConsoleやCLIで直接操作)した結果、Control Tower管理状態がドリフト(乖離)し、一部のGuardrailsが機能しなくなった。Config Rulesが「Non-compliant」を示し続けているが原因が不明の状態になった。

原因

Control TowerはAWS Organizations・CloudFormation StackSets・Config・SSOの複合システムです。これらを直接操作するとControl Towerの期待する状態と実態がずれ(ドリフト)、Guardrails(Config Rules・SCP)が正常に機能しなくなります。手動でOUを移動させたり、StackSetsを直接削除すると修復が困難になります。

解決策

1. Control Tower管理下のリソース(OU・アカウント・SSO割り当て)は必ずControl Tower ConsoleまたはAPI経由で操作する
2. ドリフト検出は Control Tower Console → 「Landing zone settings」→「Drift」で定期確認(月次推奨)
3. ドリフト検出時は「Repair」ボタンで自動修復を実行する
4. 重大なドリフトは手動修復が必要な場合があるため、AWS Supportへの問い合わせを検討する

ドリフト発生パターンと対処法

| ドリフト種別 | 発生原因 | 自動修復可否 |
|————|———|————|
| OU移動 | Organizations直接操作 | 修復ボタンで対応可 |
| SCP変更 | Organizations直接SCP編集 | 修復ボタンで対応可 |
| アカウント移動 | 直接OU移動 | 手動再登録が必要な場合あり |
| SSO割り当て変更 | SSO直接操作 | 部分的に修復可 |

定期的なドリフト確認をEventBridgeルールで自動化し、検出時にSNSでアラートを送信する設計が推奨されます。

詰まり3: Service Catalog製品バージョン管理の欠如で古い構成が展開される

詰まり3: Service Catalog製品バージョン未管理による古い構成の展開

症状

エンドユーザーが起動した製品が、最新のセキュリティ要件を満たさない古いCloudFormationテンプレートで作成されていた。製品テンプレートを更新したはずなのに、一部ユーザーが依然として古いバージョンで起動している状態が続いた。

原因

Service Catalogは製品のバージョン管理機能を持ちますが、バージョンを追加しても古いバージョンを「廃止(Inactive)」にしない限り、ユーザーのバージョン一覧に古いものと新しいものが混在します。エンドユーザーは意図せず古いバージョンを選択して起動できてしまいます。

解決策

1. 新バージョン追加時は必ず旧バージョンを「廃止(Inactive)」に設定する
2. 廃止ポリシーをSOP(標準作業手順書)に明記し、製品オーナーに周知する
3. 重要なセキュリティ修正を含むバージョン更新は、強制移行通知をユーザーに送付する
4. Terraform製品の場合は変数のデフォルト値もバージョンと合わせて更新する

import boto3

sc = boto3.client('servicecatalog', region_name='ap-northeast-1')

def deprecate_old_versions(product_id: str, keep_version_name: str):
 response = sc.list_provisioning_artifacts(ProductId=product_id)
 for artifact in response['ProvisioningArtifactDetails']:
  if artifact['Name'] != keep_version_name:
sc.update_provisioning_artifact(
 ProductId=product_id,
 ProvisioningArtifactId=artifact['Id'],
 Active=False
)
print(f"廃止完了: {artifact['Name']}")

バージョン廃止の自動化により、製品更新後の古いバージョン残存リスクを排除できます。廃止前に既存プロビジョン済みリソースへの影響がないことを必ず確認してください。

詰まり4: CloudTrail Lakeのコストが想定外に膨張

詰まり4: CloudTrail Lakeコスト膨張

症状

CloudTrail Lakeを導入後、翌月のAWSコストが数十万円単位で跳ね上がった。特にS3データイベントやLambda Invokeイベントを全件取得する設定にしていたため、インジェストコストが予算の10倍以上になった。

原因

CloudTrail Lakeのコストは2軸あります。
インジェストコスト: イベントデータストアに書き込まれるデータ量(GB単位)
クエリコスト: SQLクエリでスキャンするデータ量(GB単位)

S3のGetObject・PutObjectやLambdaのInvokeは高頻度イベントであり、全件取得すると1日で数GBのデータがインジェストされます。大規模環境では月間数TBになることも珍しくありません。

解決策: データイベントの選択的取得

{
  "EventSelectors": [
 {
"ReadWriteType": "WriteOnly",
"IncludeManagementEvents": false,
"DataResources": [
  {
 "Type": "AWS::S3::Object",
 "Values": ["arn:aws:s3:::critical-bucket-name/"]
  }
]
 }
  ]
}

1. 管理イベントとデータイベントでデータストアを分離する
2. データイベントは「重要なバケット・重要なLambda関数のみ」に絞り込む
3. 保持期間は業務要件の最短値に設定(分析用は90日、コンプライアンス用は7年と分離)
4. CloudWatchメトリクスでインジェスト量を監視し、異常値検出時にアラートを送信する

コスト最適化設計: 管理イベント専用データストア(低コスト)とデータイベント含むデータストア(高コスト・対象絞り込み)を分離することで、ログ網羅性を保ちながらコストを最小化できます。

詰まり5: 管理アカウントに全機能を集中させてリスク増大

詰まり5: 管理アカウント集中によるリスク増大

症状

AWSコンソールの請求確認、セキュリティアラート確認、コンプライアンスレポート生成、コスト管理、ADコネクタ管理など、全ての管理業務を組織の管理アカウント(マスターアカウント)で行っている。管理者が退職した際にアカウント移管が困難になり、運用リスクが増大した。

原因

AWS Organizationsの管理アカウントは組織内の全アカウントに対して特権を持つため、侵害された場合の影響が最大になります。多くのロールや権限が管理アカウントに集中していると、不審なアクティビティを検出しにくくなります。日常的に管理アカウントにアクセスすると、誤操作や認証情報漏洩のリスクも高まります。

解決策: Delegated Administratorの活用

| 管理サービス | 委任先(推奨) |
|————|————-|
| コンプライアンス評価(Config集約) | Auditアカウント |
| ログ一元管理(CloudTrail集約) | Log Archiveアカウント |
| コストレポート(Cost Explorer) | FinOpsアカウント |
| 予算管理(Budgets) | FinOpsアカウント |
| Service Catalog管理 | Shared Servicesアカウント |
| CloudFormation StackSets | Shared Servicesアカウント |

# Delegated Administratorの登録例(管理アカウントから実行)
aws organizations register-delegated-administrator \
  --account-id 123456789012 \
  --service-principal config.amazonaws.com

aws organizations register-delegated-administrator \
  --account-id 123456789012 \
  --service-principal servicecatalog.amazonaws.com

管理アカウントへのアクセスは最小限にとどめ、MFA必須・特権アクセス専用端末からのみアクセス許可する設計を採用してください。日常業務は委任先アカウントのロールを使用するよう運用ルール化することが重要です。

詰まり6: Account Factory手動運用でOU配置ミス

詰まり6: Account Factory手動運用によるOU配置ミス

症状

新しいAWSアカウントを手動でOrganizations Consoleから作成し、担当者がOU配置を誤ってWorkloads OUに配置すべきアカウントをRoot OU直下に置いてしまった。その結果、Workloads OU配下のSCP(コスト管理・リージョン制限等)が適用されず、数週間後のコスト精算でリージョン外リソースが大量に発見された。

原因

手動でのアカウント作成には以下のリスクがあります。
– OU配置の人為的ミス
– Guardrails(Config Rules・SCP)の自動適用がされない
– タグ付けの漏れ(コスト配賦が不明確になる)
– Control Towerの管理外になり、ドリフト検出の対象外になる

解決策: AFTによる完全自動化

Account Factory for Terraform(AFT)を使用すると、アカウント作成リクエストをコードで管理でき、GitOpsフローによる承認プロセスを実装できます。

# AFTアカウント作成リクエスト例
module "new_workload_account" {
  source = "./modules/aft-account-request"

  control_tower_parameters = {
 AccountEmail  = "workload-app-a@example.com"
 AccountName= "App-A Production"
 ManagedOrganizationalUnit = "Workloads/Production"
 SSOUserEmail  = "admin@example.com"
 SSOUserFirstName = "Admin"
 SSOUserLastName  = "User"
  }

  account_tags = {
 Environment = "production"
 Team  = "app-a"
 CostCenter  = "CC-1234"
  }
}

GitのPull Requestが承認されるとアカウント作成が自動実行され、OU配置・Guardrails適用・タグ付けが漏れなく行われます。5アカウント以上の環境ではAFT導入を強く推奨します。

詰まり7: 組織トレイルの未設定で新アカウントのログが欠落

詰まり7: 組織トレイル未設定による新アカウントのログ欠落

症状

セキュリティ調査のためCloudTrailログを確認したところ、特定のアカウントに3ヶ月分のログが存在しなかった。調査の結果、そのアカウントが作成された際に組織トレイルが適用されず、CloudTrailが無効の状態で運用されていたことが判明した。

原因

各アカウント個別のCloudTrailは有効化を忘れることがあります。Control Tower管理外でアカウントを作成した場合、Mandatory Guardrails(CloudTrail有効化)が適用されません。組織トレイルを設定していない場合、新規アカウントは個別にCloudTrailを設定するまでログが取得されません。

解決策: 組織トレイルの必須化

# 組織トレイルの作成(管理アカウントから実行)
aws cloudtrail create-trail \
  --name org-trail \
  --s3-bucket-name org-cloudtrail-logs-123456789012 \
  --is-multi-region-trail \
  --include-global-service-events \
  --is-organization-trail \
  --enable-log-file-validation

aws cloudtrail start-logging --name org-trail

組織トレイルを設定すると、Organizations配下の全アカウント(既存・新規)のCloudTrailログが一元的に取得されます。管理アカウントから一度設定するだけで、以降に追加されるアカウントにも自動的に適用されます。

組織トレイル設計のベストプラクティス

| 設定項目 | 推奨値 | 理由 |
|———|——–|——|
| マルチリージョン | 有効 | 全リージョンのAPIコールを取得 |
| グローバルサービスイベント | 有効 | IAM・Route 53ログを含める |
| ログファイル検証 | 有効 | ログ改ざん検知 |
| S3バケット | Log Archiveアカウント | ログの一元管理・隔離 |
| KMS暗号化 | 有効 | ログの暗号化保護 |
| CloudWatch Logs連携 | 有効 | リアルタイムアラート |

アンチパターン→正解パターン変換(5問)

AWSガバナンス設計で実際によく見られるアンチパターンと、その正解パターンを演習形式で学びます。各問題は「NG構成」と「OK構成」のペアで示します。


AP1: 全アカウントをRoot OU直下にフラット配置

NG構成 — 全アカウントをRoot OU直下にフラット配置

Root OU
├── Account-A (本番)
├── Account-B (開発)
├── Account-C (ステージング)
├── Account-D (ログアーカイブ)
└── Account-E (ネットワーク)

この構成では全アカウントに同じSCPしか適用できず、本番環境と開発環境のセキュリティ要件を分離できません。機能別・環境別の柔軟なポリシー管理が不可能になります。

OK構成 — 機能別・環境別のOU階層設計

Root OU(組織共通SCP: リージョン制限・危険操作禁止)
├── Security OU(セキュリティ特化SCP)
│├── Log Archive Account(ログ長期保存)
│└── Audit Account(コンプライアンス監視)
├── Infrastructure OU(インフラ共通SCP)
│├── Network Account(Transit Gateway・DNS)
│└── Shared Services Account(Service Catalog)
├── Workloads OU(業務系SCP)
│├── Production OU(本番強化SCP)
││└── App-A Prod Account
│├── Staging OU
││└── App-A Staging Account
│└── Development OU(開発者フレンドリーSCP)
│ └── App-A Dev Account
└── Sandbox OU(SCP最小限: 学習・検証用)
 └── Sandbox Account

環境ごとにOUを分離することで、本番環境への厳格なSCPと開発環境への柔軟なSCPを同時に実現できます。セキュリティOU配下のLog Archiveアカウントは、全アカウントからのCloudTrailログ集約先として機能します。


AP2: SCPでAllow型ポリシーのみ使用

NG構成 — Allow型SCPのみで権限管理

{
  "Version": "2012-10-17",
  "Statement": [
 {
"Effect": "Allow",
"Action": ["ec2:*", "s3:*", "rds:*"],
"Resource": "*"
 }
  ]
}

問題点: SCPのAllow型は「この操作を上限として認める」という意味であり、IAMポリシーとのAND条件になります。Allow型SCPだけでは記載外のサービス(Lambda等)の制限ができず、危険な操作(Organizations離脱・CloudTrail削除)も防止できません。

OK構成 — Deny型優先 + 最小権限の多層防御

{
  "Version": "2012-10-17",
  "Statement": [
 {
"Sid": "DenyLeaveOrganization",
"Effect": "Deny",
"Action": "organizations:LeaveOrganization",
"Resource": "*"
 },
 {
"Sid": "DenyNonApRegions",
"Effect": "Deny",
"NotAction": ["iam:*", "route53:*", "support:*", "sts:*"],
"Resource": "*",
"Condition": {
  "StringNotEquals": {
 "aws:RequestedRegion": ["ap-northeast-1", "us-east-1"]
  }
}
 },
 {
"Sid": "DenyDisableCloudTrail",
"Effect": "Deny",
"Action": [
  "cloudtrail:DeleteTrail",
  "cloudtrail:StopLogging",
  "cloudtrail:UpdateTrail"
],
"Resource": "*"
 }
  ]
}

Deny型SCPは「何が起きても絶対禁止」する操作を明示します。Organizations離脱禁止・リージョン外操作禁止・CloudTrail無効化禁止を最低限のDeny SCPとして設定し、IAMポリシー側で必要な権限を付与する多層防御を構築します。


AP3: Control Tower無しで手動Landing Zone構築

NG構成 — Control Towerを使わず手動でマルチアカウント環境を構築

# 各アカウントに手動でCloudTrailを個別設定
aws cloudtrail create-trail \
  --name account-trail \
  --s3-bucket-name logs-bucket-123

# Config Rulesをアカウントごとに手作業で設定
aws configservice put-config-rule \
  --config-rule file://config-rule.json

手動Landing Zone構築の問題点:
– Guardrails(Config Rules・SCP)の適用漏れが発生しやすい
– アカウント追加のたびに同じ作業を繰り返す(ヒューマンエラーリスク)
– ドリフト検出・自動修復の仕組みがない
– 構成のバージョン管理ができない

OK構成 — Control Tower + AFT による完全自動化

# AFTでアカウント作成リクエストをコード管理
module "control_tower_account" {
  source = "./modules/aft-account-request"

  control_tower_parameters = {
 AccountEmail  = "new-app@company.com"
 AccountName= "New Application"
 ManagedOrganizationalUnit = "Workloads/Production"
 SSOUserEmail  = "app-admin@company.com"
 SSOUserFirstName = "App"
 SSOUserLastName  = "Admin"
  }

  account_customizations_name = "workload-customizations"
}

Control TowerはMandatory Guardrails(CloudTrail・Config等)を自動で全アカウントに適用します。AFTはGitOpsフローでアカウントライフサイクルを管理し、人手を介さずに一貫した設定が展開されます。


AP4: Service Catalog未使用で各チームが自由にリソース作成

NG構成 — 各チームが直接AWSコンソールやCLIでリソースを自由に作成

開発チームがEC2インスタンスを直接起動する場合の問題点:
– インスタンスタイプが不統一(コスト管理困難)
– セキュリティグループが各自の設定(インターネット開放等のリスク)
– タグ付けの欠如(コスト配賦が不明確)
– 最新のAMI・パッチ適用済みテンプレートが使われない

OK構成 — Service Catalog ポートフォリオ → 製品 → 制約 の標準化

AWSTemplateFormatVersion: "2010-09-09"
Description: "標準化EC2インスタンス — コスト最適化タイプのみ許可"

Parameters:
  InstanceType:
 Type: String
 AllowedValues:
- t3.medium
- t3.large
- m6i.large
 Default: t3.medium

  Environment:
 Type: String
 AllowedValues: [development, staging, production]

Resources:
  WebInstance:
 Type: AWS::EC2::Instance
 Properties:
InstanceType: !Ref InstanceType
ImageId: "{{resolve:ssm:/golden-ami/latest-id}}"
Tags:
  - Key: Environment
 Value: !Ref Environment
  - Key: ManagedBy
 Value: ServiceCatalog

Service Catalogの制約(Launch Constraint)により、エンドユーザーはパラメータの選択肢が制限された製品のみを利用できます。最新のゴールデンAMI(SSMパラメータストア参照)が自動的に使われるため、パッチ適用済み環境が常に展開されます。


AP5: CloudTrailログをS3に放置して分析なし

NG構成 — CloudTrailログをS3に蓄積するだけで分析基盤なし

# ログはS3にあるが分析には長い前処理が必要
aws s3 ls s3://cloudtrail-logs/AWSLogs/123456789012/CloudTrail/ap-northeast-1/

# Athenaで分析する場合、パーティション管理・スキーマ定義が別途必要
# 調査開始まで30分以上かかることも

問題点: ログは存在するが分析クエリ実行まで時間がかかる。パーティション管理・スキーマ管理が必要。組織横断のクエリが困難。異常検出のリアルタイム通知がない。

OK構成 — CloudTrail Lake + SQLクエリ + Insights による即時分析

-- CloudTrail Lake: 過去7日間に特定ユーザーが行った操作一覧
SELECT
  eventTime,
  eventSource,
  eventName,
  awsRegion,
  sourceIPAddress,
  userIdentity.arn
FROM <event_data_store_arn>
WHERE userIdentity.arn LIKE '%target-user%'
  AND eventTime > DATE_ADD('day', -7, NOW())
ORDER BY eventTime DESC;

-- CloudTrail Lake: ルートアカウントのコンソールログイン検出
SELECT
  eventTime,
  sourceIPAddress,
  userAgent
FROM <event_data_store_arn>
WHERE userIdentity.type = 'Root'
  AND eventName = 'ConsoleLogin';

CloudTrail Lakeはパーティション管理不要で即座にSQLクエリが実行できます。CloudTrail Insightsを有効化すると、異常な操作パターンを自動検出してアラートを発報します。組織トレイルとCloudTrail Lakeを組み合わせることで、全アカウントのイベントを単一クエリで横断分析できます。

まとめ — Management & Governance Vol1起点・58記事化達成

Management & Governance Vol1では、AWSのガバナンス基盤を構成する4つのサービス — AWS Organizations・AWS Control Tower・AWS Service Catalog・AWS CloudTrail Lake — を体系的に解説しました。

ガバナンス4層 — 統制・確立・標準化・監査の統合

第1層: 統制する(Organizations + SCP)

AWS Organizationsは組織のアカウント構造を定義し、SCPでアカウントの行動範囲を強制します。OU階層設計とDeny型SCPの組み合わせが、全アカウント共通のセキュリティベースラインを保証します。Delegated Administratorにより管理アカウントへの権限集中を回避し、機能別アカウントへの委任を推進します。

第2層: 確立する(Control Tower)

Control TowerはLanding Zoneというベストプラクティス準拠の基盤環境を構築し、Guardrails(3種)でコンプライアンスを継続的に保証します。AFT(Account Factory for Terraform)により、アカウントのライフサイクル管理をGitOpsフローに乗せ、人的ミスを排除した標準化を実現します。ドリフト検出・自動修復により、Control Tower管理外の手動操作によるコンプライアンス逸脱を検知・修正できます。

第3層: 標準化する(Service Catalog)

Service Catalogはポートフォリオ→製品→制約の階層でリソースプロビジョニングを標準化します。開発者はAWSコンソールで承認済みの製品のみを起動でき、セキュリティ要件・コスト要件を満たしたリソースが常に展開されます。バージョン管理と廃止ポリシーにより、パッチ適用済みの最新テンプレートが常用されます。

第4層: 監査する(CloudTrail Lake)

CloudTrail Lakeは全アカウントのAPIコールを組織横断で収集し、SQLクエリで即座に分析できるマネージドな監査基盤を提供します。CloudTrail Insightsによる異常検出、7年間の長期保持、組織トレイルとの連携により、本番環境のセキュリティ監査とコンプライアンス証跡を一元管理します。

ガバナンス4層の統合フロー

新アカウント申請
 ↓
AFT(GitOps)でアカウント作成リクエスト → PR承認
 ↓
Control Tower Account Factoryがアカウント作成
 ↓ Mandatory Guardrails 自動適用(CloudTrail・Config等)
組織トレイルにより CloudTrail Lake へログ自動連携
 ↓
OU配置に応じたSCP自動継承(Organizations)
 ↓
Service Catalogポートフォリオ共有(承認済み製品の標準化)
 ↓
全APIコールがCloudTrail Lakeに記録・SQLで即時分析可能

次のアクション:
1. AWS OrganizationsでOU階層を設計し、SCPをDeny型で実装する
2. Control TowerでLanding Zoneを構築し、AFTを導入する
3. Service CatalogでTerraform製品の第1号ポートフォリオを作成する
4. CloudTrail Lakeでイベントデータストアを作成し、組織トレイルと連携する

Management & Governance Vol1起点 — ガバナンス4層フレームワーク

本記事で解説したガバナンス4層フレームワークは、AWSマルチアカウント環境の本番運用における統合的なアプローチです。各層の設計ポイントと主要サービスの役割を整理します。

Organizations × SCP(統制層)の設計ポイント
– OU階層設計: Root → Security / Infrastructure / Workloads / Sandbox
– SCP設計: Deny型優先 + NotActionでグローバルサービス除外条件を明記
– Delegated Administrator: コンプライアンス・コスト・サービス管理を専用アカウントへ委任
– タグポリシー: 全アカウント共通タグ(Environment・CostCenter・Team)の組織レベル強制

Control Tower × AFT(確立層)の設計ポイント
– Landing Zone: Mandatory Guardrails(CloudTrail・Config・MFA等)の自動適用
– Strongly Recommended Guardrails: 本番環境での全有効化推奨
– AFT(Account Factory for Terraform): アカウントライフサイクルのGitOps管理
– ドリフト検出: 月次確認 + EventBridgeによるアラート自動化

Service Catalog(標準化層)の設計ポイント
– ポートフォリオ設計: チーム別 × 環境別のマトリクス構成
– 製品バージョン管理: 新バージョン追加時の旧バージョン廃止(Inactive化)ポリシー
– Launch Constraint: 専用IAMロールで最小権限のプロビジョニング
– Terraform製品: S3バケット経由の.tar.gz形式での登録・管理

CloudTrail Lake(監査層)の設計ポイント
– 組織トレイル: 全アカウント・全リージョンの一元ログ取得(新規アカウントにも自動適用)
– イベントデータストア: 管理イベント / データイベントの分離設計でコスト最適化
– SQLクエリ: パーティション管理不要の即時分析基盤
– Insights: 異常なAPI呼び出しパターンの自動検出

ガバナンス × コスト最適化 × セキュリティの統合視点

IAM(第1軸)との統合: ガバナンス基盤で定めたOU・アカウント構造と、IAMロールの最小権限設計を整合させます。SCP × IAMポリシーの多層防御で不正操作を防止します。Permission Boundaryを活用することで、開発者が作成するロールの権限上限を組織レベルで制御できます。

CloudTrail・Config(第18軸)との統合: CloudTrail Lakeの監査基盤に加え、Config Rulesでリソースコンプライアンスを継続評価します。非準拠リソースを自動修復(Auto Remediation)することでガバナンスポリシーを継続施行します。Config集約ビューをAuditアカウントに委任することで、組織全体のコンプライアンス状態を一元把握できます。

Cost Optimization(第23軸)との統合: Service CatalogとBudgets Actionsを連携させ、予算超過時にOU単位でリソース操作を自動制限します。Delegated AdministratorによるFinOpsアカウントでコスト分析を集中管理します。Organizations Cost Categoriesを使用することで、OU・アカウント・タグ単位の精密なコスト可視化が実現します。

58記事化達成 — 全24軸リスト

本記事(Management & Governance Vol1)の公開をもって、AWSハンズオンシリーズが全24軸・58記事の完全体制に到達しました。クラウドエンジニアとして本番環境を運用するために必要な全領域をカバーしています。

全24軸シリーズ一覧

| 軸 | シリーズ名 | 主なサービス |
|—-|———–|————|
| 第1軸 | IAM本番運用 | IAM・STS・Identity Center |
| 第2軸 | VPC / ネットワーク本番運用 | VPC・Transit Gateway・PrivateLink |
| 第3軸 | EC2 / Compute本番運用 | EC2・Auto Scaling・ELB |
| 第4軸 | S3 / ストレージ本番運用 | S3・EBS・EFS |
| 第5軸 | RDS / データベース本番運用 | RDS・Aurora・ElastiCache |
| 第6軸 | Lambda / サーバーレス本番運用 | Lambda・SAM・Powertools |
| 第7軸 | API Gateway本番運用 | REST API・HTTP API・WebSocket |
| 第8軸 | ECS / コンテナ本番運用 | ECS・Fargate・ECR |
| 第9軸 | EKS / Kubernetes本番運用 | EKS・Helm・Karpenter |
| 第10軸 | CloudFront / CDN本番運用 | CloudFront・OAC・Lambda@Edge |
| 第11軸 | Route 53 / DNS本番運用 | Route 53・Global Accelerator |
| 第12軸 | SQS・SNS・EventBridge本番運用 | SQS・SNS・EventBridge |
| 第13軸 | Step Functions本番運用 | Step Functions・Express Workflows |
| 第14軸 | DynamoDB / NoSQL本番運用 | DynamoDB・DAX・Streams |
| 第15軸 | Kinesis / ストリーミング本番運用 | Kinesis Data Streams・Firehose |
| 第16軸 | データ分析基盤本番運用 | Glue・Athena・EMR |
| 第17軸 | SageMaker / AI・ML本番運用 | SageMaker・Bedrock |
| 第18軸 | CloudTrail・Config本番運用 | CloudTrail・Config・CloudWatch |
| 第19軸 | セキュリティ基盤本番運用 | Inspector・Macie・Shield |
| 第20軸 | Well-Architected本番運用 | WA Tool・Trusted Advisor |
| 第21軸 | DevOps基盤本番運用 | CodePipeline・CodeBuild・CodeDeploy |
| 第22軸 | IaC / CloudFormation本番運用 | CloudFormation・CDK・Terraform |
| 第23軸 | Cost Optimization本番運用 | Cost Explorer・Savings Plans・Budgets |
| 第24軸 | Management & Governance本番運用 | Organizations・Control Tower・Service Catalog |

58記事化達成の意義

AWSの主要サービスを24軸・58記事で体系化することで、以下の効果を実現しています。

1. 体系的な学習パス: IAM(認証基盤)→ネットワーク(インフラ基盤)→コンピュート・データベース(アプリ基盤)→監視・コスト・ガバナンス(運用基盤)という学習順序で、実務に直結するスキルを段階的に習得できます。
2. 横断的な知識連携: 各記事にはクロスリンクが設置されており、サービス間の依存関係と統合パターンを理解しながら学習できます。特にガバナンス・セキュリティ・コストの3軸は相互参照が多く、統合視点での理解が重要です。
3. 本番環境への直接適用: 全記事が「本番運用」視点で書かれており、アーキテクチャ設計から実装・運用まで一貫したノウハウを提供します。

ガバナンス統合チェックリスト — 本番環境リリース前の必須確認事項

Management & Governance本番環境を構築する際の最終確認リストです。全項目をクリアしてからリリースしてください。

Organizations設計チェック

  • [ ] OU階層設計: Security / Infrastructure / Workloads / Sandbox OUが構成されているか
  • [ ] Root SCP: リージョン制限・Organizations離脱禁止・CloudTrail削除禁止が設定されているか
  • [ ] グローバルサービス除外: IAM・Route 53・Support操作がSCPのNotActionで除外されているか
  • [ ] Delegated Administrator: コンプライアンス・コスト管理が専用アカウントへ委任されているか
  • [ ] タグポリシー: Environment・CostCenter・Teamが組織レベルで強制されているか

Control Tower設計チェック

  • [ ] Landing Zone: v3.3以上のバージョンで構築されているか
  • [ ] Mandatory Guardrails: 全て有効かつ機能しているか(Config Rulesで確認)
  • [ ] Strongly Recommended Guardrails: 本番OUに全て適用されているか
  • [ ] AFT: アカウント作成フローがGitOps化されているか
  • [ ] ドリフト検出: 月次確認スケジュールが設定されているか

Service Catalog設計チェック

  • [ ] ポートフォリオ: チーム別・環境別で分割されているか
  • [ ] 製品バージョン: 廃止ポリシー(旧バージョン自動Inactive化)が実装されているか
  • [ ] Launch Constraint: 専用IAMロールでプロビジョニング権限が最小化されているか
  • [ ] 組織共有: 必要なOUに製品が共有されているか

CloudTrail Lake設計チェック

  • [ ] 組織トレイル: 全アカウント・全リージョンが対象になっているか
  • [ ] イベントデータストア: 管理イベント用とデータイベント用が分離されているか
  • [ ] ログファイル検証: 有効化されているか
  • [ ] KMS暗号化: Log ArchiveアカウントのS3バケットにSSE-KMSが適用されているか
  • [ ] CloudWatch Logs連携: リアルタイムアラートが設定されているか
  • [ ] Insights: 異常検出が有効化されているか

関連シリーズで知識を深める

IAM(第1軸)との統合

SCP × IAMポリシーの多層防御アーキテクチャは、第1軸のIAM本番運用シリーズで詳しく解説しています。Permission Boundary・SCPの相互作用と、Identity Centerを活用したシングルサインオン設計は、Organizationsと組み合わせることで真価を発揮します。

CloudTrail・Config(第18軸)との統合

CloudTrail Lakeの監査基盤に加え、Config Rulesによるリソースコンプライアンス継続評価、Auto Remediationによる非準拠リソースの自動修復は第18軸で解説しています。両シリーズを組み合わせることで、包括的なガバナンス・コンプライアンス基盤を構築できます。

Cost Optimization(第23軸)との統合

Budgets Actionsを用いたOU単位のコスト制御、Cost Explorerによる組織横断のコスト分析は第23軸で解説しています。Organizationsの組織タグポリシーと組み合わせることで、アカウント・チーム・プロジェクト単位の精密なコスト管理が実現します。

Management & Governance読者へのメッセージ

AWSのガバナンス基盤は「構築したら終わり」ではありません。組織が成長し、アカウント数が増え、規制要件が変化するにつれ、OU設計・SCP・Guardrails・Service Catalog製品は継続的に進化させる必要があります。

本記事で学んだ4層のガバナンスフレームワークを出発点として、以下のサイクルを継続してください。

1. 設計: OU階層・SCP・Guardrailsの初期設計をTerraform/CDKでコード化する
2. 自動化: AFTでアカウント作成を自動化し、Service Catalogで製品を標準化する
3. 監視: CloudTrail Lakeで全APIコールを監視し、Insightsで異常を検出する
4. 改善: ドリフト検出・コスト分析・コンプライアンスレポートをもとに定期的に設計を見直す

ガバナンス基盤が整うと、開発チームが安全に高速で開発できる「ゴールデンパス」が実現します。Management & Governance Vol1が、その第一歩となれば幸いです。