{CloudFormation}StackSets

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 ポリシーの作成 

vim policy01.json

{
    "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 ロールの作成

vim role01.json

{
  "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 ポリシーの作成 

vim policy02.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        }
    ]
}

aws iam create-policy \
--policy-name policy02 \
--policy-document file://policy02.json

 

-- 3.2 ロールの作成

vim role02.json

{
  "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 ポリシーの作成 

vim policy03.json

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        }
    ]
}

aws iam create-policy \
--policy-name policy03 \
--policy-document file://policy03.json

 

-- 4.2 ロールの作成

vim role03.json

{
  "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. スタックセットの作成

vim a.yaml

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