StackSets を使用したアカウントとリージョン全体でのスタックの管理 - AWS CloudFormation

StackSets を使用したアカウントとリージョン全体でのスタックの管理

AWS CloudFormation StackSets は、複数のアカウントおよび AWS リージョン全体でのスタックの作成、更新、削除を単一のオペレーションで実行できるようにすることで、スタックの機能を拡張します。管理者アカウントを使用して、CloudFormation テンプレートを定義および管理し、指定の AWS リージョン 間で選択したターゲット アカウントにスタックをプロビジョニングするためのベースとして使用します。

スタックセットは、テンプレート内にあるリソースのコレクションで、複数のアカウントとリージョン全体にデプロイされます。

StackSets リージョンのサポートについては、「StackSets regional support」を参照してください。

このセクションは、StackSets の使用開始に役立つほか、スタックセットの作成、更新、削除に伴う操作やトラブルシューティングの手順に関する一般的な質問への回答を確認できます。

StackSets の概念

StackSets を使用する場合は、スタックセット、スタックインスタンス、スタックを使用します。

管理者アカウントおよびターゲットアカウント

管理者アカウントは、スタックセットを作成する AWS アカウントです。サービスマネージド型のアクセス許可を持つスタックセットの場合、管理者アカウントは組織の 管理アカウント または委任された管理者アカウントです。スタックセットを作成した AWS 管理者アカウントにサインインすることで、スタックセットを管理できます。

ターゲットアカウントは、スタックセットの 1 つ以上のスタックを作成、更新、削除するアカウントです。スタックセットを使用してターゲットアカウントにスタックを作成する前に、管理者アカウントとターゲットアカウントの間に信頼関係をセットアップします。

AWS CloudFormation StackSets

スタックセットでは、1 つの CloudFormation テンプレートを使用して、複数のリージョンの AWS アカウント にスタックを作成できます。スタックセットの CloudFormation テンプレートは、各スタック内のすべてのリソースを定義します。スタックセットを作成する際、使用するテンプレートに加え、そのテンプレートで必要なパラメータや機能を指定します。

スタックセットを定義したら、指定したターゲットアカウントや AWS リージョン でスタックを作成、更新、削除できるようになります。スタックを作成、更新、または削除する際には、オペレーションの環境設定も指定できます。例えば、オペレーションを実行するリージョンの順序、スタックオペレーションが停止する前の耐障害性のしきい値、およびスタックオペレーションを同時に実行するアカウントの数を含めます。

スタックセットはリージョンのリソースです。スタックセットを 1 つの AWS リージョン で作成する場合では、そのリージョンを表示しているときにのみ表示または変更できます。

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

スタックセットは、セルフマネージド型のアクセス許可、またはサービスマネージド型のアクセス許可のいずれかを使用して作成できます。

セルフマネージド型アクセス許可を使用する場合、アカウントとリージョン間でデプロイするために StackSets で必要な IAM ロールを作成します。これらのロールは、スタックセットを管理するアカウントとスタックインスタンスをデプロイするアカウントとの間に信頼できる関係を確立するために必要です。このアクセス許可モデルを使用すると、StackSets は、 IAM ロールを作成するアクセス許可を持つ任意の AWS アカウント にデプロイできます。

サービスマネージド型のアクセス許可を使用する場合、AWS Organizations が管理するアカウントにスタックインスタンスをデプロイできます。このアクセス許可モデルを使用すると、必要な IAM ロールを作成する必要はありません。ユーザーに代わって StackSets が IAM ロールを作成します。このモデルでは、将来組織に追加するアカウントへの自動デプロイをオンにすることもできます。

AWS Organizations は、CloudFormation と統合され、AWS リソースの拡張や成長に伴い、環境の一元管理およびガバナンスを支援します。

  • 管理アカウント - 組織を作成するために使用するアカウント。詳しくは、[AWS Organizationsterminology and concepts] (用語と概念) をご覧ください。

  • 委任管理者 - 互換性のある AWS サービスでは、組織内の AWS メンバーアカウントをそのサービスにおける組織のアカウントの管理者として登録できます。詳細については、「AWS Organizations で使用できる AWS のサービス」を参照してください。

サービスマネージド型のアクセス許可を使用してスタックセットを作成および管理する方法の詳細については、次のトピックを参照してください。

スタックインスタンス

