[アップデート]アカウントファクトリーからアカウントをカスタマイズできるAccount Factory Customization (AFC) が追加されました #reInvent

また一つControl Towerでアカウントセットアップする方法が増えました!
2022.11.29

どんなアップデート?

AWS Control Tower環境ではアカウントを発行する際にアカウントファクトリーから作成します。その際にカスタマイズした初期セットアップを行いたい場合、これまではCfCTやAFTなどが選択肢としてあったと思います。

今回のアップデートであるAccount Factory Customization (以下AFC)もほぼ同様の機能です。ただし、デプロイ状況がControl Towerのコンソールからも確認でき、アカウント発行時に展開するテンプレートをアカウントファクトリーのコンソールから選択できます。そのため、その他のツールよりも直感的に利用しやすいというメリットがありそうです。

やってみる

それでは早速触っていきましょう。手順は以下ドキュメントに沿って行っていきます。

Customize accounts with Account Factory Customization (AFC) - AWS Control Tower

Service Catalogの管理者を委任

AFCではService Catalogと連携してリソースを展開します。そのためService Catalogの管理者を別アカウントに委任しておきます。(Service Catalogをマルチアカウントで利用する際は管理者を委任するのがベストプラクティスです。)

以下のコマンドを管理アカウント上で実行してください。

aws organizations register-delegated-administrator \
--account-id {委任先のアカウントID} \
--service-principal servicecatalog.amazonaws.com

レスポンスはないですが、エラーが表示されなければOKです。

AWSControlTowerBlueprintAccess IAMロールの作成

次に委任先のアカウントでAWSControlTowerBlueprintAccessという名前でIAMロールを作成する必要があります。このIAMロールは、Control Tower側から展開されたService Catalogの製品を管理するために使用します。

今回はControl Towerのガードレールにより直接IAMロールを作成できなかったので、StackSetsを使って管理アカウントから委任先へIAMロールを作成します。(詳細は後述します。)

Principalは環境に併せて変更してください。

  • AWS Control Tower 管理アカウントで AWS Control Tower を実行するプリンシパル (IAM ユーザー)
  • AWS Control Tower 管理アカウントのAWSControlTowerAdmin ロール
AWSTemplateFormatVersion: "2010-09-09"
Description: A sample cloudformation template
Resources:
  SampleIamRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: "Allow"
            Action: "sts:AssumeRole"
            Principal:
              AWS:
                - "arn:aws:iam::YourManagementAccountId:role/service-role/AWSControlTowerAdmin", 
                - "arn:aws:iam::YourManagementAccountId:role/YourControlTowerUserRole"
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AWSServiceCatalogAdminFullAccess
      RoleName: AWSControlTowerBlueprintAccess

StackSets経由でIAMロールを作成できたら、次の手順に進みましょう。

製品の作成[Service Catalog委任先]

セットアップで使用する製品を作成します。詳細な手順は以下を参照してください。

製品の作成 - AWS Service Catalog

今回はS3バケットを作成するだけのテンプレートで作成しました。実際に利用する際は、ここでアカウントにセットアップしたい内容を記述していく形になります。

AWSTemplateFormatVersion: "2010-09-09"

Description: This CloudFormation template to create S3 Bucket

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub service-catalog-bucket-${AWS::AccountId}-${AWS::Region}
      AccessControl: Private
      PublicAccessBlockConfiguration:
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True

製品が作成できたら準備完了です。

アカウントファクトリーからアカウントを発行

管理アカウントでControl Towerからアカウント発行してみます。

アカウントファクトリーのコンソールを入力していくと、新しく以下の入力項目がありました。

AWS Service Catalog の製品を含むアカウントに委任先のアカウントIDを入力してアカウントを検証をクリックします。Service Catalogで作成した製品の一覧がプルダウンで選択できるはずです。

今回はS3BucketCreateという製品を作成していたので選択しています。バージョンを選択したらアカウントを作成しましょう。

作成されたリソースを確認

アカウントのセットアップにはしばらく時間がかかるので待ちましょう。今回のアップデートでControl Towerコンソールの「組織」から、アカウントファクトリーで追加したブループリントに関する情報が確認できるようになっていました。

ステータスがActriveになればデプロイが完了しているはずです。

作成したアカウントを確認すると、AFCで設定した製品によってS3バケットが作成されていました。今回はControl Tower管理リージョンに対してデプロイしたので、東京とバージニア北部2つに作成されています。

というわけで、Service Catalogで製品を作成しただけで新規アカウントにリソースをデプロイできてしまいました。

補足:なぜ委任先で直接IAMロールを作成しないのか

今回AWSControlTowerBlueprintAccessのIAMロールをStackSetsから作成するという面倒な手順を踏んでいるのですが、以下のエラーによって作成できなかったことが理由です。どうやらSCPでIAMロールの作成が拒否されているようです。

調査したところ、原因としては以下の予防ガードレールによりAWSControlTowerという名前を含むIAMロールやポリシーに関する操作が拒否されていたためでした。

Disallow Changes to AWS IAM Roles Set Up by AWS Control Tower and AWS CloudFormation (AWS Control Tower と AWS CloudFormation によって設定された AWS IAM ロールへの変更を不許可にする)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "GRIAMROLEPOLICY",
      "Effect": "Deny",
      "Action": [
        "iam:AttachRolePolicy",
        "iam:CreateRole",
        "iam:DeleteRole",
        "iam:DeleteRolePermissionsBoundary",
        "iam:DeleteRolePolicy",
        "iam:DetachRolePolicy",
        "iam:PutRolePermissionsBoundary",
        "iam:PutRolePolicy",
        "iam:UpdateAssumeRolePolicy",
        "iam:UpdateRole",
        "iam:UpdateRoleDescription"
      ],
      "Resource": [
        "arn:aws:iam::*:role/aws-controltower-*",
        "arn:aws:iam::*:role/*AWSControlTower*",
        "arn:aws:iam::*:role/stacksets-exec-*"
      ],
      "Condition": {
        "ArnNotLike": {
          "aws:PrincipalArn": [
            "arn:aws:iam::*:role/AWSControlTowerExecution",
            "arn:aws:iam::*:role/stacksets-exec-*"
          ]
        }
      }
    }
  ]
}

後々対応されるかと思いますが、現状はStackSetsかAWSControlTowerExecutionのロールを使って作成する必要がありそうです。

おわりに

またControl Tower環境で新たなセットアップ手法が増えました。Control TowerとService Catalogへの理解はある程度必要になりますが、より手軽に初期セットアップ環境を整えることができる熱いアップデートです。

アカウントのセットアップをCloudFormationで行いたい時は、ガンガン利用していきましょう。

参考