こんにちは。AWS CLIが好きな福島です。
はじめに
今回は、案件でCloudFormationのStackSetsを利用いたしましたので、その内容をブログに記載いたします。
※本ブログのまとめを最後の方に記載しておりますため、お時間がない方は、そちらを見ていただければ幸いです。
StackSetsとは
複数のアカウントおよびリージョンのスタックを 1度のオペレーションで、作成、更新、削除できる機能となります。
ユースケース
例えば、複数のAWSアカウントを利用する時にAWS ConfigやCloudTrailなど、
全部のAWSアカウントに共通で有効にしたいサービスがあると思います。
そのような場合、個々のAWSアカウントにCloudFormationのスタックを 作成していると手間がかかる上、管理も煩雑になってしまいます。
その問題を解決するのがCloudFormationのStackSetsという機能になります。
イメージ図
StackSetsのイメージ図は、以下の通りです。 複数アカウントのスタックを管理する管理アカウント(図の左)が存在し、 そのアカウントからターゲットアカウント(図の右)に対して、スタック操作の命令を実行します。

StackSetsの仕組み
管理アカウントからターゲットアカウントに、スタックを作成するためには、 IAMロールが管理アカウントおよびターゲットアカウントに必要になります。
そのIAMロールを準備する方法は、以下の通り、2パターン存在します。
- サービスマネージド型
AWS Organizationsの機能を使うパターン
※マスターアカウントが管理アカウントになります。 また、この機能を利用するためには、Organizationsの[全ての機能]を有効にする必要があります。 - セルフマネージド型
AWSが公開しているテンプレートを使い、手動でIAMロールを作成するパターン
※指定したアカウントを管理アカウントにできます。
サービスマネージド型の詳細
サービスマネージド型には、3つIAMロールが登場します。

それぞれのIAMロールの用途は、以下の通りです。
①AWSServiceRoleForCloudFormationStackSetsOrgAdmin
管理アカウントに作成されるロールになります。
スタックセット実行時に利用されるロールになります。
また、③のロールにスイッチできる権限が付与されています。
②AWSServiceRoleForCloudFormationStackSetsOrgMember
ターゲットアカウントに作成されるロールになります。
③を作成するロールになります。
③stacksets-exec-xxxxxxxxxxxx
ターゲットアカウントに作成されるロールになります。
(xxxxxxxxxxxxには、適当な文字列が入ります。)
ターゲットアカウントにスタックを作成する際に利用します。
管理アカウントの①のロールが信頼関係に結ばれます。
セルフマネージド型の詳細
セルフマネージド型には、2つのIAMロールが登場します。

それぞれのIAMロールの用途は、以下の通りです。
①AWSCloudFormationStackSetAdministrationRole
管理アカウントに作成するロールになります。
スタックセット実行時に利用されるロールになります。
また、②のロールにスイッチできる権限が付与されています。
②AWSCloudFormationStackSetExecutionRole
ターゲットアカウントに作成するロールになります。
ターゲットアカウントにスタックを作成する際に利用します。
また、指定した管理アカウントを信頼関係に結びます。
ここから上記2パターンのIAMロールの準備手順を記載いたします。
IAMロールの準備手順(サービスマネージド型)
いくつか方法があるため、今回はそのうちの1つをご紹介いたします。
詳細は、以下をご確認ください。 https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacksets-orgs-enable-trusted-access.html
IAMロール準備手順
Organizationsの画面で「設定」をクリックします。

「AWS CloudFormation StackSets」の「アクセスの有効化」をクリックします。

「アクセスを有効化」をクリックします。

設定が完了すると以下の画面が表示されます。

実際にサービスマネージド型でデプロイを行うまでは、IAMからロールを確認することはできません。 初回実行時に以下のIAMロールが作成されるようです。
- AWSServiceRoleForCloudFormationStackSetsOrgAdmin
- AWSServiceRoleForCloudFormationStackSetsOrgMember
- stacksets-exec-xxxxxxxxxxxx
IAMロールの詳細
それぞれで作成されるリソースの詳細は、以下の通りです。
①AWSServiceRoleForCloudFormationStackSetsOrgAdmin
- 信頼関係
stacksets.cloudformation.amazonaws.com - ポリシー
CloudFormationStackSetsOrgAdminServiceRolePolicy(AWSマネージドポリシー)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowsAWSOrganizationsReadAPIs",
"Effect": "Allow",
"Action": [
"organizations:List*",
"organizations:Describe*"
],
"Resource": "*"
},
{
"Sid": "AllowAssumeRoleInMemberAccounts",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::*:role/stacksets-exec-*"
}
]
}
②AWSServiceRoleForCloudFormationStackSetsOrgMember
- 信頼関係
member.org.stacksets.cloudformation.amazonaws.com - ポリシー
CloudFormationStackSetsOrgMemberServiceRolePolicy(AWSマネージドポリシー)
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iam:CreateRole",
"iam:DeleteRole",
"iam:GetRole"
],
"Effect": "Allow",
"Resource": [
"arn:aws:iam::*:role/stacksets-exec-*"
]
},
{
"Action": [
"iam:DetachRolePolicy",
"iam:AttachRolePolicy"
],
"Effect": "Allow",
"Resource": [
"arn:aws:iam::*:role/stacksets-exec-*"
],
"Condition": {
"StringEquals": {
"iam:PolicyARN": "arn:aws:iam::aws:policy/AdministratorAccess"
}
}
}
]
}
③stacksets-exec-xxxxxxxxxxxx
- 信頼関係
arn:aws:iam::xxxxxxxxxxxx:role/aws-service-role/stacksets.cloudformation.amazonaws.com/AWSServiceRoleForCloudFormationStackSetsOrgAdmin
※「xxxxxxxxxxxx」には、マスターアカウントのIDが入ります。 - ポリシー
AdministratorAccess (AWSマネージドポリシー)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
IAMロールの準備手順(セルフマネージド型)
セルフマネージド型の場合、AWSが公開しているテンプレートを利用し、 IAMロールを管理およびターゲットアカウントに作成する必要がございます。
また、最新の手順は、以下のAWS公式ドキュメントをご確認ください。 https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html#procedure
IAMロールの準備手順
管理アカウントには、以下のテンプレートを利用し、CloudFormationのスタックを作成します。
ターゲットアカウントには、以下のテンプレートを利用し、CloudFormationのスタックを作成します。
ターゲットアカウント用のIAMロール作成テンプレートには、 信頼関係を結ぶ管理アカウントのIDを入力するパラメーターがあります。

IAMロールの詳細
それぞれで作成したリソースの詳細は、以下の通りです。
①AWSCloudFormationStackSetAdministrationRole
- 信頼関係
cloudformation - ポリシー
AssumeRole-AWSCloudFormationStackSetExecutionRole(カスタム管理ポリシー)
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"sts:AssumeRole"
],
"Resource": [
"arn:*:iam::*:role/AWSCloudFormationStackSetExecutionRole"
],
"Effect": "Allow"
}
]
}
②AWSCloudFormationStackSetExecutionRole
- 信頼関係
パラメーターに指定したAWSアカウント - ポリシー
AdministratorAccess (AWSマネージドポリシー)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
まとめ
サービスマネージド型とセルフマネージド型の違い(黄色)をまとめると以下の通りです。 実際には、スタックセットを実行する方法にも違いがあるため、今度、ブログにまとめたいと思います。
