
AWS ControlTowerのカスタマイズ(CfCT)がルートとネストされたOUをサポートしたのでやってみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Control Towerのカスタマイズソリューション(CfCT)がネストOUとRootに対応したようなので、早速試してみました。
アップデートの経緯
これまではControl Tower自体がOUをネストして配置できなかったため、フラットなOU構成をとらなければいけなかったのですが、以下のアップデートでネストしたOU構成が可能となりました。
[アップデート] AWS Control Tower で入れ子構造の OU を利用できる様になりました | DevelopersIO
元々Control TowerでネストしたOUの構成が取れなかったので、CfCT側でも同様にネストしたOUに対しては実行できませんでした。それがControl Towerのアップデートが行われたため、追いついた形で利用できるようになったわけです。それと合わせてRoot(全アカウント)への実行も対応しています。
やってみる
それではCfCTでネストされたOUに対してCloudFormationスタックを展開してみます。(CfCTの展開方法については割愛します。)今回はCloudFormationスタックの展開のみを行いますが、SCPの展開も同じように可能です。
OU構成は以下の通りです。devOUに対してアカウントを配置して、CloudFormationテンプレートをCfCTから展開してみます。
Root
 ├ Security
 └ Sandbox
    └ dev
CfCTの更新
私の環境では既にCfCTが展開済みだったので、新しいバージョン(v2.2.0)へCfCTのスタックをアップデートします。
CloudFormationスタックの一覧からCustomizationsForCTSolutionを選択して更新をクリックします。

既存のテンプレートを置き換えるをクリックして、テンプレートはS3のURLを入力します。入力するURLは以下の通りです。
https://s3.amazonaws.com/solutions-reference/customizations-for-aws-control-tower/latest/custom-control-tower-initiation.template

その他の項目はデフォルトで大丈夫なので、そのまま更新します。
スタックのステータスがUPDATE_COMPLETEになっていること、説明のバージョンがv2.2.0になっていることを確認しましょう。

CfCTの構成
次にCfCTで展開するCloudFormationテンプレートと定義するマニフェストファイルですが、以下のような単純なフォルダ構成です。
.
├ manifest.yaml
└ template
    └ describe-regions-iam-role.yaml
CloudFormationテンプレート(describe-regions-iam-role.yaml)
IAMロールを展開するだけのテンプレート。
Resources:
  TestLambdaRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      Path: /
      Policies:
        - PolicyName: DescribeRegions
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - ec2:DescribeRegions
                Resource: "*"
マニフェストファイル(manifest.yaml)
---
region: ap-northeast-1 # Control Tower Home Region
version: 2021-03-15
resources:
  - name: describe-regions-iam-role
    description: Control Tower Custom CloudFormation Resources - Create IAM Role
    resource_file: template/describe-regions-iam-role.yaml
    deploy_method: stack_set
    deployment_targets:
      organizational_units:
        - Sandbox:dev
    regions:
      - ap-northeast-1
ネストされたOUを対象にする場合、親OU:子OUという形式で記述します。
上記のフォルダ構成をCfCTのリポジトリにプッシュします。
動作確認
用意したフォルダをCodeCommitへプッシュすると、CodePipelineが動き始めます。パイプラインが完了するまでしばらく待ちましょう。
ここでCfCTが古いバージョン(v2.1.0以下)のまま進めてしまうと、パイプラインは成功となりますがネストされたOU内のアカウントにはスタックが作成されません。注意しましょう。
パイプラインが完了したら、devOU配下のアカウントにログインしてCloudFormationスタックを確認してみると、問題なくCfCTから展開されていることが確認できました。

実行先をRootにしてみる
Rootにも対応してるみたいなので、実行対象をRootに変更して実行してみます。
マニフェストファイル(manifest.yaml)
---
region: ap-northeast-1 # Control Tower Home Region
version: 2021-03-15
resources:
  - name: describe-regions-iam-role
    description: Control Tower Custom CloudFormation Resources - Create IAM Role
    resource_file: template/describe-regions-iam-role.yaml
    deploy_method: stack_set
    deployment_targets:
      organizational_units:
        - Root
    regions:
      - ap-northeast-1
上記のようにマニフェストファイルを書き換えて実行すると、Root配下全てのアカウントに対して実行されます。そのため、Sandbox OUだけでなくSecurity OU含めた全てのアカウントにIAMロールが作成されました。全てのアカウントに対して実行したい場合にとても便利ですね。
まとめ
ネストされたOUとRootを対象にCfCTを実行してみました。最初はCfCTがControl Towerのアップデートにどの程度の速さで対応してくれるのか不安もありましたが、今回は2ヶ月弱で対応してくれました。今後も継続的にサポートしてくれると思うので、どんどん活用していきたいですね。










