设置ECS Cloudformation更新堆栈超时?

时间:2017-03-16 22:19:52

标签: amazon-cloudformation amazon-ecs

使用新的Container Image更新Cloudformation EC2容器服务(ECS)堆栈时,有没有办法控制超时,所以如果服务不稳定,它会自动回滚?

作为Auto Scaling组的一部分的UpdatePolicy属性没有帮助,因为没有创建实例。

我也尝试过WaitCondition,但却无法让它工作。

堆栈基本上只停留在UPDATE_IN_PROGRESS状态,直到达到默认超时(~3小时),或触发取消更新。

理想情况下,我们可以在短时间内使堆栈超时。

这是我的Cloudformation模板的样子: https://s3.amazonaws.com/aws-rga-cw-public/ops/cfn/ecs-cluster-asg-elb-cfn.yaml
感谢。

4 个答案:

答案 0 :(得分:1)

如果您的WaitCondition在原始创建中,则需要重命名它(和Handle)。一旦等待条件被发信号通知完成,它将始终完成。如果您重命名并进行更新,则将删除原始的WaitCondition和Handle,并创建并发出新的创建信号。

如果您不想修改模板,可能能够使用Lamba和自定义资源通过aws cli为每次更新创建一个独特的WaitCondition。

答案 1 :(得分:1)

我已经为该问题创建了一种解决方法,直到AWS创建允许资源信令的ECS UpdatePolicy和CreationPolicy:

AWS::CloudFormation::WaitCondition与宏配合使用,该宏将在预期服务更新时创建新的WaitCondition资源。用附加到任务的非必需容器来通知等待条件。

示例:https://github.com/deuscapturus/cloudformation-macro-WaitConditionUpdate/blob/master/example-ecs-service.yaml

以上示例的宏可以在这里找到:https://github.com/deuscapturus/cloudformation-macro-WaitConditionUpdate

答案 2 :(得分:1)

我解决这个问题的方法是在触发更新堆栈之前,在后台运行一个脚本

./deployment-breaker.sh &

对于脚本

#!/bin/bash
sleep 600
$deploymentStatus = (aws cloudformation describe-stack --stack-name STACK_NAME | jq XXX)
if [[ $deploymentStatus == YOUR_TERMINATE_CONDITION ]]then
  aws cloudformation cancel-update-stack --stack-name STACK_NAME
fi

答案 3 :(得分:0)

目前使用提供的CloudFormation类型无法实现。我遇到了同样的问题,我可能会创建一个自定义CloudFormation资源(usineg AWS Lambda)来替换我的AWS :: ECS :: Service。

另一种选择是使用嵌套堆栈来包装AWS :: ECS :: Service资源 - 它不会解决问题,但它至少会隔离单个服务,而堆栈的其余部分将在良好的状态。我的堆栈有多个服务,这会有所帮助,但到目前为止,自定义资源是最好的选择(我知道其他人做了同样的事情)。