まず、阪神タイガース リーグ優勝おめでとうございます。
こんにちは、西内です。
普段全く野球を見ないですが、さすがに関西出身者ということで優勝の瞬間は見届けました。
最後に阪神の試合見たのは、マートン選手が「I don't like Nohmi-san」と言っていた頃ですかね。それか新井兄弟が4番を務めていた頃。
最近全然テレビで野球中継やってないですよね。野球観戦のベストプラクティスを知りたいです。
今回のテーマについて
AWSではマルチアカウント管理が推奨されていますが、それに伴いCloudFormation StackSets(以下、CFn StackSets)を利用される方も多数おられると思います。
また、その中でテンプレートやパラメータの更新をすることもあるかと思います。
今回は、StackSetsのパラメータ更新を行った際に、対象Stackへパラメータ設定が反映されない!?という事象を発見した話をしようと思います。
先に結論を言ってしまうと「パラメータの上書き」操作によるものだったのですが、この操作の仕様を理解していないと解決に時間を要するかと思います。
起きた事象とその解決策をこの場で共有して、同じ内容でハマっている方の一助になればと思います。
なお、CFn StackSetsそのものについては以下の小西さんの記事で詳細にまとめられているので、そちらをぜひご覧ください。
事象の再現
下図のような組織構成で、メンバーアカウントにIAMロールが展開されていることとして、パラメータ更新を行って事象を再現します。
今回検証するStackSetの詳細
- マネジメントアカウントからメンバーアカウントへIAMロール(ロール名:TestRole)を展開
- IAMロールにはタグ「Parameter1」「Parameter2」を付与
- タグ「Parameter1」「Parameter2」の内容はStackSetsテンプレートのパラメータから設定
そして、もう一つ大事な前提としてメンバーアカウントのStackのパラメータ「Parameter1」は上書き状態(後述)とします。
(この上書き状態が今回の事象の原因なのですが、パラメータ更新を行う前は気付きませんでした。)
このIAMロールのタグ「Parameter1」の内容を、「StackSetsの詳細を編集」から変更してみます。Red
からGreen
に変えてみましょう。
すると、、、 状況の理由には「No updates are to be performed.」とありますが、「詳細ステータス」は「SUCEEDED」となっています。
当該StackSetのパラメータを確認すると、「Parameter1」の値は正しくGreen
に変わっています。
メンバーアカウントのStackを見に行きますと、「Parameter1」の値はRed
のままです。
では、先ほどと同じ手順で「Parameter2」の方もBlue
からGreen
に変えてみます。
今度は「状況の理由」に何も出力がありません。
当該StackSetの「Parameter2」はGreen
に変わっています。
メンバーアカウントのパラメータを見に行くと、今度は「Parameter2」がGreen
に変わっています。
つまり、StackSetから変更できないパラメータ(Parameter1)と変更可能なパラメータ(Parameter2)が存在していることになります。
うまくいかなかった原因
当該StackSetに対して「StackSetsのパラメータを上書き」から、Parameter1の値を変更していたことが原因でした。 これによりメンバーアカウントのStackのパラメータが、マネジメントアカウントのStackSetsの管理下から外れてしまっていたのです。
パラメータの上書きとは?
StackSetから各メンバーアカウントに対してStackを展開した際に、特定のアカウントやOUのみパラメータの値を変更したいときに有用な機能になります。
上書き状態にあるパラメータにはStackSetのパラメータ更新ではメンバーアカウントのStackへ反映がされません。 そのため、上書き状態にあるメンバーアカウントの「Parameter1」に対して、StackSetのパラメータの変更では反映がされませんでした。
パラメータ上書き状態の解除法
パラメータ上書き状態は、「StackSetsのパラメータを上書き」から「上書きの指定」画面にて対象パラメータを選択して、「StackSet値に設定」を行うことで、元に戻す(=StackSetから変更が可能な状態)に戻すことが可能です。
パラメータ状態の確認方法
メンバーアカウントのStackで上書き状態のパラメータが存在するかは、マネジメントアカウントからdescribe-stack-instance
を実行することで確認が出来ます。
上書き状態のパラメータが存在する場合は、戻り値のParameterOverrides
に該当パラメータが表示されます。
以下に事象が発生したStackインスタンスに対して、describe-stack-instance
を実行した結果を記載します。(アカウントID等はマスク済み)
[cloudshell-user@ip-x-x-x-x ~]$ aws cloudformation describe-stack-instance --stack-set-name BlogStack:1234abcde --stack-instance-account xxxxxxxxxxxx --stack-instance-region ap-northeast-1 { "StackInstance": { "StackSetId": "BlogStack:1234abcde", "Region": "ap-northeast-1", "Account": "xxxxxxxxxxxx", "StackId": "arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxx:stack/StackSet-BlogStack-9874xyz", "ParameterOverrides": [ { "ParameterKey": "Parameter1", "ParameterValue": "Red", "UsePreviousValue": false } ], "Status": "CURRENT", "StackInstanceStatus": { "DetailedStatus": "SUCCEEDED" }, "OrganizationalUnitId": "ou-xxxx-xxxx", "DriftStatus": "NOT_CHECKED", "LastOperationId": "hijklmn" } }
ParameterOverrides
にて、Parameter1
のUsePreviousValue
がfalse
、つまり当初のStackSetの値から変わって上書き状態にあることが分かりますね。
なお、上書き状態のパラメータが存在しない場合は、以下のようにParameterOverrides
の配列が空になります。
[cloudshell-user@ip-x-x-x-x ~]$ aws cloudformation describe-stack-instance --stack-set-name BlogStack:1234abcde --stack-instance-account xxxxxxxxxxxx --stack-instance-region ap-northeast-1 { "StackInstance": { "StackSetId": "BlogStack:1234abcde", "Region": "ap-northeast-1", "Account": "xxxxxxxxxxxx", "StackId": "arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxx:stack/StackSet-BlogStack-9874xyz", "ParameterOverrides": [], "Status": "CURRENT", "StackInstanceStatus": { "DetailedStatus": "SUCCEEDED" }, "OrganizationalUnitId": "ou-xxxx-xxxx", "DriftStatus": "NOT_CHECKED", "LastOperationId": "hijklmn" } }
おわりに
StackSetから各メンバーアカウントのパラメータを変更する際は、パラメータの変更が反映されていないことを見逃す可能性があります。
また、パラメータが上書きされていることはドリフト検出では確認することが出来ません。
本記事でご紹介したコマンドで、事前に各Stackのパラメータ状態を確認することを推奨します。