AWS CloudFormation の StackSets とは
AWS CloudFormation StackSets と AWS Organizations - AWS Organizations
CloudFormation StackSets を使用すると、1 回のオペレーションで複数の AWS アカウント と AWS リージョン を対象に、スタックを作成、更新、削除できます。
CloudFormation スタックをマルチリージョン、マルチアカウントに展開できる機能です。
機能概要
- 複数のアカウントとリージョンでスタックの作成、更新、削除が可能
- AWS Organizations と統合されている
- AWS Organizations に追加されたアカウントへの自動デプロイが可能
- 委任管理者の指定が可能
- セルフマネージド型のアクセス許可とサービスマネージド型のアクセス許可が存在する
ユースケース
AWS CloudFormation よくあるユースケースと質問
- マルチアカウント、リージョンに基本設定を展開したい場合
- 全リージョンで特定のサービスを有効化したい場合
- AWS Organizations のメンバーアカウントに一括でデプロイしたい場合
アクセス許可
StackSets の概念 - AWS CloudFormation
StackSets は、セルフマネージド型のアクセス許可、またはサービスマネージド型のアクセス許可のいずれかを使用して作成できます。
- セルフマネージド型のアクセス許可
- ユーザー自身でデプロイに必要な IAM ロールを各アカウントに作成
- 管理アカウントへのデプロイが可能
- サービスマネージド型のアクセス許可
- AWS Organizations 管理下のアカウントにデプロイ
- デプロイに必要な IAM ロールが自動的に作成される
- 管理アカウントにはデプロイされない
セルフマネージド型のアクセス許可を試してみた
セルフマネージド型のアクセス許可を持つ CloudFormation StackSets の作成 - AWS CloudFormation
セルフマネージド型のアクセス許可で管理者アカウントからターゲットアカウントに VPC を作成するテンプレートをデプロイしてみました。
01. 管理者アカウントに IAM ロールを作成
セルフマネージド型のアクセス許可を付与する - AWS CloudFormation
まずは以下の内容で IAM ポリシーを作成します。
{
"Version":"2012-10-17",
"Statement": [
{
"Action": [
"sts:AssumeRole"
],
"Resource": [
"arn:aws:iam::*:role/AWSCloudFormationStackSetExecutionRole"
],
"Effect": "Allow"
}
]
}
続いて、以下の内容で管理者アカウントに IAM ロールを作成しました。
- ロール名: AWSCloudFormationStackSetAdministrationRole
- ポリシー: 上記で作成したポリシー
- 信頼関係: 以下の通り
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "cloudformation.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}


02. ターゲットアカウントに IAM ロールを作成
以下の内容でターゲットアカウントに IAM ロールを作成しました。
- ロール名: AWSCloudFormationStackSetExecutionRole
- ポリシー: AdministratorAccess
- 信頼関係: 管理者アカウントからの AssumeRole を許可
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:root"
},
"Action": "sts:AssumeRole"
}
]
}


03. 管理者アカウントからデプロイ
以下の CloudFormation テンプレートをデプロイします。
AWSTemplateFormatVersion: "2010-09-09"
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
Tags:
- Key: Name
Value: my-vpc
管理者アカウントの CloudFormation コンソールから StackSets を選択してスタックセットを作成します。

以下の設定でデプロイします。
- アクセス許可モデル: セルフサービスのアクセス許可
- IAM 管理ロール ARN: AWSCloudFormationStackSetAdministrationRole
- IAM 実行ロール名: AWSCloudFormationStackSetExecutionRole
- テンプレート: 上記で作成したテンプレート
- スタックセット名: vpc
- 新しいスタックのデプロイ
- デプロイ先: スタックをアカウントにデプロイ
- アカウント番号: ターゲットアカウントの ID
- リージョン: 東京
上記以外はデフォルト設定です。






04. デプロイ結果の確認
デプロイ後にオペレーションが SUCCEEDED になっていることを確認します。

ターゲットアカウントに my-vpc という VPC が作成されていることを確認します。

また、ターゲットアカウントに CloudFormation スタックが作成されていることも確認できます。

セルフマネージド型のアクセス許可でターゲットアカウントにスタックをデプロイできました。
サービスマネージド型のアクセス許可を試してみた
サービスマネージド型のアクセス許可を持つ CloudFormation StackSets の作成 - AWS CloudFormation
サービスマネージド型のアクセス許可で管理者アカウントからメンバーアカウントに VPC を作成するテンプレートをデプロイしてみました。
前提
サービスマネージド型のアクセス許可を持つ CloudFormation StackSets の作成 - AWS CloudFormation
サービスマネージド型のアクセス許可を持つ StackSet を作成または更新するには、信頼されたアクセスが必要です。
AWS Organizations で CloudFormation StackSets の信頼されたアクセスを有効化してあります。

01. 管理者アカウントからデプロイ
デプロイするテンプレートはセルフマネージド型のアクセス許可のテンプレートと同様です。
以下の設定でデプロイします。
- アクセス許可モデル: サービスマネージドアクセス許可
- テンプレート: 上記で作成したテンプレート
- スタックセット名: vpc
- 新しいスタックのデプロイ
- デプロイターゲット: 組織単位 (OU) へのデプロイ
- AWS OU ID: メンバーアカウントが所属する OU ID
- リージョン: 東京
上記以外はデフォルト設定です。






02. デプロイ結果の確認
デプロイ後にオペレーションが SUCCEEDED になっていることを確認します。

メンバーアカウントに my-vpc という VPC が作成されていることを確認します。

また、メンバーアカウントに CloudFormation スタックが作成されていることも確認できます。

サービスマネージド型のアクセス許可でメンバーアカウントにスタックをデプロイできました。
まとめ
今回は AWS CloudFormation の StackSets について紹介しました。
どなたかの参考になれば幸いです。
Discussion