スタックインスタンスは、リージョン内のターゲットアカウントのスタックへのリファレンスです。スタックインスタンスはスタックなしで存在できます。例えば、何らかの理由によりスタックが作成されていない場合は、スタック作成の失敗理由がスタックインスタンスに表示されます。スタックインスタンスは、1 つのスタックセットにのみ関連付けられます。

次の図は、スタックセット、スタックオペレーション、スタック間の論理関係を表しています。スタックセットを更新すると、関連付けられているすべてのスタックインスタンスは、すべてのアカウントおよびリージョンで更新されます。

スタックセットは、複数のアカウントおよびリージョン全体でスタックインスタンスとスタックを作成、更新、または削除できます。

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

スタックセットでは、以下の操作を実行できます。

スタックセットの作成

新しいスタックセットを作成するには、スタックの作成に使用する CloudFormation テンプレートの指定、スタックを作成するターゲットアカウントの指定、ターゲットアカウントのスタックをデプロイする AWS リージョン の特定などを行います。スタックセットでは、選択したリージョン内の指定したすべてのターゲットアカウントに対して同一の設定を使用して、同一のスタックリソースを一貫してデプロイできます。

スタックセットの更新

スタックセットを更新したら、スタックセットのスタックに変更内容をプッシュします。スタックセットは、以下のいずれかの方法で更新できます。テンプレートをアップデートすると必ずすべてのスタックに反映されます。スタックセットの一部スタックのテンプレートを選択してアップデートすることはできません。その他のスタックもアップデートされます。

  • テンプレートの既存の設定を変更するか (例: 特定のサービスのパラメータ設定の更新)、新しいリソースを追加します (例: 新しい Amazon EC2 インスタンスの追加)。

  • テンプレートを別のテンプレートに置き換えます。

  • 既存のリージョンまたは追加リージョンの既存または追加のターゲットアカウントにスタックを追加します。

スタックの削除

スタックを削除する場合は、指定したリージョン内の指定したターゲットアカウントから、スタックおよび関連付けられているリソースを削除します。スタックは次の方法で削除できます。

  • 一部のターゲットアカウントからスタックを削除し、実行中の他のターゲットアカウントの他のスタックはそのままにしておきます。

  • 一部のリージョンからスタックを削除し、実行中の他のリージョンのスタックはそのままにしておきます。

  • スタックセットからスタックを削除しても保存されるため、[Retain Stacks (スタックの保持)] オプションを選択して、引き続き、個別にスタックセットを実行できます。その後、AWS CloudFormation で設定されたスタックの外部で保持されたスタックを管理できます。

  • スタックセット全体を削除する準備段階として、スタックセット内のすべてのスタックを削除します。

スタックセットの削除

スタックセットは、スタックセット内にスタックインスタンスが存在しない場合のみ、削除できます。

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

このセクションで説明されているオプションを使用すると、スタックセットオペレーションを成功させるために許容されている障害時間や障害数を制御しやすくなるだけでなく、スタックリソースの損失を抑えるのにも役立ちます。

同時アカウントの最大数

この設定は、ワークフローの作成、更新、削除に適用され、一度にオペレーションを実行するターゲットアカウントの最大数または割合 (%) を指定することができます。数または割合 (%) が少ない場合は、オペレーションが、一度に少数のターゲットアカウントで実行していることを表します。オペレーションは、一度に 1 つのリージョンで、[Deployment order] (デプロイ順序) ボックスで指定した順序で実行します。例えば、スタックを 2 つのリージョンの 10 のターゲットアカウントにデプロイした場合、[Maximum concurrent accounts] (同時アカウントの最大数) を 50[By percentage] (割合) に設定すると、スタックは最初のリージョンの 5 つのアカウント、次に最初のリージョンの次の 5 つのアカウントにデプロイされた後、次のリージョンに移動し、最初の 5 つのターゲットアカウントにデプロイされます。

[By percentage] (割合) を選択して、指定された割合 (%) が指定したアカウントの整数にならない場合は、CloudFormation によって丸められます。例えば、スタックを 10 のターゲットアカウントにデプロイし、[Maximum concurrent accounts] (同時アカウントの最大数) を [25] と [By percentage] (割合) に設定した場合は、同時にデプロイされるスタック数は、CloudFormation によって 2.5 (設定できません) から 2 に丸められます。

