我如何在更新 AWS CloudFormation 堆栈时正确更新我的 Auto Scaling 组?

上次更新时间:2020 年 3 月 11 日

我对我的 Auto Scaling 组进行了更新,但没有收到 AWS CloudFormation 堆栈更新期间预计会收到的结果。

简短描述

AWS::AutoScaling::AutoScalingGroup 资源使用 UpdatePolicy attribute 定义如何在更新 AWS CloudFormation 堆栈时更新 Auto Scaling 组资源。如果您没有为 UpdatePolicy 属性配置正确的设置,您的滚动更新将会产生意外结果。

您可以使用 AutoScalingRollingUpdate policy 控制 AWS CloudFormation 处理 Auto Scaling 组滚动更新的方式。此常见方法将保留相同的 Auto Scaling 组,然后基于您设置的参数替换旧实例。

注意:下面的解决方法仅关注 AutoScalingRollingUpdate 策略。您可以使用 AutoScalingReplacingUpdate policy 立即回滚堆栈而不会发生故障。

AutoScalingRollingUpdate 策略支持以下配置选项:

"UpdatePolicy": {
  "AutoScalingRollingUpdate": {
    "MaxBatchSize": Integer,
    "MinInstancesInService": Integer,
    "MinSuccessfulInstancesPercent": Integer,
    "PauseTime": String,
    "SuspendProcesses": [ List of processes ],
    "WaitOnResourceSignals": Boolean
  }
}

解决方法

要了解堆栈更新期间是什么阻止了您的 Auto Scaling 组正确更新,请根据需要完成以下问题排查场景:

配置 WaitOnResourceSignals 和 PauseTime 以避免成功信号出现问题

在您的 AutoScalingRollingUpdate 策略中,将 WaitOnResourceSignals 属性设置为 false

注意:如果 WaitOnResourceSignals 被设置为 true,则 PauseTime 会更改为超时值。AWS CloudFormation 等待接收成功信号,直到达到 PauseTime 值指定的最长时间。如果没有收到信号,AWS CloudFormation 将取消更新。然后,AWS CloudFormation 会回滚具有相同设置的堆栈,包括相同的 PauseTime 值。有关更多信息,请参阅添加 UpdatePolicy 到 Auto Scaling 组

配置 MinSuccessfulInstancesPercent 以避免堆栈回滚

如果您在滚动更新期间替换大量实例并等待接收每个实例的成功信号,则设置 AutoScalingRollingUpdate 策略中 MinSuccessfulInstancesPercent 属性的值。

注意:如果只有一个实例启动失败,则设置 MinSuccessfulInstancesPercent 属性将防止 AWS CloudFormation 回滚整个堆栈。有关更多信息,请参阅 UpdatePolicy 属性

配置 SuspendProcesses 以避免 Auto Scaling 组发生意外更改

在滚动更新期间,暂停以下 Auto Scaling 过程:

  • HealthCheck
  • ReplaceUnhealthy
  • AZRebalance
  • AlarmNotification
  • ScheduledActions

重要提示:如果您将 Auto Scaling 组与 Elastic Load Balancing 结合使用,请不要暂停以下过程:启动、终止和 AddToLoadBalancer。进行滚动更新需要这些过程。

注意:如果某个意外扩展操作在滚动更新期间更改了 Auto Scaling 组的状态,则更新可能会失败。此失败情况可能因 AWS CloudFormation 对 Auto Scaling 组的显示不一致造成。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?