AWS再入門ブログリレー2022 AWS CloudFormation (StackSets 編)

AWS CloudFormation StackSetsについてコンセプトの理解を中心に再入門しました。
2022.03.15

こんにちは、おんづか(@onzuka_muscle)です!

当エントリは弊社コンサルティング部による『AWS 再入門ブログリレー 2022』の29日目のエントリです。

このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

AWS をこれから学ぼう!という方にとっては文字通りの入門記事として、またすでに AWS を活用されている方にとっても AWS サービスの再発見や 2022 年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。

では、さっそくいってみましょう。今日のテーマは『AWS CloudFormation StackSets』です。

AWS CloudFormation StackSetsとは?

AWS CloudFormationの機能の一つです。

(AWS CloudFormationの基本について本ブログでは説明しませんので、記事の最後におすすめの入門記事を載せておきました!)

AWS CloudFormation StackSetsは「1つのCloudFormationテンプレートを使用して複数のアカウントおよびリージョンにまたがってAWSリソースの共通のセットをプロビジョニングできる」機能です。

イメージがつきやすいように図にしてみました。

複数アカウント・複数リージョンに対して一括で共通のAWSリソースを展開したいときに利用します。

コンセプト

AWS CloudFormation StackSetsのコンセプトは最初少し戸惑うので各用語と一緒に説明します。

StackSets concepts

管理者アカウントとターゲットアカウント

管理者アカウントは、スタックセットを作成するためのAWSアカウントです。

管理者アカウントにサインインしてスタックセットの作成・更新・削除といった作業をします。

またCloudFormationテンプレートの更新もこのアカウントにサインインして実施します。

AWS CloudFormation StackSetsを利用する際の操作は全て管理者アカウントを起点に行う、という理解をしておけばokです。

ターゲットアカウントはスタックセットによって管理されるスタックが展開される対象のアカウントです。

管理者アカウントと各ターゲットアカウントの間では信頼関係を設定する必要があります。(後述します。)

スタックセット

「CloudFormationテンプレート」と「デプロイ設定」のセットというイメージでokです。

またスタックセットはグローバルリソースではなくリージョンリソースです。

例えば東京リージョンでスタックセットを作成すると、他のリージョンでそれを参照したり変更したりすることはできないです。

東京リージョンのスタックセットからバージニアリージョンやオレゴンリージョンにスタックをデプロイすることはもちろん可能です。

スタックセットのアクセス許可モデル

  • 自己管理型(self-managed)
  • サービス管理型(service-managed)

のいずれかを使用してスタックセットを作成します。

  • 事前に管理者アカウントとターゲットアカウントどちらにもIAMロールの作成が必要

自己管理型(self-managed)の設定についてはこちらをご参考ください。

  • AWS Organizationsで管理されている環境であることが前提
  • IAMロールは自動で作成される
  • Organizationsと連携することで組織単位 (OU)指定でのデプロイが可能
    • またオプションでOUに追加されたアカウントに自動でデプロイすることも可能

サービス管理型(service-managed)の設定についてはこちらをご参考ください。

サービス管理型(service-managed)は後から登場したものでOrganizationsとの連携が前提になっています。

スタックインスタンス

スタックインスタンスがAWS CloudFormation StackSetsを理解する上で一番のハードルかなと思います。私は最初少し混乱しました。

と言っても慣れればそんな大したことではないです。

公式ドキュメントでは下記のような表現になっています。

A stack instance is a reference to a stack in a target account within a Region.

「スタックインスタンスは、リージョン内のターゲットアカウント内のスタックへの参照(reference)である。」

公式ドキュメント Stack instances

下記のような特徴があります。

  • スタックインスタンスは、1つのスタックセットのみと関連付けられる
  • スタック毎に作成される
    • つまりデプロイ対象のアカウント・リージョン毎に作成される
  • スタックインスタンスは、スタックがなくても存在することができる
    • 例えば、何らかの理由でスタックを作成できなかった場合、スタックインスタンスはスタック作成失敗の理由を表示する

  • マネジメントコンソールで確認する場合、スタックセットのメニュー画面からのみ確認できる
    • ターゲットアカウントからは確認できない