この設定では、オペレーションの最大値を指定できます。大規模なデプロイの場合、特定の状況下では、同時に処理される実際のアカウント数はサービスのスロットリングのために低くなる可能性があります。デプロイの最大速度は、スタックセットあたり 100 の同時スタックインスタンスです。

同時アカウントの最大数は、耐障害性の値によって異なることがあります (耐障害性の値は、ご使用の同時実行モードに応じて異なります)。同時実行モード厳格な耐障害性に設定されている場合、同時アカウントの最大数耐障害性設定よりも 1 つだけ多くすることができます。

同時実行モード

この設定は、作成、更新、および削除のワークフローで利用可能であり、スタックセットオペレーション時の同時実行レベルの動作を選択できます。詳細については、「CloudFormation コンソールまたは AWS CLI を使用しての [同時実行モード] の選択」を参照してください。

障害耐性

この設定は、ワークフローの作成、更新、削除で利用でき、各リージョンで発生する場合があるスタックオペレーションの失敗の最大数や割合を指定できます。この値を超えると、オペレーションは CloudFormation によって自動的に停止されます。数値または割合 (%) が少ない場合は、オペレーションで実行しているスタックが少数であることを意味しますが、失敗したオペレーションのトラブルシューティングをすばやく開始することができます。たとえば、10 のスタックを 3 つのリージョン内の 10 のターゲットアカウントにデプロイした場合、[Failure tolerance (障害耐性)] を [20] と [By percentage (割合)] に設定すると、オペレーションを続行するために、最大 2 つのスタックのアップデートがリージョン内で失敗することがあります。同リージョンの 3 番目のスタックで失敗した場合、CloudFormation はオペレーションを停止します。最初のリージョンでスタックを更新できない場合、更新オペレーションはそのリージョンで続行され、その後、次のリージョンに移行します。2 番目のスタックを 2 番目のリージョンで更新できない場合、耐障害性は 20% に達し、同リージョンの 3 番目のスタックが失敗した場合、CloudFormation は更新オペレーションを停止し、次のリージョンに移行することもありません。

[By percentage] (割合) を選択して、指定された割合 (%) が、各リージョン内のスタックの整数にならない場合、CloudFormation は切り捨てられます。例えば、スタックを 3 つのリージョンの 10 のターゲットアカウントにデプロイし、[Failure tolerance] (障害耐性) を [25] と [By percentage] (割合) に設定した場合、リージョンあたりの障害耐性 2.5 (設定できません) は、CloudFormation によって 2 に切り捨てられます。

スタックの保持

この設定は、スタックワークフローの削除に利用することができるだけでなく、スタックセットから削除した後でも、スタックやリソースを引き続き実行することができます。スタックを保持すると、AWS CloudFormation は、個別のアカウントとリージョンインタクトにスタックを残します。スタックはスタックセットから関連付けを解除しますが、スタックとそのリソースを保存します スタックの削除オペレーションが完了したら、スタックを作成したターゲットアカウント (管理者アカウントではありません) を使用して、CloudFormation で保持されているスタックを管理します。

リージョンの同時実行

この設定は、作成、更新、および削除のワークフローで利用可能であり、StackSets をリージョンにデプロイする方法を選択できます。

順次 - リージョンのデプロイ失敗が指定された耐障害性を超えない限り、リージョンの [Deployment order] (デプロイ順序) ボックスで指定されているように、一度に 1 つのリージョンに StackSets オペレーションをデプロイします。デフォルトでは、順次デプロイが選択されています。

並列 - リージョンのデプロイ失敗が指定された耐障害性を超えない限り、指定されたすべてのリージョンに StackSets オペレーションを同時にデプロイします。

タグ

スタックセットの作成オペレーションおよび更新オペレーション時にタグを追加するには、キーと値のペアを指定します。請求額とコストの配分を行うためにスタックセットリソースのソートおよびフィルタリングを行う場合は、タグが便利です。AWS でのタグの使用方法に関する詳細については、「AWS Billing and Cost Management ユーザーガイド」の「Using cost allocation tags」(コスト配分タグの使用) を参照してください。キーと値のペアを指定したあと、[+] を選択してタグを保存します。タグの右側にある赤い X を選択すると、使用しなくなったタグを削除できます。

スタックセットに適用するタグは、すべてのスタックと、スタックにより作成されるリソースに適用されます。CloudFormation のスタックのみのレベルでタグを追加することもできますが、そのタグは StackSets には表示されない場合があります。

