AWS ControlTowerのカスタマイズ(CfCT)がルートとネストされたOUをサポートしたのでやってみた

CfCTがControl Towerのアップデートに追いついてネストされたOUにも実行できるようになりました。
2022.01.05

Control Towerのカスタマイズソリューション(CfCT)がネストOUとRootに対応したようなので、早速試してみました。

Root and Nested Organizational Unit Support for Customizations for AWS Control Tower | Amazon Web Services

アップデートの経緯

これまでは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ヶ月弱で対応してくれました。今後も継続的にサポートしてくれると思うので、どんどん活用していきたいですね。