Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CDK 初心者が AWS Control Tower の landing zone をコード化...

Avatar for いたくら いたくら
February 01, 2026
54

CDK 初心者が AWS Control Tower の landing zone をコード化してみた

JAWS-UG 茨城 #11 CDK支部コラボ回
セッション登壇枠「CDK 初心者が AWS Control Tower の landing zone をコード化してみた」
https://jawsug-ibaraki.connpass.com/event/379428/

Avatar for いたくら

いたくら

February 01, 2026
Tweet

More Decks by いたくら

Transcript

  1. ⽬次 2 • なぜ CDK で設定してみようと思ったか • AWS Control Tower

    の landing zone とは • CDK でコード化してみた • ハマりポイント • まとめ
  2. なぜ CDK で設定してみようと思ったか 4 きっかけ • これまでマネジメントコンソールからしか landing zone を設定したことがなかった

    • マネコンで設定変更履歴は追えるが差分を把握するのは⼤変(CloudTrail 頼み) • IaC を使⽤した設定を試してみたい • やったことないけど、CDK でも設定できるだろうな ◦ → やってみよう!😄
  3. AWS Control Tower の landing zone とは 6 • AWS

    Control Tower とは ◦ AWS 上でマルチアカウント環境を安全かつ効率的に構築‧管理するためのサービス • landing zone とは ◦ マルチアカウント環境の基盤設定 ▪ 管理対象リージョン ▪ CloudTrail / Config のログ集約 ▪ 監査⽤のクロスアカウントロール作成 ▪ Config の設定 • 2025 年 11 ⽉に landing zone の新しいバージョン 4.0 がリリース ◦ 以前のバージョンに⽐べて選択できるパラメータが増加 ※AWS Black Belt Online Seminar AWS Control Tower 基礎編 より引用
  4. CDK プロジェクト構成 8 cdk-landing-zone/ ├── bin/ │ └── cdk-landing-zone.ts #

    エントリーポイント ├── lib/ │ └── cdk-landing-zone-stack.ts # Stack定義 ├── package.json ├── tsconfig.json └── cdk.json • bin/ : 環境固有の設定値を定義(アカウント ID、リージョン等) • lib/ : リソース構成を定義(今回は landing zone) • cdk.json : CDK の動作設定
  5. コード全体像 - Stack 定義 9 export interface LandingZoneStackProps extends cdk.StackProps

    { landingZoneVersion: string; governedRegions: string[]; loggingAccountId: string; loggingBucketRetentionDays: number; enableCentralizedLogging: boolean; enableSecurityRoles: boolean; enableConfig: boolean; enableAccessManagement: boolean; enableAutoEnrollment: boolean; } • interface を使⽤した理由 ◦ 必須項⽬の漏れや型の間違いをエディターが警告してくれるため
  6. コード全体像 - manifest 定義 10 const manifest: Record<string, unknown> =

    { governedRegions: props.governedRegions, centralizedLogging: { accountId: props.loggingAccountId, configurations: { loggingBucket: { retentionDays: 365 } }, enabled: props.enableCentralizedLogging, }, securityRoles: { enabled: props.enableSecurityRoles }, accessManagement: { enabled: props.enableAccessManagement }, config: { enabled: props.enableConfig }, }; new controltower.CfnLandingZone(this, 'LandingZone', { manifest, version: props.landingZoneVersion, }); • CfnLandingZone は L1 Construct (CloudFormation を TypeScript で書けるようにしたもの) manifest : landing zone の設定内容を定義するオブジェクト
  7. manifest の構造(LZ v4.0) 11 • v3.3 以前では暗黙的に有効だったセクションがあった • v4.0 からはセクションを記載したら

    enable フラグは必須(書き忘れると API エラー) セクション 説明 今回の設定 governedRegions 管理対象リージョン ap-northeast-1, us-east-1 centralizedLogging ログ集約設定 有効 securityRoles セキュリティロール 無効 accessManagement IAM Identity Center 連携 無効 config AWS Config 統合 無効 ※ 他に backup(AWS Backup 統合)もあるが、今回は未使⽤
  8. コンソール設定は事前準備をよしなにやってくれていた 13 • CDK / API では事前準備が必要 • コンソールでの設定では、これらすべて⾃動でやってくれていた😭 項目

    コンソール CDK / API 統合アカウント作成 (Audit/LogArchive) ⾃動 ⼿動 OU 作成‧統合アカウント配置 ⾃動 ⼿動 サービスロール作成 ⾃動 ⼿動 AWSControlTowerExecution ロール作成 ⾃動 ⼿動
  9. 事前準備 (2) OU作成‧統合アカウント配置 15 • コンソールではウィザード内で⾃動作成される 注意 : アカウントがルート直下にあると   

    landing zone 構築が失敗するので、    統合アカウントは Security OU 相当の OU へ移動させましょう # OU作成 aws organizations create-organizational-unit \ --parent-id r-xxxx --name "Security" # 統合アカウントをOUに移動 aws organizations move-account \ --account-id 123456789012 \ --source-parent-id r-xxxx \ --destination-parent-id ou-xxxx
  10. 事前準備 (3) サービスロール作成 16 • Control Tower がランディングゾーン構築作業を⾏うために必要なサービスロール • ランディングゾーン構築前に管理アカウント上で⽤意しておく

    • コンソールでは裏側で⾃動作成される 参考: Step 1: Configure your landing zone - AWS Control Tower ロール名 用途 AWSControlTowerAdmin Control Tower サービスの操作⽤ AWSControlTowerCloudTrailRole CloudTrail の設定‧管理⽤ AWSControlTowerConfigAggregatorRoleFor Organizations Config アグリゲータの組織統合⽤ AWSControlTowerStackSetRole メンバーアカウントへのデプロイ⽤
  11. 事前準備 (4) AWSControlTowerExecution ロール作成 17 • メンバーアカウント(今回の場合 LogArchiveアカウント)に作成が必要 ◦ 信頼ポリシー:

    管理アカウントからの AssumeRole を許可 ◦ ポリシー: AdministratorAccess • コンソールでは裏側で⾃動作成される { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::管理アカウントID:root" }, "Action": "sts:AssumeRole" }] }
  12. 設定の依存関係もコンソールと API で違う 18 • CDK/API : 明⽰的に enabled:false を設定しないとバリデーションエラー

    • コンソール : Config を無効にすると、Identity Center、Backup が選択不可になる コンソール CDK / API Config 統合無効時 依存する設定が ⾃動でグレーアウト ⼿動ですべて無効にしないと エラー
  13. 他にもコンソールと API で違う設定がある 19 参考:Controls that cannot be changed with

    the AWS Control Tower APIs - AWS Control Tower コンソール CDK / API ⾃動アカウント登録 remediationTypes:['INHERITANCE_DRIFT'] リージョン拒否コントロール API ⾮対応(コンソールのみ) フルセット or Control-Only 明⽰的フラグなし(manifest 内容で決まる)
  14. まとめ 21 • CDK 初⼼者でもコード化できた! ◦ CfnLandingZone は L1 Construct

    なので CDK 固有の知識は最⼩限で済んだ • 難しいのは CDK ではなく landing zone ⾃体の理解 ◦ manifest の構造、設定の依存関係、v4.0 の仕様変更など • コンソールと CDK/API の差を知れたことが最⼤の学び ◦ コンソールは事前準備を⾃動でやってくれていた ◦ CDK/API では明⽰的な設定が必要 • landing zone の IaC 化は⼀概に推奨できない ◦ リージョン拒否コントロールなど、API ⾮対応の設定が存在する ◦ 完全な IaC 化には限界があり、コンソール操作との併⽤が必要