
CloudFormation StackSetsで複数アカウント・複数リージョンへ簡単にデプロイする
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
複数のAWSカウントやリージョンで同時にデプロイしたい内容があるとき、一括でデプロイできると便利ですよね。 実際に試してみました。
おすすめの方
- CloudFormation StackSetsを知りたい方
- CloudFormation StackSetsの方法を知りたい方
- CloudFormation StackSetsの方法を共有したい方
CloudFormation StackSetsを使ったデプロイ
CloudFormation StackSetsを使えば、下記のようなデプロイが一括で可能です。便利!!!
- 1つのAWSアカウントの複数リージョン
- 複数のAWSアカウントの1つのリージョン
- 複数のAWSアカウントの複数のリージョン
CloudFormation StackSetsの準備をする
指示するIAMロールと実行するIAMロールを作成します。なお、同じAWSアカウントでも、これら2つのIAMロールが必要です。
- CloudFormation StackSetsを指示するIAMロール
- AWSCloudFormationStackSetAdministrationRole
 
- CloudFormation StackSetsを実行するIAMロール
- AWSCloudFormationStackSetExecutionRole
 
CloudFormation StackSetsを指示するIAMロール
CloudFormationで作成する
下記のCloudFormationテンプレートを利用します。これはAWSドキュメントの内容そのままです。
CloudFormation StackSetsを実行するIAMロール(AWSCloudFormationStackSetExecutionRole)にAssumeRoleする権限のみを持ちます。
AWSTemplateFormatVersion: 2010-09-09
Description: Configure the AWSCloudFormationStackSetAdministrationRole to enable use of AWS CloudFormation StackSets.
Resources:
  AdministrationRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: AWSCloudFormationStackSetAdministrationRole
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: cloudformation.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      Policies:
        - PolicyName: AssumeRole-AWSCloudFormationStackSetExecutionRole
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - sts:AssumeRole
                Resource:
                  - "arn:*:iam::*:role/AWSCloudFormationStackSetExecutionRole"
下記でデプロイできます。WebコンソールのCloudFormation画面でポチポチしてもOKです。
aws cloudformation deploy \
    --template-file AWSCloudFormationStackSetAdministrationRole.yml \
    --stack-name CloudFormation-StackSets-Admin-Role-Stack \
    --capabilities CAPABILITY_NAMED_IAM
作成されたIAMロールは、下記です。AssumeRoleする権限のみを有しています。
CloudFormation StackSetsを実行するIAMロール
CloudFormationで作成する
下記のCloudFormationテンプレートを利用します。これはAWSドキュメントの内容そのままです。
信頼するAWSアカウント(指示する側)がAssumeRoleでき、AdministratorAccessの権限を持ちます。
AWSTemplateFormatVersion: 2010-09-09
Description: Configure the AWSCloudFormationStackSetExecutionRole to enable use of your account as a target account in AWS CloudFormation StackSets.
Parameters:
  AdministratorAccountId:
    Type: String
    Description: AWS Account Id of the administrator account (the account in which StackSets will be created).
    MaxLength: 12
    MinLength: 12
Resources:
  ExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: AWSCloudFormationStackSetExecutionRole
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              AWS:
                - !Ref AdministratorAccountId
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - !Sub arn:${AWS::Partition}:iam::aws:policy/AdministratorAccess
下記でデプロイできます。WebコンソールのCloudFormation画面でポチポチしてもOKです。
「指示する側のAWSアカウントID」の指定も忘れず行います。同じAWSアカウントでも必要です。
aws cloudformation deploy \
    --template-file AWSCloudFormationStackSetExecutionRole.yml \
    --stack-name CloudFormation-StackSets-Execution-Role-Stack \
    --capabilities CAPABILITY_NAMED_IAM \
    --parameter-overrides AdministratorAccountId=111111111111
作成されたIAMロールは、下記です。AssumeRoleする権限のみを有しています。
CloudFormation StackSetsでデプロイする
下準備ができたので、ようやく本題です。サンプルとして、SNSトピックをデプロイしてみます。
- 1つのAWSアカウントの複数リージョン
CloudFormationテンプレート
サンプルなので超シンプルです。
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  SampleSnsTopic:
    Type: AWS::SNS::Topic
デプロイする
CloudFormationにアクセスし、左側のメニューからStackSetsを選択します。
StackSetsを作成していきます。テンプレートファイルをアップデートします。
続いて、StackSet名を適当に入力します。StackSetの説明とパラメータはそのままでOKです。
続いて、IAMロールを選択します。ここでは、最初に作成したIAMロールをそれぞれ選択します。(指示する側、実行する側)
続いて、デプロイ先のAWSアカウントIDを入力します。今回は1つだけですが、複数入力もできます。
続いて、デプロイするリージョンを指定します。今回は2つです。
なお、最近追加されたリージョンは、デフォルトで無効状態です。そのため、「すべてのリージョン」を選択した場合は、必要に応じて除外してください。 無効化されたリージョンに対してCloudFormation StackSetsを実行すると、「無効なリージョンのため実行できません」的なエラーが出ます。
- 中東 (バーレーン)
- アフリカ (ケープタウン)
- アジアパシフィック (香港)
- 欧州 (ミラノ)
デプロイオプションは、そのままでOKです。実行しましょう!
実行すると、RUNNING状態になって、SUCCEEDEDする
実行すると、RUNNING状態になります。
しばらく待つと、SUCCEEDEDに変わります。
スタックインスタンスを見ると、各AWSアカウントの各リージョンのスタック状態がわかります。
各リージョンのCloudFormationとSNSトピックを確認する
リージョン:東京
CloudFormationでStackが作られています。
リージョン:バージニア北部
バージニア北部でも同様です。
さいごに
CloudFormationのStackSetsを使えば、複数のAWSアカウントやリージョンに対して、一括デプロイができます。 通常の開発では使わないかもしれませんが、AWS CloudTrailの有効化、AWS Configの有効化などを行う際は便利です。