StackSets でシステム定義のタグが追加されることはありませんが、文字列 aws: を含むタグのキー名から開始しないようにしてください。

StackSets ステータスコード

AWS CloudFormation StackSets は、スタックセットオペレーションのステータスコードを生成します。

スタックセットオペレーションのステータスコードを以下のテーブルに示します。

RUNNING

オペレーションは現在進行中です。

SUCCEEDED

オペレーションは、オペレーションの障害耐性を超えることなく終了しました。

FAILED

オペレーションが完了できなかったスタックの数は、ユーザー定義の耐障害性を超えました。オペレーション向けに設定した耐障害性の値は、スタック作成およびスタック更新のオペレーション時に各リージョンに適用されます。リージョン内で失敗したスタックの数が耐障害性を超えた場合、リージョン内のオペレーションのステータスは、FAILED に変更されます。オペレーション全体のステータスも FAILED に設定され、その他のリージョンのオペレーションは CloudFormation によってキャンセルされます。

QUEUED

Service-managed permissions 一連のオペレーションを必要とする自動デプロイの場合、オペレーションはキューに入り、実行されます。例:

  • アカウントをある組織単位 (OU) OU1 から別の組織単位 OU2 に移動すると、自動デプロイがトリガーされます。StackSets は、削除オペレーションを実行してターゲットリージョンのターゲット OU1 アカウントからスタックインスタンスを削除し、ターゲットリージョンのターゲット OU2 アカウントにスタックインスタンスを追加するための作成オペレーションをキューに入れます。

  • OU にアカウント AccountA を追加すると、自動デプロイがトリガーされます。StackSets は、ターゲットリージョンの AccountA にスタックインスタンスを追加するための作成オペレーションを実行します。この作成オペレーションの実行中に別のアカウント AccountB を OU に追加すると、StackSets は 2 番目の作成オペレーションをキューに入れます。最初の作成オペレーションが完了すると、StackSets は 2 番目の作成オペレーションを実行して、ターゲットリージョンの AccountB にスタックインスタンスを追加します。

STOPPING

ユーザーのリクエストにより、オペレーションは停止中です。

STOPPED

ユーザーのリクエストにより、オペレーションは停止しました。

スタックインスタンスのステータスコード

AWS CloudFormation StackSets は、スタックインスタンスのステータスコードを生成します。

次の表は、StackSets 内のスタックインスタンスのステータスコードについて説明したものです。

CURRENT

スタックは、スタックセットで最新状態です。

OUTDATED

スタックは、以下のいずれかの理由により、スタックセットで最新状態ではありません。

  • 関連付けられたスタックの CreateStackSet オペレーションまたは UpdateStackSet オペレーションが失敗した

  • スタックが作成または更新される前に、失敗または停止した CreateStackSet オペレーションまたは UpdateStackSet オペレーションの一部でした。

INOPERABLE

DeleteStackInstances オペレーションが失敗し、不安定な状態で放置されている この状態のスタックは、今後の UpdateStackSet オペレーションから除外されます。必要に応じて、DeleteStackInstancesRetainStacks に設定して true オペレーションを実行し、スタックインスタンスを削除します。その後、手動でスタックを削除します。

CANCELLED

指定されたアカウントとリージョンでのオペレーションがキャンセルされました。これは、ユーザーがスタックセットオペレーションを停止したか、スタックセットオペレーションの耐障害性を超えたためです。

FAILED

指定されたアカウントとリージョンでのオペレーションに失敗しました。リージョン内の十分なアカウントでスタックセットオペレーションが失敗した場合、スタックセットオペレーション全体の障害耐性を超える可能性があります。

FAILED_IMPORT

指定されたアカウントとリージョンのスタックインスタンスのインポートが失敗し、スタックが不安定な状態になりました。障害の原因となった問題が修正されたら、インポート操作を再試行できます。リージョン内の多くのアカウントで多くのスタックセットオペレーションが失敗した場合、スタックセットオペレーション全体の障害許容度を超える可能性があります。

PENDING

指定されたアカウントとリージョンでのオペレーションはまだ開始されていません。

RUNNING

指定されたアカウントとリージョンでのオペレーションは現在進行中です。

SKIPPED_SUSPENDED_ACCOUNT

操作の時点でアカウントが停止されたため、指定されたアカウントとリージョンでの操作がスキップされました。

SUCCEEDED

指定されたアカウントとリージョンでのオペレーションが正常に完了しました。