🔖

CloudFormationでStackのStatusがRollback中の場合、Outputsが存在しない

commits1 min read

TL;DR

CloudFormation の Stack の State が UPDATE_ROLLBACK_IN_PROGRESS の場合、 describe-stacks の返り値に Outputs が存在しません。

詳細

State が UPDATE_ROLLBACK_IN_PROGRESS の状態で describe-stacks を実行すると、以下のような返り値になります。

[
    {
        "StackId": "arn:aws:cloudformation:ap-northeast-1:******:stack/STACK_NAME/******",
        "StackName": "STACK_NAME",
        "Description": "some description",
        "Parameters": [],
        "CreationTime": "2019-03- 31T06:38:34.000000+00:00",
        "LastUpdatedTime": "2021-02-12T04:01:50.000000+00:00",
        "RollbackConfiguration": {
            "RollbackTriggers": []
        },
        "StackStatus": "UPDATE_ROLLBACK_IN_PROGRESS",
        "StackStatusReason": "some reason"
        "DisableRollback": false,
        "NotificationARNs": [],
        "Capabilities": [
            "CAPABILITY_IAM",
            "CAPABILITY_NAMED_IAM",
            "CAPABILITY_AUTO_EXPAND"
        ],
	// 本来ここに Outputs がある。
        "Tags": [],
        "EnableTerminationProtection": false,
        "DriftInformation": {
            "StackDriftStatus": "NOT_CHECKED"
        }
    }
]

また、 --query オプションで Outputs の値を取得しようとした場合、None が返ります。

$ aws cloudformation describe-stacks --stack-name some-stack --query 'Stacks[0].Outputs[?OutputKey==`SomeKey`]' --output text
None

どうやって存在することを確かめる?

Status が *_COMPLETEUPDATE_COMPLETE, UPDATE_ROLLBACK_COMPLETE )の場合にのみ参照すれば、None が返ることは避けられます。

STATUS="$(aws cloudformation describe-stacks --stack-name some-stack --query 'Stacks[0].StackStatus' --output text)"
if [[ $APRICOT_INFRASTRUCTURE_STATUS != *_COMPLETE ]];
then
    echo "CloudFormation Stack was not COMPLETE."
    exit 1
fi