CloudFormation StackSets の自動デプロイ時に RegionOrderが適用されないのを検証してみた
製造ビジネステクノロジー部のふじいです。
今回は CloudFormation StackSets を触っていて気になる挙動があったので検証してみました。
CloudFormation StackSets には複数リージョンに対して CloudFormation のデプロイができ、その際にデプロイするリージョンの順番も指定できます。
また対象 OU にアカウントが追加された際に自動的にスタックセットのデプロイを実行する自動デプロイ機能があります。
ただし 指定したリージョンの順番が実際には自動デプロイ時に適用されない というのが今回のお話です。
(ドキュメントの以下の記述がそういうことなんでしょうか?)
自動デプロイ機能は StackSet レベルで有効になります。OU、アカウント、リージョンを選択して自動デプロイを調整することはできません。
自動デプロイ時もリージョンの順番を指定できるものと思っていたので、同じことを思っている人、これからそういう実装をする人向けの内容です。
やってみた
Organizations で検証用の OU は事前に作成済みで、テスト用のアカウントも作成済みの前提です。
スタックセットの作成を行い、その時に実行されるオペレーションと、OU にアカウント追加した時に実行される自動デプロイのオペレーションを確認します。
また、スタックセットの更新を行った場合の挙動も確認します。
スタックセットの作成時の挙動
今回はスタックセット自体の動作を確認するため、使用した CloudFormation テンプレートは下記の通り何もリソースを作らないダミー用のテンプレートを使用しました。
Conditions:
HasNot: !Equals [ 'true', 'false' ]
Resources:
NullResource:
Type: 'Custom::NullResource'
Condition: HasNot
スタックセットとスタックインスタンスの作成は以下のスクリプトを用いて行います。
create-stack-set --auto-deployment
により自動デプロイを有効化し、create-stack-instances --operation-preferences RegionOrder
でデプロイを行うリージョンの順番を指定します。
今回は us-east-1 を最初に行い、それ以降については AWS 側にお任せします。
#!/usr/bin/env bash
STACK_SET_NAME="test-stack-set-cfn-null-from-cli"
TEMPLATE=$(cat ./cfn_null.yml)
REGIONS=$(aws ec2 describe-regions --output text --query 'Regions[].{Name:RegionName}' | tr '\n' ' ')
# StackSet 作成
aws cloudformation create-stack-set \
--region ap-northeast-1 \
--stack-set-name "${STACK_SET_NAME}" \
--template-body "${TEMPLATE}" \
--permission-model SERVICE_MANAGED \
--auto-deployment Enabled=true,RetainStacksOnAccountRemoval=true
# StackInstance 作成
aws cloudformation create-stack-instances \
--region ap-northeast-1 \
--regions $REGIONS \
--stack-set-name "${STACK_SET_NAME}" \
--operation-preferences RegionOrder=us-east-1 \
--deployment-targets OrganizationalUnitIds="ou-dummy-cman24365"
作成したスクリプトを実行し、スタックセットとスタックインスタンスを作成します。
./create.sh
スタックセットインスタンス作成時のオペレーションを確認する
スタックインスタンス作成時にオペレーションが実行されるので、describe-stack-set-operation
コマンドを実行し RegionOrder を調べます。
すると以下のように us-east-1 が指定されていることが確認できました。
aws cloudformation describe-stack-set-operation --stack-set-name test-stack-set-cfn-null-from-cli --operation-id 7cc1e08a-24f0-4672-82bc-1c094ca9e152
{
"StackSetOperation": {
"OperationId": "7cc1e08a-24f0-4672-82bc-1c094ca9e152",
"StackSetId": "test-stack-set-cfn-null-from-cli:b90a1ce4-9734-4c6e-97e0-2f32351834a4",
"Action": "CREATE",
"Status": "SUCCEEDED",
"OperationPreferences": {
"RegionOrder": [
"us-east-1"
]
},
"DeploymentTargets": {
"Accounts": [],
"OrganizationalUnitIds": [
"ou-dummy-cman24365"
]
}
}
}
OU にアカウントを移動し、自動デプロイ時のオペレーションを確認する
テストアカウントを対象 OU に移動します。これはマネコンから行いました。
アカウントを OU に移動した際にスタックセットの自動デプロイが行われるので、そのオペレーションで RegionOrder が指定されているかを調べます。
その結果 RegionOrder: []
となっており、自動デプロイ時には RegionOrder が適用されないことが確認できました。
aws cloudformation describe-stack-set-operation --stack-set-name test-stack-set-cfn-null-from-cli --operation-id 4cffbc77-3485-3792-a95d-f7a23d379105
{
"StackSetOperation": {
"OperationId": "4cffbc77-3485-3792-a95d-f7a23d379105",
"StackSetId": "test-stack-set-cfn-null-from-cli:b90a1ce4-9734-4c6e-97e0-2f32351834a4",
"Action": "CREATE",
"Status": "SUCCEEDED",
"OperationPreferences": {
"RegionOrder": []
}
}
}
スタックセット更新時の挙動
スタックセットの更新も同様に調べます。
CloudFormation テンプレートは先ほどと同じものを使用し、更新用のスクリプトを用意します。
#!/usr/bin/env bash
STACK_SET_NAME="test-stack-set-cfn-null-from-cli"
TEMPLATE=$(cat ./cfn_null.yml)
REGIONS=$(aws ec2 describe-regions --output text --query 'Regions[].{Name:RegionName}' | tr '\n' ' ')
aws cloudformation update-stack-set \
--region ap-northeast-1 \
--stack-set-name "${STACK_SET_NAME}" \
--template-body ${TEMPLATE} \
--permission-model SERVICE_MANAGED \
--operation-preferences RegionOrder=us-east-1
作成したスクリプトを実行し、スタックセットを更新します。
./update.sh
スタックセット更新時のオペレーションを確認する
スタックセット更新時に自動的に UPDATE オペレーションが実行されます。
同じようにdescribe-stack-set-operation
コマンドを実行し RegionOrder を調べます。
すると以下のように us-east-1 が指定されていることが確認できました。
aws cloudformation describe-stack-set-operation --stack-set-name test-stack-set-cfn-null-from-cli --operation-id b76b4271-982f-4e21-aaaa-9de716fb412e
{
"StackSetOperation": {
"OperationId": "b76b4271-982f-4e21-aaaa-9de716fb412e",
"StackSetId": "test-stack-set-cfn-null-from-cli:b90a1ce4-9734-4c6e-97e0-2f32351834a4",
"Action": "UPDATE",
"Status": "SUCCEEDED",
"OperationPreferences": {
"RegionOrder": [
"us-east-1"
]
}
}
}
OU にアカウントを移動し、自動デプロイ時のオペレーションを確認する
テストアカウントを対象 OU から一度外し、スタックセットの削除を確認してから、再度対象 OU に移動しました。
アカウントの OU 移動で自動デプロイが行われるので、そのオペレーションで RegionOrder が指定されているかを調べます。
スタック更新後の自動デプロイでも RegionOrder: []
となっており、やはり自動デプロイ時には RegionOrder が適用されないことが確認できました。
aws cloudformation describe-stack-set-operation --stack-set-name test-stack-set-cfn-null-from-cli --operation-id f976b031-04f4-3289-8c1b-e80380639258
{
"StackSetOperation": {
"OperationId": "f976b031-04f4-3289-8c1b-e80380639258",
"StackSetId": "test-stack-set-cfn-null-from-cli:b90a1ce4-9734-4c6e-97e0-2f32351834a4",
"Action": "CREATE",
"Status": "RUNNING",
"OperationPreferences": {
"RegionOrder": []
}
}
}
まとめ
CloudFormation StackSets の自動デプロイで RegionOrder が適用されないことを確認しました。
冒頭で書いた通り、おそらくドキュメント的には以下の記述として表現されていると思います。
自動デプロイ機能は StackSet レベルで有効になります。OU、アカウント、リージョンを選択して自動デプロイを調整することはできません。
「StackSet レベルで有効」ということなので CreateStackSet API に OperationPreferences パラメータが存在しないことから、そのような挙動になったと推測しています。
また UpdateStackSet API には OperationPreferences パラメータが存在しているのは、スタックセットの更新時に自動的に走るオペレーションに対しての操作であって、スタックセットに対して OperationPreferences を設定しているわけではなさそうです。
私自身、自動デプロイ時もリージョンの順番を指定できるものと思っていたので、同じことを思っている人、これからそういう実装をする人がこの辺りのことを考慮できるようになれば幸いです。