amazon-web-services - 为什么在更新期间不使用 AWS Cloudformation UpdatePolicy PauseTime
问题描述
我设置了一个 CloudFormation 堆栈,它创建了一个自动缩放组 (ASG) 以及其他一些不相关的项目。
ASG 上有如下更新政策:
UpdatePolicy:
AutoScalingReplacingUpdate:
WillReplace: 'false'
AutoScalingScheduledAction:
IgnoreUnmodifiedGroupSizeProperties: 'true'
AutoScalingRollingUpdate:
MinInstancesInService: '0'
MinSuccessfulInstancesPercent: '50'
MaxBatchSize: '2'
PauseTime: PT10M
WaitOnResourceSignals: 'true'
作为我们发布过程的一部分,我们会更新 CloudFormation 中的启动配置。这会触发 ASG 进行更新,这是所需的。
有一个生命周期挂钩,设置了 600 秒的超时值,以防止 EC2 实例进入服务状态,直到完成一些检查。如果这些检查失败,我会向 ASG 发送一个错误信号并向生命周期钩子发送 ABANDON。
/opt/aws/bin/cfn-signal -e 1 --stack ${AWS::StackId} --resource MyASG --region ${AWS::Region}
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
ASG_NAME=$(aws ec2 --region ${AWS::Region} describe-tags --filters Name=resource-type,Values=instance Name=resource-id,Values=$(/opt/aws/bin/ec2-metadata -i | cut -d\: -f2 | tr -d '[:space:]') Name=key,Values='aws:autoscaling:groupName' | jq '.Tags[] | .Value' -r)
HOOK_NAME=$(aws autoscaling describe-lifecycle-hooks --auto-scaling-group-name $ASG_NAME --region ${AWS::Region} |jq -r '.LifecycleHooks[0].LifecycleHookName')
aws autoscaling complete-lifecycle-action --lifecycle-hook-name $HOOK_NAME --auto-scaling-group-name $ASG_NAME --lifecycle-action-result $1 --instance-id $INSTANCE_ID --region ${AWS::Region}
这是因为 EC2 实例被取消和终止。我遇到的问题是 CloudFormation 堆栈中的 ASG 继续在 UPDATE_IN_PROGRESS 中停留一个小时,然后它因“组未稳定”错误而失败,并且一切都开始回滚。
由于 PauseTime 设置为“PT10M”,我希望它最多等待 10 分钟,并在发送 cfn-signal 错误信号后立即开始回滚。
我无法确定为什么堆栈要等待一个小时。这里有什么想法吗?
解决方案
考虑到您的用例,您可以AutoScalingReplacingUpdate
从 ASG 中删除该属性。据我所知,AutoScalingReplacingUpdate
通常AutoScalingRollingUpdate
是相互排斥的。这可以解释为什么不考虑 PT10M。
SUCCESS
此外,PauseTime 是新启动的实例触发信号的时间上限。ABANDON
我可能会给生命周期事件的发生留出一些余地,可能是一两分钟。