StackSets の概念 - AWS CloudFormation

StackSets の概念

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

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

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

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

AWS CloudFormation StackSets

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

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

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

StackSets のアクセス許可モデル

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

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

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

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

  • 管理アカウント - 組織を作成するために使用するアカウント。詳細については、「AWS Organizations の用語と概念」を参照してください。

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

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

スタックインスタンス

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

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

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

StackSet オペレーション

StackSets では、以下のオペレーションを実行できます。

StackSet の作成

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

StackSet を更新する

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

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

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

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

スタックの削除

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

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

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

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

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

StackSet を削除する

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

StackSet オペレーションのオプション

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

同時アカウントの最大数

この設定は、ワークフローの作成、更新、削除に適用され、一度にオペレーションを実行するターゲットアカウントの最大数または割合 (%) を指定することができます。数または割合 (%) が少ない場合は、オペレーションが、一度に少数のターゲットアカウントで実行していることを表します。オペレーションは、一度に 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 に丸められます。

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

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

同時実行モード

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

障害耐性

この設定は、ワークフローの作成、更新、削除で利用でき、各リージョンで発生する場合があるスタックオペレーションの失敗の最大数や割合を指定できます。この値を超えると、オペレーションは 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 に切り捨てられます。

スタックの保持

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

リージョンの同時実行

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

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

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

[タグ]

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

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

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

StackSets ステータスコード

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

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

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

スタックは、StackSet と同様、最新の状態です。

OUTDATED

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

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

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

INOPERABLE

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

CANCELLED

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

FAILED

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

FAILED_IMPORT

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

PENDING

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

RUNNING

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

SKIPPED_SUSPENDED_ACCOUNT

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

SUCCEEDED

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