https://dev.classmethod.jp/articles/introducing-cloudformation-stacksets/
AWS CloudFormation StackSets は、複数のアカウントおよびリージョンのスタックを 1 度のオペレーションで、
作成、更新、削除できるようにすることで、スタックの機能を拡張します。
スタックセットのアクセス許可モデル
・セルフマネージド型 -->アカウントとリージョン間でデプロイするために StackSets で必要な IAM ロールを作成します。
・サービスマネージド型 -->AWS Organizations が管理するアカウントにスタックインスタンスをデプロイできます。
セルフマネージド型で確認する
-- 1. コマンド等のインストール
-- 1.1 aws cli version 2 インストール
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
-- 2. AWSCloudFormationStackSetAdministrationRole という名前の IAMロールを作成
-- 2.1 ポリシーの作成
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"sts:AssumeRole"
],
"Resource": [
"arn:aws:iam::*:role/AWSCloudFormationStackSetExecutionRole"
],
"Effect": "Allow"
}
]
}
aws iam create-policy \
--policy-name policy01 \
--policy-document file://policy01.json
-- 2.2 ロールの作成
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "cloudformation.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
aws iam create-role \
--role-name AWSCloudFormationStackSetAdministrationRole \
--assume-role-policy-document file://role01.json
-- 2.3 ポリシーをロールにアタッチ
aws iam attach-role-policy --policy-arn arn:aws:iam::999999999999:policy/policy01 --role-name AWSCloudFormationStackSetAdministrationRole
-- 3. AWSCloudFormationStackSetExecutionRole という名前の IAMロールを作成
-- 3.1 ポリシーの作成
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
aws iam create-policy \
--policy-name policy02 \
--policy-document file://policy02.json
-- 3.2 ロールの作成
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::999999999999:root"
},
"Action": "sts:AssumeRole"
}
]
}
aws iam create-role \
--role-name AWSCloudFormationStackSetExecutionRole \
--assume-role-policy-document file://role02.json
-- 3.3 ポリシーをロールにアタッチ
aws iam attach-role-policy --policy-arn arn:aws:iam::999999999999:policy/policy02 --role-name AWSCloudFormationStackSetExecutionRole
-- 4. AWSCloudFormationStackSetExecutionRole という名前の IAMロールを作成
-- ターゲットアカウントでの作業
-- 4.1 ポリシーの作成
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
aws iam create-policy \
--policy-name policy03 \
--policy-document file://policy03.json
-- 4.2 ロールの作成
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::999999999999:root"
},
"Action": "sts:AssumeRole"
}
]
}
aws iam create-role \
--role-name AWSCloudFormationStackSetExecutionRole \
--assume-role-policy-document file://role03.json
-- 4.3 ポリシーをロールにアタッチ
aws iam attach-role-policy --policy-arn arn:aws:iam::888888888888:policy/policy03 --role-name AWSCloudFormationStackSetExecutionRole
-- 5. スタックセットの作成
AWSTemplateFormatVersion: "2010-09-09"
Description: Provision RDS
Resources:
RDS:
Type: AWS::RDS::DBInstance
Properties:
DBInstanceIdentifier: mysql01
Engine: MySQL
EngineVersion: 8.0.25
DBInstanceClass: db.t3.micro
AllocatedStorage: 20
StorageType: gp2
MasterUsername: root
MasterUserPassword: 'password'
PubliclyAccessible: false
MultiAZ: false
AutoMinorVersionUpgrade: false
EnablePerformanceInsights : false
BackupRetentionPeriod: 1
Tags:
- Key: Name
Value: mysql01
DeletionPolicy: Delete
aws cloudformation create-stack-set \
--stack-set-name stackset01 \
--template-body file://a.yaml
aws cloudformation list-stack-sets
aws cloudformation create-stack-instances \
--stack-set-name stackset01 \
--accounts '["999999999999","888888888888"]' \
--regions '["ap-northeast-1","ap-northeast-3"]' \
--operation-preferences FailureToleranceCount=1,MaxConcurrentCount=2
aws cloudformation describe-stack-set-operation \
--stack-set-name stackset01 \
--operation-id 9fd88966-66dc-4636-8128-5c6295182c1d
ステータスは、OUTDATED => CURRENTとなる
-- 6. クリーンアップ
-- スタックセットからのスタックインスタンスの削除
aws cloudformation delete-stack-instances \
--stack-set-name stackset01 \
--accounts '["999999999999","888888888888"]' \
--regions '["ap-northeast-1","ap-northeast-3"]' \
--operation-preferences FailureToleranceCount=1,MaxConcurrentCount=2 \
--no-retain-stacks
aws cloudformation describe-stack-set-operation \
--stack-set-name stackset01 \
--operation-id 5e40f11d-bf01-46c0-a086-7006299974b5
-- スタックセット削除
aws cloudformation delete-stack-set \
--stack-set-name stackset01
aws cloudformation list-stack-sets
-- ロールとポリシーの削除
aws iam list-roles | grep AWSCloudFormationStackSetAdministrationRole
aws iam list-roles | grep AWSCloudFormationStackSetExecutionRole
aws iam detach-role-policy \
--role-name AWSCloudFormationStackSetAdministrationRole \
--policy-arn arn:aws:iam::999999999999:policy/policy01
aws iam detach-role-policy \
--role-name AWSCloudFormationStackSetExecutionRole \
--policy-arn arn:aws:iam::999999999999:policy/policy02
aws iam delete-role --role-name AWSCloudFormationStackSetAdministrationRole
aws iam delete-role --role-name AWSCloudFormationStackSetExecutionRole
aws iam list-policies | grep policy01
aws iam list-policies | grep policy02
aws iam delete-policy \
--policy-arn arn:aws:iam::999999999999:policy/policy01
aws iam delete-policy \
--policy-arn arn:aws:iam::999999999999:policy/policy02
-- ロールとポリシーの削除
-- ターゲットアカウントでの作業
aws iam list-roles | grep AWSCloudFormationStackSetExecutionRole
aws iam detach-role-policy \
--role-name AWSCloudFormationStackSetExecutionRole \
--policy-arn arn:aws:iam::888888888888:policy/policy03
aws iam delete-role --role-name AWSCloudFormationStackSetExecutionRole
aws iam list-policies | grep policy03
aws iam delete-policy \
--policy-arn arn:aws:iam::888888888888:policy/policy03