こんにちは。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": "*" } ] }
まとめ
サービスマネージド型とセルフマネージド型の違い(黄色)をまとめると以下の通りです。 実際には、スタックセットを実行する方法にも違いがあるため、今度、ブログにまとめたいと思います。