如何在 bash 中等待 AWS CloudFormation 堆栈创建或更新完成?

问题描述 投票:0回答:4

我有一个用例,我的 bash 脚本需要等待 AWS CloudFormation 完成创建或更新堆栈。

我发现可以使用以下命令来执行此操作:

aws cloudformation wait stack-create-complete --stack-name STACK_NAME

aws cloudformation wait stack-update-complete --stack-name STACK_NAME

以下是脚本片段 -

echo "Creating stack ..."

aws cloudformation create-stack --stack-name $STACK_NAME \
--parameters  ParameterKey=Environment,ParameterValue=Development \
--template-body file://someCfScript.yaml \
--capabilities CAPABILITY_AUTO_EXPAND --profile someProfileName

aws cloudformation wait stack-create-complete --stack-name $STACK_NAME

但是我无法这样做,并且出现以下错误:

{
    "StackId": "arn:aws:cloudformation:ap-southeast-1:someAwsAcId:stack/someStackName/xxxx-xxx-xx-xxx-xxxxx"
}

Waiter StackCreateComplete failed: Waiter encountered a terminal failure state

脚本没有等待,而是转到下一行,导致事情中断。

bash amazon-web-services aws-cloudformation aws-cli
4个回答
3
投票

等待新堆栈创建 --

aws cloudformation wait stack-create-complete --stack-name STACK_NAME

等待现有堆栈更新 --

aws cloudformation wait stack-update-complete --stack-name STACK_NAME

wait_stack_create() {
    STACK_NAME=$1

    echo "Waiting for [$STACK_NAME] stack creation."

    aws cloudformation wait stack-create-complete \
    --region ${REGION}  \
    --stack-name ${STACK_NAME}
    status=$?

    if [[ ${status} -ne 0 ]] ; then
        # Waiter encountered a failure state.
        echo "Stack [${STACK_NAME}] creation failed. AWS error code is ${status}."

        exit ${status}
    fi
}

函数调用:

wait_stack_create ${TEST_SERVICE_STACK}

2
投票

错误消息表明堆栈达到了最终故障状态。与任何事情一样,如果你正在做的事情失败了,你就不应该继续。

到达最终状态后,您可以获取堆栈的状态:

aws cloudformation describe-stacks --stack-name STACK_NAME --query 'Stacks[].StackStatus' --output text

如果状态不是

CREATE_COMPLETE
UPDATE_COMPLETE
,您应该打印一条错误消息并退出脚本。


2
投票

等待命令需要堆栈arn

添加到创建堆栈命令

jq -r '.StackId'

类似:

ID=$(aws cloudformation create-stack --stack-name $STACK_NAME \
--parameters  ParameterKey=Environment,ParameterValue=Development \
--template-body file://someCfScript.yaml \
--capabilities CAPABILITY_AUTO_EXPAND --profile someProfileName| jq -r '.StackId')

然后你就可以做

aws cloudformation wait stack-create-complete --stack-name "${STACKID}"

-1
投票

您正在等待stack-update-complete,它等待:

等到堆栈状态为 UPDATE_COMPLETE。

但是,您正在创建堆栈,而不是更新它。因此,您应该等待 stack-create-complete:

等到堆栈状态为CREATE_COMPLETE。

© www.soinside.com 2019 - 2024. All rights reserved.