CloudFormation StackSetsで複数アカウント・複数リージョンへ簡単にデプロイする

複数のAWSアカウントやリージョンに対して、一括デプロイができます。
2021.09.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

複数のAWSカウントやリージョンで同時にデプロイしたい内容があるとき、一括でデプロイできると便利ですよね。 実際に試してみました。

おすすめの方

  • CloudFormation StackSetsを知りたい方
  • CloudFormation StackSetsの方法を知りたい方
  • CloudFormation StackSetsの方法を共有したい方

CloudFormation StackSetsを使ったデプロイ

CloudFormation StackSetsを使えば、下記のようなデプロイが一括で可能です。便利!!!

  • 1つのAWSアカウントの複数リージョン
  • 複数のAWSアカウントの1つのリージョン
  • 複数のAWSアカウントの複数のリージョン

CloudFormation StackSetsの概要図

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する権限のみを持ちます。

AWSCloudFormationStackSetAdministrationRole.yml

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する権限のみを有しています。

IAMロールの様子(指示する側)

IAMロールの様子(指示する側)

IAMロールの様子(指示する側)

CloudFormation StackSetsを実行するIAMロール

CloudFormationで作成する

下記のCloudFormationテンプレートを利用します。これはAWSドキュメントの内容そのままです。

信頼するAWSアカウント(指示する側)がAssumeRoleでき、AdministratorAccessの権限を持ちます。

AWSCloudFormationStackSetExecutionRole.yml

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する権限のみを有しています。

IAMロールの様子(実行する側)

IAMロールの様子(実行する側)

IAMロールの様子(実行する側)

CloudFormation StackSetsでデプロイする

下準備ができたので、ようやく本題です。サンプルとして、SNSトピックをデプロイしてみます。

  • 1つのAWSアカウントの複数リージョン

CloudFormationテンプレート

サンプルなので超シンプルです。

sns.yaml

AWSTemplateFormatVersion: "2010-09-09"
Resources:
  SampleSnsTopic:
    Type: AWS::SNS::Topic

デプロイする

CloudFormationにアクセスし、左側のメニューからStackSetsを選択します。

CloudFormation StackSets

StackSetsを作成していきます。テンプレートファイルをアップデートします。

テンプレートファイルをアップロードする

続いて、StackSet名を適当に入力します。StackSetの説明とパラメータはそのままでOKです。

StackSetsの名前をつける

続いて、IAMロールを選択します。ここでは、最初に作成したIAMロールをそれぞれ選択します。(指示する側、実行する側)

続いて、デプロイ先のAWSアカウントIDを入力します。今回は1つだけですが、複数入力もできます。

AWSアカウント番号を入力する

続いて、デプロイするリージョンを指定します。今回は2つです。

リージョンを選択する

なお、最近追加されたリージョンは、デフォルトで無効状態です。そのため、「すべてのリージョン」を選択した場合は、必要に応じて除外してください。 無効化されたリージョンに対してCloudFormation StackSetsを実行すると、「無効なリージョンのため実行できません」的なエラーが出ます。

  • 中東 (バーレーン)
  • アフリカ (ケープタウン)
  • アジアパシフィック (香港)
  • 欧州 (ミラノ)

新しいリージョンは、デフォルトで無効になっている

デプロイオプションは、そのままでOKです。実行しましょう!

実行すると、RUNNING状態になって、SUCCEEDEDする

実行すると、RUNNING状態になります。

CloudFormation StackSets実行中

しばらく待つと、SUCCEEDEDに変わります。

CloudFormation StackSets完了

スタックインスタンスを見ると、各AWSアカウントの各リージョンのスタック状態がわかります。

CloudFormation StackSetsで管理しているスタックの様子

各リージョンのCloudFormationとSNSトピックを確認する

リージョン:東京

CloudFormationでStackが作られています。

CloudFormationの様子(東京)

SNSトピックもありました。 SNSトピックの様子(東京)

リージョン:バージニア北部

バージニア北部でも同様です。

CloudFormationの様子(バージニア北部)

SNSトピックの様子(バージニア北部)

さいごに

CloudFormationのStackSetsを使えば、複数のAWSアカウントやリージョンに対して、一括デプロイができます。 通常の開発では使わないかもしれませんが、AWS CloudTrailの有効化、AWS Configの有効化などを行う際は便利です。

参考