NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

CloudFormation StackSets パラメータの更新が対象Stackに反映されない時とその対処法

まず、阪神タイガース リーグ優勝おめでとうございます。

こんにちは、西内です。
普段全く野球を見ないですが、さすがに関西出身者ということで優勝の瞬間は見届けました。
最後に阪神の試合見たのは、マートン選手が「I don't like Nohmi-san」と言っていた頃ですかね。それか新井兄弟が4番を務めていた頃。

最近全然テレビで野球中継やってないですよね。野球観戦のベストプラクティスを知りたいです。

今回のテーマについて

AWSではマルチアカウント管理が推奨されていますが、それに伴いCloudFormation StackSets(以下、CFn StackSets)を利用される方も多数おられると思います。 また、その中でテンプレートやパラメータの更新をすることもあるかと思います。
今回は、StackSetsのパラメータ更新を行った際に、対象Stackへパラメータ設定が反映されない!?という事象を発見した話をしようと思います。

先に結論を言ってしまうと「パラメータの上書き」操作によるものだったのですが、この操作の仕様を理解していないと解決に時間を要するかと思います。
起きた事象とその解決策をこの場で共有して、同じ内容でハマっている方の一助になればと思います。

なお、CFn StackSetsそのものについては以下の小西さんの記事で詳細にまとめられているので、そちらをぜひご覧ください。

tech.nri-net.com

事象の再現

下図のような組織構成で、メンバーアカウントにIAMロールが展開されていることとして、パラメータ更新を行って事象を再現します。

今回検証するStackSetの詳細

  • マネジメントアカウントからメンバーアカウントへIAMロール(ロール名:TestRole)を展開
  • IAMロールにはタグ「Parameter1」「Parameter2」を付与
  • タグ「Parameter1」「Parameter2」の内容はStackSetsテンプレートのパラメータから設定

そして、もう一つ大事な前提としてメンバーアカウントのStackのパラメータ「Parameter1」は上書き状態(後述)とします。
(この上書き状態が今回の事象の原因なのですが、パラメータ更新を行う前は気付きませんでした。)

AWSコンソール画面

このIAMロールのタグ「Parameter1」の内容を、「StackSetsの詳細を編集」から変更してみます。RedからGreenに変えてみましょう。

StackSetの詳細を編集を選択。StackSet名は「BlogStack」としています。

テンプレートは変更せず、Parameter1の内容を変更します。

すると、、、 状況の理由には「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のみパラメータの値を変更したいときに有用な機能になります。

パラメータの上書きにより、一部メンバーアカウントのStackパラメータのみを変更する例

上書き状態にあるパラメータには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にて、Parameter1UsePreviousValuefalse、つまり当初の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のパラメータ状態を確認することを推奨します。

執筆者西内 渓太

2022年ネットコム入社のクラウドエンジニア。
AWSでのマルチアカウント統制が主な担当分野。


Xアカウント:@knishiuchi0

コーポレートサイト:https://www.nri-net.com/

ソリューションサイト:https://cloud.nri-net.com/