首页 > 解决方案 > 为什么在更新期间不使用 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 错误信号后立即开始回滚。

我无法确定为什么堆栈要等待一个小时。这里有什么想法吗?

标签: amazon-web-servicesamazon-ec2amazon-cloudformationautoscaling

解决方案


考虑到您的用例,您可以AutoScalingReplacingUpdate从 ASG 中删除该属性。据我所知,AutoScalingReplacingUpdate通常AutoScalingRollingUpdate是相互排斥的。这可以解释为什么不考虑 PT10M。

SUCCESS此外,PauseTime 是新启动的实例触发信号的时间上限。ABANDON我可能会给生命周期事件的发生留出一些余地,可能是一两分钟。


推荐阅读