この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
どんなアップデート?
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委任先]
セットアップで使用する製品を作成します。詳細な手順は以下を参照してください。
今回は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ロールやポリシーに関する操作が拒否されていたためでした。
{
"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で行いたい時は、ガンガン利用していきましょう。
参考
- Introducing account customization within AWS Control Tower
- Customize accounts with Account Factory Customization (AFC) - AWS Control Tower
- Control Towerカスタマイズソリューション(CfCT)を使ってガードレールとCloudFormationを自動展開してみた | DevelopersIO
- ついにControl Towerのアカウント発行からカスタマイズまでIaC対応!Account Factory for Terraform (AFT)が新登場 #reinvent | DevelopersIO