如何输出堆栈创建成功信息,直到在堆栈中创建所有资源

时间:2015-12-15 08:30:25

标签: amazon-cloudformation

我正在尝试使用aws cloudformation create-stack --stack-name ... --template-body file://...创建一个堆栈来创建堆栈。它在我执行命令后立即输出堆栈ID。但是堆栈所需的资源仍然在创建。

我希望在创建所有资源之前输出一些消息。

我不想在循环中描述堆栈。并输出消息,直到堆栈创建完成信号。

3 个答案:

答案 0 :(得分:14)

在初始创建堆栈请求之后,您需要请求另一个:

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

来自aws docs Application.Run

  

等到堆栈状态为CREATE_COMPLETE。它将每30个轮询一次   秒,直到达到成功状态。这将退出   120次检查失败后返回代码为255.

答案 1 :(得分:3)

Google云与AWS :: CF有类似的产品。

gcloud deployment-manager deployments create [stack_name]

此命令允许我们指定异步开关:

 --async
    Return immediately and print information about the Operation in
    progress rather than waiting for the Operation to complete.
    (default=False)

默认情况下,gcloud命令将以异步模式执行,事实上,它几乎完全符合您的建议。当我启动堆栈时,我必须等待整个过程完成才能看到“堆栈创建/失败”消息。

据我所知,AWS :: CF没有这样的功能。默认情况下,aws cli似乎在异步模式下启动进程。

然而,话虽如此,似乎gcloud cli命令正在完成您所说的您不想做的事情:在循环中查询API以确定堆栈创建过程的状态。

是否有理由不能编写脚本来查询AWS :: CF API以获取堆栈创建的状态?

答案 2 :(得分:0)

运行aws cloudformation create-stack后,我还需要在bash脚本中等待。我很犹豫使用aws cloudformation wait stack-create-complete命令,因为它最多只轮询60分钟(120次30秒)。另外,我不想运行测试来查看如果堆栈以“ CREATE_COMPLETE”以外的状态结束时的行为。因此,我用bash编写了自己的等待,如下所示:

aws --region ${AWS_REGION} --profile ${AWS_PROFILE} cloudformation create-stack --template-body ${STACK_TEMPLATE} --stack-name ${STACK_NAME}
if [[ $? -eq 0 ]]; then
    # Wait for create-stack to finish
    echo  "Waiting for create-stack command to complete"
    CREATE_STACK_STATUS=$(aws --region ${AWS_REGION} --profile ${AWS_PROFILE} cloudformation describe-stacks --stack-name ${STACK_NAME} --query 'Stacks[0].StackStatus' --output text)
    while [[ $CREATE_STACK_STATUS == "REVIEW_IN_PROGRESS" ]] || [[ $CREATE_STACK_STATUS == "CREATE_IN_PROGRESS" ]]
    do
        # Wait 30 seconds and then check stack status again
        sleep 30
        CREATE_STACK_STATUS=$(aws --region ${AWS_REGION} --profile ${AWS_PROFILE} cloudformation describe-stacks --stack-name ${STACK_NAME} --query 'Stacks[0].StackStatus' --output text)
    done
fi