使用新的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
感谢。
答案 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
答案 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资源 - 它不会解决问题,但它至少会隔离单个服务,而堆栈的其余部分将在良好的状态。我的堆栈有多个服务,这会有所帮助,但到目前为止,自定义资源是最好的选择(我知道其他人做了同样的事情)。