「基本的にはスタックインスタンスとスタックは1対1(セット)だが、スタックがないスタックインスタンスもあり得る」ということになります。

スタックがないスタックインスタンスについては「何らかの理由でスタックを作成できなかった場合」や「あえてターゲットアカウントからの操作でスタックを削除した場合」があります。

ここまで特徴ベースで抑えると「参照(reference)」という表現についてもしっくりきましたね。スタックインスタンス完全に理解した。

スタックセットオペレーション

スタックセットで行う操作です。

スタックセットの作成

これは簡単です。

  • CloudFormationテンプレートの指定
  • スタックを作成するターゲットアカウントの指定
  • ターゲットアカウントにスタックをデプロイするAWSリージョンの指定

スタックセットの更新

「テンプレート」と「デプロイ設定」のセット、という話を上記でしましたがどちらの更新もできます。

  • テンプレート
    • テンプレートを更新する
    • パラメータを更新する
  • デプロイ設定
    • 対象アカウント or OUの追加
    • 対象リージョンの追加
    • デプロイオプションを変更する

注意点として

  • テンプレートの更新は常にすべてのスタックに影響
  • スタックセットの一部のスタックだけテンプレートを更新し、他のスタックは更新しないようにすることはできない

スタックを削除する

スタックを削除すると、指定したリージョン内の指定したターゲットアカウントから、スタックとその関連するすべてのリソースが削除されます。

  • いくつかのターゲットアカウントからスタックを削除し、他のターゲットアカウントの他のスタックは実行したままにする
  • いくつかのリージョンからスタックを削除し、他のリージョン内のスタックを実行したままにする
  • スタックセットからスタックを削除しますが、[スタックを保持] オプションを選択して、スタックセットから独立して実行し続けられるように保存
  • スタックセット全体を削除する準備として、スタックセット内のすべてのスタックを削除

スタックセットを削除する

スタックセットの削除は、その中にスタックインスタンスが存在しない場合にのみ可能

AWS CloudFormation StackSetsできること

Organizations連携して自動デプロイ

マルチアカウント戦略・Organizationsの活用が進むのと合わせてStackSetsの自動デプロイの出番が増えました。

上述した通り、自動デプロイする場合は「サービス管理型(service-managed)」のアクセス許可設定が前提になります。

OU内のアカウントを指定

「組織」か「OU内のアカウント全て」に加えて、より細かくOU内のアカウントを指定できるようになりました。

AWS Organizations でStackSets の委任管理者設定

Organizationsのマネジメントアカウントから別アカウントに委任する設定をすることでマネジメントアカウントを触らずに、組織/OU単位のAWS CloudFormation StackSetsの展開・管理ができるようになります。

既存スタックのインポート

スタックセットで管理していないスタックに関してスタックセットにインポートすることができます。

既に稼働中のリソースをそのままに他アカウント・他リージョンへの展開をAWS CloudFormation StackSetsを用いて集中管理したくなったときに有効です。

同一スタックセットに対して複数のオペレーション

同一スタックセットに対しての複数のオペレーションについて「競合しないオペレーションを並行して実行し、競合するオペレーションをキューに入れる」ことができるようになりました。

ターゲットアカウントゲート

StackSetsのオペレーション実行前にチェックを挟むことができます。

複数リージョンに”同時デプロイ”

こちらはTIPSです。

複数リージョンにデプロイする場合はこのオプションを有効にすることでめっちゃ速くなります!

 

参考

AWS CloudFormationの基本

おわり

以上、『AWS 再入門ブログリレー 2022』の 29日目のエントリ『AWS CloudFormation StackSets』編でした。

次回、3/16(水)はのんピの「AWS Step Functions」の予定です。お楽しみに!!"