アカウント指定でCloudFormation StackSetsを作成・削除してみた

OUではなくアカウント指定でStackSetを使うときの操作を一通り試しました
2022.08.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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

今回は自己管理型(self-managed)アクセス許可形式でアカウントを複数指定してスタックを展開・削除まで試してみます。

非Organizations環境でStackSetsを使ってマルチアカウントにスタックを展開させたいという人を想定して紹介していきます。

Organizations環境でOU指定でスタック展開をしたい場合はサービス管理型(service-managed)でやりましょう!(下記ブログ参照)

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

自己管理型(self-managed)って何?って方は先にこちらをご覧ください。

事前準備

自己管理型(self-managed)アクセス許可形式の場合は事前にIAMロールを作成しておく必要があります。

管理者アカウントとターゲットアカウントのそれぞれでIAMロールを作成します。

AdministrationRole(管理者アカウント側)

StackSetを作成するアカウントにAWSCloudFormationStackSetAdministrationRoleを作成します。

こちらのCloudFormationテンプレートで簡単に作成可能です。

StackSetsExecutionRole(ターゲットアカウント側)

StackSetのターゲットアカウントにAWSCloudFormationStackSetExecutionRoleを作成します。

こちらのCloudFormationテンプレートで簡単に作成可能です。

ターゲットアカウントが複数ある場合、それぞれのアカウントで作成が必要ですので注意してください。

Stack作成時のパラメータに、AdministrationアカウントのアカウントIDが必要です。

マネジメントコンソールからやってみた

展開

図のように二つのターゲットアカウントに対してスタックを展開してみます。

展開するCloudFormationテンプレートはS3バケットを一個作るだけのシンプルなものです。

マネジメントコンソールよりCloudFormation>StackSets>StackSetの作成に進みます。

事前準備で作成したIAMロールをここで選択します。

デプロイオプションの設定です。

ターゲットアカウントのアカウントIDを入力します。

待ち時間短縮のため2アカウント同時にデプロイが進むように設定します。

設定が正しいことを確認しStackSets作成を開始します。

StackSetsの詳細画面を確認するとオペレーションのステータスはRUNNINGになっています。

少し待つとSUCCEEDEDに変わりました。

管理者アカウントからは作成に成功したことを確認できました。

次はターゲットアカウントから確認してみます。

StackSet-」から始めるスタックが作成されリソース(S3バケット)も作成されていました。

アカウントを一つだけ削除してみる

「StackSetからスタックを削除」を選択

デプロイオプションを設定します。

削除対象のターゲットアカウントBのアカウントIDを記入。

確認し実行します。

StackSetの詳細画面から確認してみます。

DELETEが完了して、スタックインスタンスのタブからターゲットアカウントBが消えていました。

またターゲットアカウントBから確認するとスタックが消えていました。

StackSetを削除

最後にStackSetの削除をしてみます。

注意点として全てのスタックインスタンスが削除されていないとStackSetは削除できません

残っているターゲットアカウントAのスタックインスタンスを削除して下記のようになにもない状態にします。

「StackSetsの削除」を選択。

確認して実行します。以上です。

AWS CLIからやってみた

AWS CLIからもやってみます。

全く同じ流れのため図やキャプチャは省略します。

展開

create-stack-set

コマンドのサンプル

aws cloudformation create-stack-set \
  --region us-east-1 \
  --stack-set-name {STACK_SET_NAME} \
  --template-body {TEMPLATE} \
  --permission-model SELF_MANAGED \
  --execution-role-name AWSCloudFormationStackSetExecutionRole \

--execution-role-nameにはターゲットアカウント側で作成したIAMロールの名前を指定します。

StackSetのIDが返されます。 create-stack-instances コマンドのサンプル

aws cloudformation create-stack-instances \
  --region us-east-1 \
  --regions {REGIONS} \
  --stack-set-name {STACK_SET_NAME} \
  --deployment-targets Accounts={ACCOUNT}

--region--regionsがあります。

--regionは「StackSetを作成するリージョンの指定」で、 --regionsは「ターゲットアカウントのどのリージョンにデプロイするかの指定」です。

オペレーションIDが返されます。

アカウントを一つだけ削除してみる

delete-stack-instances

コマンドのサンプル

aws cloudformation delete-stack-instances \
  --region us-east-1 \
  --regions {REGIONS} \
  --stack-set-name {STACK_SET_NAME} \
  --no-retain-stacks \
  --deployment-targets Accounts={ACCOUNT}

--no-retain-stacks はスタックインスタンス削除の際にスタックを保持しない(スタックも一緒に削除する)というオプションになります。

保持する場合は --retain-stacks を付けます。どちらかは必ず指定する必要があります。

オペレーションIDが返ってきます。

StackSetsを削除

delete-stack-set

コマンドのサンプル

aws cloudformation delete-stack-set \
  --region us-east-1 \
  --stack-set-name {STACK_SET_NAME}

以上です。