OU指定で展開しているStackSetsで特定アカウントをOU外に移動させた際の挙動いろいろ

「自動デプロイ:無効」の場合は一手間かかるのでご注意を!
2022.07.07

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

AWS CloudFormation StackSetsでOrganizational unit(以降OU)を指定してスタックを展開するの便利ですよね。

スタック展開済みOU内のアカウントをOU外に移動させたときの挙動についていろいろ試してみました。

なおアクセス許可形式はサービス管理型(service-managed)になります。

(一応、self-managedでもOU指定の展開はできますが一手間かかるのでオススメしません。)

OU外に移動させるモチベーションとしては「アカウントを解約する準備として移動させる」「OU構成に見直しをかける」あたりがあるでしょうか。

(移動前)

(移動後)

注目ポイントとしてはOU外に移動するアカウントにあるスタックインスタンスとスタックがどうなるか、になります。

なお管理者アカウントやスタックインスタンスについての説明は本記事ではしませんのでぜひこちらをご覧ください!

やってみた

展開方式によって挙動と対応が変わるのでそれぞれで試します。

StackSetsの作成については説明割愛します。

(前提)

  • スタックの対象リージョンはus-east-1のみ
  • アカウントA,Bが対象OUに属している
  • アカウントBのみOU外に移動する

「自動デプロイ:有効」かつ「アカウント削除の動作:削除」

作成済みのStackSetsです。

アカウントBをOU外に移動します。

(移動直後)

アカウントBのスタックインスタンスの削除が進んでいます。

(移動から数分後)

DELETEオペレーションが成功しアカウントBのスタックインスタンスが削除されました。

アカウントBに存在するCloudFormationスタックも削除されました。

(最終形)

「自動デプロイ:有効」かつ「アカウント削除の動作:保持」

作成済みのStackSetsです。

OU外に移動した際のコンソール情報は先ほどのパターンと一緒なので画像は省略します。

  • DELETEオペレーションが成功する
  • アカウントBのスタックインスタンスが削除される

アカウントBに存在するCloudFormationスタックは残ったままです。

(最終形)

「自動デプロイ:無効」

作成済みのStackSetsです。

(移動後)

移動前と移動後で変化なしです。

しかし、実態としては上記イメージのようにOU外に出ています。

StackSetsのコンソール情報と乖離しているのでなんとかしたいところですね。

どうやってスタックインスタンスを削除すればいいでしょう?

結論としては、AWS CLIのコマンド(delete-stack-instances)を使用して削除する必要があります。

マネジメントコンソールから特定アカウントのみのスタックインスタンスは削除できません。(2022/7/7時点)

OU下全てのアカウントを対象にスタックインスタンス削除することはマネジメントコンソールから可能です。

サービスマネージド許可を使用するスタックセットの場合、CloudFormation コンソールからのオペレーションは、組織単位 (OU) 全体のみをターゲットにできます。AWS CLI を使用して、単一のアカウントから特定のスタックインスタンスを削除する必要があります。

下記にコマンドのサンプルを載せます。

aws cloudformation delete-stack-instances \
 --regions {スタックインスタンスを展開しているリージョン} \
 --stack-set-name {StackSetsの名前} \
 --deployment-targets Accounts={スタックインスタンスを削除したいアカウント} \
 --retain-stacks

CloudShellから実行してみます。

DELETEオペレーションが成功し、アカウントBのスタックインスタンスが削除されました。

アカウントBに存在するCloudFormationスタックは残ったままです。

(最終形)

おわり

「自動デプロイ:無効」のパターンはハマりポイントになりそうです。
この記事が誰かの役に立てば幸いです!