【CloudFormation】StackSetsの仕組みについて

記事タイトルとURLをコピーする

こんにちは。AWS CLIが好きな福島です。

はじめに

今回は、案件でCloudFormationのStackSetsを利用いたしましたので、その内容をブログに記載いたします。
※本ブログのまとめを最後の方に記載しておりますため、お時間がない方は、そちらを見ていただければ幸いです。

StackSetsとは

複数のアカウントおよびリージョンのスタックを 1度のオペレーションで、作成、更新、削除できる機能となります。

ユースケース
例えば、複数のAWSアカウントを利用する時にAWS ConfigやCloudTrailなど、 全部のAWSアカウントに共通で有効にしたいサービスがあると思います。

そのような場合、個々のAWSアカウントにCloudFormationのスタックを 作成していると手間がかかる上、管理も煩雑になってしまいます。

その問題を解決するのがCloudFormationのStackSetsという機能になります。

イメージ図

StackSetsのイメージ図は、以下の通りです。 複数アカウントのスタックを管理する管理アカウント(図の左)が存在し、 そのアカウントからターゲットアカウント(図の右)に対して、スタック操作の命令を実行します。

StackSetsの仕組み

管理アカウントからターゲットアカウントに、スタックを作成するためには、 IAMロールが管理アカウントおよびターゲットアカウントに必要になります。

そのIAMロールを準備する方法は、以下の通り、2パターン存在します。

  • サービスマネージド型
    AWS Organizationsの機能を使うパターン
    ※マスターアカウントが管理アカウントになります。 また、この機能を利用するためには、Organizationsの[全ての機能]を有効にする必要があります。
  • セルフマネージド型
    AWSが公開しているテンプレートを使い、手動でIAMロールを作成するパターン
    ※指定したアカウントを管理アカウントにできます。

サービスマネージド型の詳細

サービスマネージド型には、3つIAMロールが登場します。

それぞれのIAMロールの用途は、以下の通りです。

①AWSServiceRoleForCloudFormationStackSetsOrgAdmin

管理アカウントに作成されるロールになります。
スタックセット実行時に利用されるロールになります。
また、③のロールにスイッチできる権限が付与されています。

②AWSServiceRoleForCloudFormationStackSetsOrgMember

ターゲットアカウントに作成されるロールになります。
③を作成するロールになります。

③stacksets-exec-xxxxxxxxxxxx

ターゲットアカウントに作成されるロールになります。
(xxxxxxxxxxxxには、適当な文字列が入ります。)
ターゲットアカウントにスタックを作成する際に利用します。
管理アカウントの①のロールが信頼関係に結ばれます。

セルフマネージド型の詳細

セルフマネージド型には、2つのIAMロールが登場します。

それぞれのIAMロールの用途は、以下の通りです。

①AWSCloudFormationStackSetAdministrationRole

管理アカウントに作成するロールになります。
スタックセット実行時に利用されるロールになります。
また、②のロールにスイッチできる権限が付与されています。

②AWSCloudFormationStackSetExecutionRole

ターゲットアカウントに作成するロールになります。
ターゲットアカウントにスタックを作成する際に利用します。
また、指定した管理アカウントを信頼関係に結びます。

ここから上記2パターンのIAMロールの準備手順を記載いたします。

IAMロールの準備手順(サービスマネージド型)

いくつか方法があるため、今回はそのうちの1つをご紹介いたします。

詳細は、以下をご確認ください。 https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacksets-orgs-enable-trusted-access.html

IAMロール準備手順

Organizationsの画面で「設定」をクリックします。

「AWS CloudFormation StackSets」の「アクセスの有効化」をクリックします。

「アクセスを有効化」をクリックします。

設定が完了すると以下の画面が表示されます。

実際にサービスマネージド型でデプロイを行うまでは、IAMからロールを確認することはできません。 初回実行時に以下のIAMロールが作成されるようです。

  • AWSServiceRoleForCloudFormationStackSetsOrgAdmin
  • AWSServiceRoleForCloudFormationStackSetsOrgMember
  • stacksets-exec-xxxxxxxxxxxx

IAMロールの詳細

それぞれで作成されるリソースの詳細は、以下の通りです。

①AWSServiceRoleForCloudFormationStackSetsOrgAdmin

  • 信頼関係
    stacksets.cloudformation.amazonaws.com
  • ポリシー
    CloudFormationStackSetsOrgAdminServiceRolePolicy(AWSマネージドポリシー)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowsAWSOrganizationsReadAPIs",
            "Effect": "Allow",
            "Action": [
                "organizations:List*",
                "organizations:Describe*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowAssumeRoleInMemberAccounts",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::*:role/stacksets-exec-*"
        }
    ]
}

②AWSServiceRoleForCloudFormationStackSetsOrgMember

  • 信頼関係
    member.org.stacksets.cloudformation.amazonaws.com
  • ポリシー
    CloudFormationStackSetsOrgMemberServiceRolePolicy(AWSマネージドポリシー)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "iam:CreateRole",
                "iam:DeleteRole",
                "iam:GetRole"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::*:role/stacksets-exec-*"
            ]
        },
        {
            "Action": [
                "iam:DetachRolePolicy",
                "iam:AttachRolePolicy"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::*:role/stacksets-exec-*"
            ],
            "Condition": {
                "StringEquals": {
                    "iam:PolicyARN": "arn:aws:iam::aws:policy/AdministratorAccess"
                }
            }
        }
    ]
}

③stacksets-exec-xxxxxxxxxxxx

  • 信頼関係
    arn:aws:iam::xxxxxxxxxxxx:role/aws-service-role/stacksets.cloudformation.amazonaws.com/AWSServiceRoleForCloudFormationStackSetsOrgAdmin
    ※「xxxxxxxxxxxx」には、マスターアカウントのIDが入ります。
  • ポリシー
    AdministratorAccess (AWSマネージドポリシー)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        }
    ]
}

IAMロールの準備手順(セルフマネージド型)

セルフマネージド型の場合、AWSが公開しているテンプレートを利用し、 IAMロールを管理およびターゲットアカウントに作成する必要がございます。

また、最新の手順は、以下のAWS公式ドキュメントをご確認ください。 https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html#procedure

IAMロールの準備手順

管理アカウントには、以下のテンプレートを利用し、CloudFormationのスタックを作成します。

https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AWSCloudFormationStackSetAdministrationRole.yml

ターゲットアカウントには、以下のテンプレートを利用し、CloudFormationのスタックを作成します。

https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AWSCloudFormationStackSetExecutionRole.yml

ターゲットアカウント用のIAMロール作成テンプレートには、 信頼関係を結ぶ管理アカウントのIDを入力するパラメーターがあります。

IAMロールの詳細

それぞれで作成したリソースの詳細は、以下の通りです。

①AWSCloudFormationStackSetAdministrationRole

  • 信頼関係
    cloudformation
  • ポリシー
    AssumeRole-AWSCloudFormationStackSetExecutionRole(カスタム管理ポリシー)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:*:iam::*:role/AWSCloudFormationStackSetExecutionRole"
            ],
            "Effect": "Allow"
        }
    ]
}

②AWSCloudFormationStackSetExecutionRole

  • 信頼関係
    パラメーターに指定したAWSアカウント
  • ポリシー
    AdministratorAccess (AWSマネージドポリシー)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        }
    ]
}

まとめ

サービスマネージド型とセルフマネージド型の違い(黄色)をまとめると以下の通りです。 実際には、スタックセットを実行する方法にも違いがあるため、今度、ブログにまとめたいと思います。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。