我有一个用例,我的 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
脚本没有等待,而是转到下一行,导致事情中断。
等待新堆栈创建 --
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}
错误消息表明堆栈达到了最终故障状态。与任何事情一样,如果你正在做的事情失败了,你就不应该继续。
到达最终状态后,您可以获取堆栈的状态:
aws cloudformation describe-stacks --stack-name STACK_NAME --query 'Stacks[].StackStatus' --output text
如果状态不是
CREATE_COMPLETE
或 UPDATE_COMPLETE
,您应该打印一条错误消息并退出脚本。
等待命令需要堆栈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}"
您正在等待stack-update-complete,它等待:
等到堆栈状态为 UPDATE_COMPLETE。
但是,您正在创建堆栈,而不是更新它。因此,您应该等待 stack-create-complete:
等到堆栈状态为CREATE_COMPLETE。