概要
CloudFormation StackSetsを使って1つのテンプレートを複数リージョンに適用する方法について解説します
前提
- CloudFormationのスタックに関する基礎知識を有している
StackSetとは
CloudFormation StackSetsを使うことで、1つのテンプレートから複数のAWSアカウント、リージョンに対しStackを作成することが可能になります
ただし、複数のリージョンにスタックセットをデプロイする場合、デフォルトで有効になっていないリージョンを除外もしくは手動で有効化する必要があります
2024/06/20執筆時点では以下のリージョンではサポートされていません
リージョン名 | コード |
---|---|
アフリカ (ケープタウン) | af-south-1 |
アジア・パシフィック (香港) | ap-east-1 |
アジア・パシフィック (ハイデラバード) | ap-south-2 |
アジア・パシフィック (ジャカルタ) | ap-southeast-3 |
アジア・パシフィック (メルボルン) | ap-southeast-4 |
カナダ西部 (カルガリー) | ca-west-1 |
欧州 (チューリッヒ) | eu-central-2 |
欧州 (ミラノ) | eu-south-1 |
欧州 (スペイン) | eu-south-2 |
イスラエル (テルアビブ) | il-central-1 |
中東 (アラブ首長国連邦) | me-central-1 |
中東 (バーレーン) | me-south-1 |
StackSetを実行するためのロールの作成
CloudFormationテンプレートの作成
StackSetを作成するロールと実行するロールの2種類が必要になるのでCloudFormationを使って作成します
AWSTemplateFormatVersion: 2010-09-09
Description: "IAM Factory Settings Stack"
# -------------------------------------
# Metadata
# -------------------------------------
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
Default: "StackSet Role Configuration"
Parameters:
- MasterAccountId
# -------------------------------------
# Parameters
# -------------------------------------
Parameters:
MasterAccountId:
Type: String
Description: "AWS Account ID of the master account (the account in which StackSets will be created)"
MaxLength: 12
MinLength: 12
# -------------------------------------
# Resources
# -------------------------------------
Resources:
# -------------------------------------
# IAM Role
# -------------------------------------
# CloudFormation が StackSet を作成する際に必要な IAM ロール
StackSetAdminRole:
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: AssumeExecutionRole
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- sts:AssumeRole
Resource:
- arn:aws:iam::*:role/AWSCloudFormationStackSetExecutionRole
# CloudFormation が StackSet を実行する際に必要な IAM ロール
StackSetExecRole:
Type: AWS::IAM::Role
Properties:
RoleName: AWSCloudFormationStackSetExecutionRole
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS:
- !Ref MasterAccountId
Action:
- sts:AssumeRole
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AdministratorAccess
# -------------------------------------
# Output
# -------------------------------------
Outputs:
StackSetAdminRoleArn:
Value: !GetAtt StackSetAdminRole.Arn
StackSetExecRoleArn:
Value: !GetAtt StackSetExecRole.Arn
実際にロールを作成しよう!
以下のように
- AWSCloudFormationStackSetAdministrationRole
- AWSCloudFormationStackSetExecutionRole
の2種類のロールが作成されたら成功です
StackSetの作成
CloudFormation コンソールの左サイドペインから [StackSets] メニューを選択した後、画面右部の StackSet の作成
ボタンをクリックします
テンプレートの選択
IAM管理ロールに先ほど作成したAWSCloudFormationStackSetAdministrationRole
、IAM 実行ロール名にはAWSCloudFormationStackSetExecutionRole
を設定します
StackSetの詳細設定
StackSet名、説明、テンプレートに設定したパラメータを記載していきます
StackSetのオプションの設定
デプロイオプションの設定
今回は新しいスタックのデプロイ
、スタックをアカウントにデプロイ
を選択し、アカウント番号を入力します
リージョンの指定ではすべてのリージョンを追加
ボタンを押し、デフォルトで有効になっていないリージョンを除外します
デプロイオプションでは以下の通りに設定します
- 同時アカウントの最大数: 100% (
割合 (%)
を選択し100
と入力) - 障害耐性: 100% (
割合 (%)
を選択し100
と入力) - リージョンの同時実行: どちらでも可 (リージョンの展開順序を考慮する必要がない場合は
並行
が早い)
確認画面 (レビュー)
内容に不備がないことを確認できたら、ページ最下部の 送信
ボタンを押します
実際に実行してみよう!
以下のようにStackが正常に作成されることが確認できたら成功です
参考