AWS Control TowerのAccount Factory Customization(AFC)を既存アカウントに適用する #reInvent

2022.12.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS re:Invent 2022にて Control Tower の AFC(Account Factory Customization)が発表されました。

AWSアカウントを新規作成する際に、Service Catalog製品 (=CloudFormationテンプレート)を選択できます。 選択した製品が新規AWSアカウント作成後に展開されます。 AWSアカウントのベースラインカスタマイズに役立ちます。

今回はAFCを既存アカウント(=AFCを今まで使ってこなかったアカウント)に適用してみます。

※AFCを使うためのセットアップ、および新規アカウント作成時のAFC適用については 前述の アップデートブログ を参照下さい。

前提

今回使うAWSアカウントは以下のとおりです。

  • 管理アカウント : Organizations/Control Tower の管理アカウント
  • Service Catalog 委任先アカウント : Service Catalog のOrganizations連携 委任先アカウント (= 展開したい製品が格納されているアカウント)
  • メンバーアカウント : Control Tower管理下の既存アカウント

Service Catalog 委任先アカウントには展開しようとしている 製品を、事前に作成しています。

img

また、そのほか Preparation for customizationSet up for customization に記載されている 以下項目はすでに完了しているものとします。

  • CloudFormation と Service Catalog のOrganizations連携有効化
  • Service Catalog の委任設定
  • Service Catalog 委任先アカウントへの必要なIAMロール展開 ※ 「補足」章に実際に使ったテンプレートを記載しています

やってみる

管理アカウントにて既存アカウントのページに移動します。 [アカウントの更新] を選択します。

img

アクセス設定や組織単位はそのままにして、 [カスタムアカウントファクトリ] 部分を開きます。

AWS Service Catalog の製品を含むアカウント 部分に Service Catalog 委任先アカウントを記入して [アカウントを検証] を選択します。

img

※ ここで User: arn:aws:sts::...(略) is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::(Service Catalog 委任先アカウント):role/AWSControlTowerBlueprintAccess といったエラーが出た場合は、事前準備のIAMロール展開に不備がある可能性があります。

製品および製品バージョンを選択します。

img

デプロイメントリージョンは製品次第ですが、 今回は [すべての管理対象リージョン] としました。

最終的に以下のイメージのようになります。 問題なければ [アカウントの更新] を選択します。

img

ポップアップの内容を確認して再度 [アカウントの更新] を選択します。

img

アカウントの状態が 登録中 から 登録済み となれば完了です。 完了後は ブループリント名 などの情報が記載されていますね。

img

確認

今回使った製品は「IAMロール 1つのみ」を作成するシンプルなものでした。 それがメンバーアカウントに展開されているか確認します。

メンバーアカウントのIAMコンソールへアクセスします。

以下のように 「Control Tower 管理リージョン」の分だけリソースが 作成されていることを確認できました。

img

おわりに

既存アカウントへのAFC適用を試してみました。 最初のセットアップは少し手間ですが、それさえ完了すれば 手軽なベースライン作成ツールとして活用できそうです。

以上、参考になれば幸いです。

参考

補足

検証で使ったService Catalog製品のテンプレート

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  EC2Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub "IAMRoleFromAFC-${AWS::Region}"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service: "ec2.amazonaws.com"
            Action: "sts:AssumeRole"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"

AWSControlTowerBlueprintAccess IAMロール作成で使ったCloudFormationテンプレート

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::${管理アカウントID}:role/service-role/AWSControlTowerAdmin"
                - "arn:aws:iam::${管理アカウントID}:role/${管理アカウントにアクセスするロール名}"
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AWSServiceCatalogAdminFullAccess
        - arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
      RoleName: AWSControlTowerBlueprintAccess