Slide 1

Slide 1 text

CDK 初⼼者が AWS Control Tower の landing zone をコード化してみた 2026/02/01 JAWS-UG 茨城 #11 CDK⽀部コラボ回

Slide 2

Slide 2 text

⽬次 2 ● なぜ CDK で設定してみようと思ったか ● AWS Control Tower の landing zone とは ● CDK でコード化してみた ● ハマりポイント ● まとめ

Slide 3

Slide 3 text

なぜ CDK で設定してみようと思ったか

Slide 4

Slide 4 text

なぜ CDK で設定してみようと思ったか 4 きっかけ ● これまでマネジメントコンソールからしか landing zone を設定したことがなかった ● マネコンで設定変更履歴は追えるが差分を把握するのは⼤変(CloudTrail 頼み) ● IaC を使⽤した設定を試してみたい ● やったことないけど、CDK でも設定できるだろうな ○ → やってみよう!😄

Slide 5

Slide 5 text

AWS Control Tower の landing zone とは

Slide 6

Slide 6 text

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 基礎編 より引用

Slide 7

Slide 7 text

CDK でコード化してみた

Slide 8

Slide 8 text

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 の動作設定

Slide 9

Slide 9 text

コード全体像 - 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 を使⽤した理由 ○ 必須項⽬の漏れや型の間違いをエディターが警告してくれるため

Slide 10

Slide 10 text

コード全体像 - manifest 定義 10 const manifest: Record = { 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 の設定内容を定義するオブジェクト

Slide 11

Slide 11 text

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 統合)もあるが、今回は未使⽤

Slide 12

Slide 12 text

ハマりポイント

Slide 13

Slide 13 text

コンソール設定は事前準備をよしなにやってくれていた 13 ● CDK / API では事前準備が必要 ● コンソールでの設定では、これらすべて⾃動でやってくれていた😭 項目 コンソール CDK / API 統合アカウント作成 (Audit/LogArchive) ⾃動 ⼿動 OU 作成‧統合アカウント配置 ⾃動 ⼿動 サービスロール作成 ⾃動 ⼿動 AWSControlTowerExecution ロール作成 ⾃動 ⼿動

Slide 14

Slide 14 text

事前準備 (1) 統合アカウント作成 14 ● LogArchiveアカウント(ログ集約⽤)を事前に作成 ● コンソールではウィザード内で⾃動作成される aws organizations create-account \ --account-name "LogArchive" \ --email "[email protected]"

Slide 15

Slide 15 text

事前準備 (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

Slide 16

Slide 16 text

事前準備 (3) サービスロール作成 16 ● Control Tower がランディングゾーン構築作業を⾏うために必要なサービスロール ● ランディングゾーン構築前に管理アカウント上で⽤意しておく ● コンソールでは裏側で⾃動作成される 参考: Step 1: Configure your landing zone - AWS Control Tower ロール名 用途 AWSControlTowerAdmin Control Tower サービスの操作⽤ AWSControlTowerCloudTrailRole CloudTrail の設定‧管理⽤ AWSControlTowerConfigAggregatorRoleFor Organizations Config アグリゲータの組織統合⽤ AWSControlTowerStackSetRole メンバーアカウントへのデプロイ⽤

Slide 17

Slide 17 text

事前準備 (4) AWSControlTowerExecution ロール作成 17 ● メンバーアカウント(今回の場合 LogArchiveアカウント)に作成が必要 ○ 信頼ポリシー: 管理アカウントからの AssumeRole を許可 ○ ポリシー: AdministratorAccess ● コンソールでは裏側で⾃動作成される { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::管理アカウントID:root" }, "Action": "sts:AssumeRole" }] }

Slide 18

Slide 18 text

設定の依存関係もコンソールと API で違う 18 ● CDK/API : 明⽰的に enabled:false を設定しないとバリデーションエラー ● コンソール : Config を無効にすると、Identity Center、Backup が選択不可になる コンソール CDK / API Config 統合無効時 依存する設定が ⾃動でグレーアウト ⼿動ですべて無効にしないと エラー

Slide 19

Slide 19 text

他にもコンソールと 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 内容で決まる)

Slide 20

Slide 20 text

まとめ

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

おまけ

Slide 23

Slide 23 text

おまけ 23 ● 今回作成したコードを使⽤して、landing zone を設定できました!

Slide 24

Slide 24 text

ありがとうございました!

Slide 25

Slide 25 text

No content