StackSets の概念 - AWS CloudFormation

StackSets の概念

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

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

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

スタックセット

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

スタックセットを定義したら、指定したターゲットアカウントやリージョンでスタックを作成、更新、削除できるようになります。スタックを作成、更新、削除する際、オペレーション設定 (オペレーションを実行するリージョンの順序、スタックオペレーションを停止する障害耐性、スタックでオペレーションを同時に実行するアカウント数など) を指定することもできます。

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

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

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

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

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

スタックインスタンス

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

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


                    複数のアカウントおよびリージョンのスタックインスタンスやスタックを作成、更新、削除するための判断材料として、1 つのスタックセットを確保できます。

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

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

スタックセットの作成

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

スタックセットの更新

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

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

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

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

スタックの削除

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

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

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

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

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

スタックセットの削除

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

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

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

同時アカウントの最大数

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

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

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

障害耐性

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

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

スタックの保持

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

Tags

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

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

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

スタックセットおよびスタックインスタンスのステータスコード

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

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

スタックセットオペレーションのステータス 説明

RUNNING

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

SUCCEEDED

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

FAILED

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

QUEUED

QUEUED: [サービスマネージド型のアクセス許可] 一連の操作を必要とする自動デプロイメントの場合、オペレーションはキューに入り、実行されます。以下に例を示します。

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

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

STOPPING

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

STOPPED

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

スタックセット内のスタックインスタンスのステータスコードを次のテーブルに示します。

スタックインスタンスの状態 説明

CURRENT

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

OUTDATED

スタックは、以下のいずれかの理由により、スタックセットと同じ最新状態になっていません。

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

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

INOPERABLE

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

CANCELLED

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

FAILED

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

PENDING

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

RUNNING

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

SUCCEEDED

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