【问题标题】:How to wait until an AWS CloudFormation stack creation or update is completed in bash?如何等到在 bash 中完成 AWS CloudFormation 堆栈创建或更新?
【发布时间】:2020-11-09 12:11:44
【问题描述】:

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

我发现可以使用以下命令:

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

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

以下是脚本的 sn-p -

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 amazon-cloudformation aws-cli


    【解决方案1】:

    等待新的堆栈创建 -- aws cloudformation wait stack-create-complete

    等待现有堆栈更新 -- aws cloudformation wait stack-update-complete

    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】:

      等待命令期望堆栈 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}"
      

      【讨论】:

        【解决方案3】:

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

        您可以在达到终端状态后获取堆栈的状态:

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

        如果状态不是CREATE_COMPLETEUPDATE_COMPLETE,您应该打印一条错误消息并退出您的脚本。

        【讨论】:

        • 如何让我的脚本执行等到 CREATE_READY 状态?
        • @Ani - 我添加了检索堆栈状态的命令。我假设您知道如何在脚本中执行条件。
        【解决方案4】:

        你在等待stack-update-complete 等待:

        等到堆栈状态为 UPDATE_COMPLETE。

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

        等到堆栈状态为 CREATE_COMPLETE。

        【讨论】:

        • 我在创建 cf 堆栈后正在做 aws cloudformation wait stack-create-complete --stack-name stackNameHere,但收到错误,将 sn-p 添加到问题中
        猜你喜欢
        • 2021-12-07
        • 1970-01-01
        • 2018-05-09
        • 2018-10-01
        • 1970-01-01
        • 2020-03-10
        • 2022-08-05
        • 2019-08-06
        • 2021-06-29
        相关资源
        最近更新 更多