AWS CloudFormation
User Guide (API Version 2010-05-15)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

UpdatePolicy 属性

使用 UpdatePolicy 属性可指定 AWS CloudFormation 如何处理对 AWS::AutoScaling::AutoScalingGroup 资源的更新。AWS CloudFormation 将调用三种更新策略之一,具体取决于您所做更改的类型或计划的操作是否与 Auto Scaling 组关联。

  • AutoScalingReplacingUpdateAutoScalingRollingUpdate 策略 在您执行下列一项或多项操作时适用:

    • 更改 Auto Scaling 组的 AWS::AutoScaling::LaunchConfiguration

    • 更改 Auto Scaling 组的 VPCZoneIdentifier 属性

    • 更新包含与当前 LaunchConfiguration 不匹配的实例的 Auto Scaling 组。

    如果同时指定 AutoScalingReplacingUpdateAutoScalingRollingUpdate 策略,则将 WillReplace 属性设置为 true 将使 AutoScalingReplacingUpdate 优先。

  • 在使用关联的计划操作更新包含 Auto Scaling 组的堆栈时,将应用 AutoScalingScheduledAction 策略。

AutoScalingReplacingUpdate 策略

要指定 AWS CloudFormation 处理 Auto Scaling 组的替换更新的方式,请使用 AutoScalingReplacingUpdate 策略。此策略允许您指定 AWS CloudFormation 是将 Auto Scaling 组替换为新组还是仅替换 Auto Scaling 组中的实例。

重要

在尝试更新之前,请确保您的 Amazon EC2 容量足以容纳旧的和新的 Auto Scaling 组。

语法

JSON

"UpdatePolicy" : { "AutoScalingReplacingUpdate" : { "WillReplace" : Boolean } }

YAML

UpdatePolicy: AutoScalingReplacingUpdate: WillReplace: Boolean

属性

WillReplace

指定在更新期间是否替换 Auto Scaling 组及其包含的实例。在替换期间,AWS CloudFormation 将保留旧组,直至完成创建新组。如果更新失败,AWS CloudFormation 可回滚到旧 Auto Scaling 组并删除新的 Auto Scaling 组。

当 AWS CloudFormation 创建新组时,不会分离或附加任何实例。成功创建新的 Auto Scaling 组后,AWS CloudFormation 将在清除过程中删除旧的 Auto Scaling 组。

在设置 WillReplace 参数时,请记住指定匹配的 CreationPolicy。如果在 Timeout 期间(在 CreationPolicy 策略中指定)发出成功信号的实例未达到最小实例数(由 MinSuccessfulInstancesPercent 属性指定),则替换更新将失败,并且 AWS CloudFormation 将回滚到旧 Auto Scaling 组。

Type: Boolean

Required: No

AutoScalingRollingUpdate 策略

要指定 AWS CloudFormation 处理 Auto Scaling 组的滚动更新的方式,请使用 AutoScalingRollingUpdate 策略。利用滚动更新,您可以指定 AWS CloudFormation 是批量更新还是一次性全部更新 Auto Scaling 组中的实例。

重要

在滚动更新期间,某些 Auto Scaling 流程可能会在 AWS CloudFormation 完成滚动更新前对 Auto Scaling 组做出更改。这些更改可能导致滚动更新失败。要阻止 Auto Scaling 在滚动更新期间运行进程,请使用 SuspendProcesses 属性。有关更多信息,请参阅执行 Auto Scaling 组滚动更新的最佳实践建议

语法

JSON

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

YAML

UpdatePolicy: AutoScalingRollingUpdate: MaxBatchSize: Integer MinInstancesInService: Integer MinSuccessfulInstancesPercent: Integer PauseTime: String SuspendProcesses: - List of processes WaitOnResourceSignals: Boolean

属性

MaxBatchSize

指定 AWS CloudFormation 更新的实例的最大数目。

默认值1

Type: Integer

Required: No

MinInstancesInService

指定当 AWS CloudFormation 更新旧实例时,Auto Scaling 组中必须处于服务状态的实例的最小数目。

默认值0

Type: Integer

Required: No

MinSuccessfulInstancesPercent

指定 Auto Scaling 回滚更新中必须有多少实例(百分比)发送成功信号才认为更新成功。可以指定从 0100 的值。AWS CloudFormation 取整到最接近的十分位值。例如,如果您更新五个实例,最小成功百分比为 50,则必须有三个实例发送成功信号才行。

如果实例未在 PauseTime 属性中指定的时间内发出信号,则 AWS CloudFormation 会假定实例未更新。

如果您指定此属性,则还必须启用 WaitOnResourceSignalsPauseTime 属性。

默认值100

Type: Integer

Required: No

PauseTime

在对一批实例进行更改以便为这些实例提供启动软件应用程序的时间后,AWS CloudFormation 暂停的时间量。例如,在扩展 Auto Scaling 组中的实例数时,您可能需要指定 PauseTime

如果您启用 WaitOnResourceSignals 属性,则 PauseTime 为 AWS CloudFormation 等待 Auto Scaling 组收到来自所添加或所替换实例的所需数目的有效信号的时间量。如果已超过了 PauseTime,但 Auto Scaling 组未收到所需数量的信号,则更新将失败。要获得最佳结果,请指定一个时段以便您的应用程序有足够的时间启动。如果更新需要回滚,则较短的 PauseTime 会导致回滚失败。

使用 ISO8601 持续时间格式(在 PT#H#M#S 格式中,每个 # 分别表示小时数、分钟数和秒数)指定 PauseTime。最大 PauseTime 为 1 小时 (PT1H)。

默认值PT0S(零秒)。如果 WaitOnResourceSignals 属性设置为 true,则默认为 PT5M

Type: String

Required: No

SuspendProcesses

指定堆栈更新期间要暂停的 Auto Scaling 流程。暂停处理可防止 Auto Scaling 干扰堆栈更新。例如,您可以暂停警报,以便 Auto Scaling 不执行与警报关联的扩展策略。对于有效值,请参阅 Auto Scaling API 参考 中的 SuspendProcesses 操作的 ScalingProcesses.member.N 参数。

默认值:未指定

类型:Auto Scaling 流程的列表

Required: No

WaitOnResourceSignals

指定 Auto Scaling 组在更新期间是否等待来自新实例的信号。使用此属性可确保实例在 Auto Scaling 组继续更新之前已完成安装和配置应用程序。AWS CloudFormation 在新的 EC2 实例在 Auto Scaling 组中启动后暂停对该组的更新。在继续更新之前,AWS CloudFormation 必须在指定的 PauseTime 内收到来自每个新实例的信号。要将信号发送到 Auto Scaling 组,请使用 cfn-signal 帮助程序脚本或 SignalResource API。

要让实例在发送成功信号之前等待 Elastic Load Balancing 运行状况检查,请使用 cfn-init 帮助程序脚本来添加运行状况检查验证。例如,请参阅 Auto Scaling 滚动更新示例模板中的 verify_instance_health 命令。

默认值false

Type: Boolean

Required: Conditional。如果您指定 MinSuccessfulInstancesPercent 属性,则还必须启用 WaitOnResourceSignalsPauseTime 属性。

AutoScalingScheduledAction 策略

要指定 AWS CloudFormation 在 AWS::AutoScaling::AutoScalingGroup 资源具有关联的计划操作时处理 MinSizeMaxSizeDesiredCapacity 属性的更新的方式,请使用 AutoScalingScheduledAction 策略。

利用计划操作,Auto Scaling 组的组大小属性可随时更改。当您利用 Auto Scaling 组和计划操作更新堆栈时,AWS CloudFormation 始终将您的 Auto Scaling 组的组大小属性值设置为模板的 AWS::AutoScaling::AutoScalingGroup 资源中定义的值,即使计划操作已生效。

如果您不希望 AWS CloudFormation 在您具有生效的计划操作时更改任何组大小属性值,请使用 AutoScalingScheduledAction 更新策略来阻止 AWS CloudFormation 更改 MinSizeMaxSizeDesiredCapacity 属性,除非您已在模板中修改这些值。

语法

JSON

"UpdatePolicy" : { "AutoScalingScheduledAction" : { "IgnoreUnmodifiedGroupSizeProperties" : Boolean } }

属性

IgnoreUnmodifiedGroupSizeProperties

指定 AWS CloudFormation 是否在堆栈更新期间忽略当前 Auto Scaling 组和模板的 AWS::AutoScaling::AutoScalingGroup 资源中描述的 Auto Scaling 组之间的组大小属性差异。如果您在模板中修改任何组大小属性值,则 AWS CloudFormation 将使用修改后的值并更新您的 Auto Scaling 组。

默认值false

Type: Boolean

Required: No

示例

以下示例说明如何将更新策略添加到 Auto Scaling 组以及如何在更新元数据时维护可用性。

将 UpdatePolicy 添加到 Auto Scaling 组

以下示例说明如何添加更新策略。更新期间,Auto Scaling 组将更新两批实例并至少保留一个实例可用。由于已设置 WaitOnResourceSignals 标签,因此 Auto Scaling 组等待要添加到组的新实例。新实例必须在其更新下一批实例之前向 Auto Scaling 组发送信号。

JSON

"ASG" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "AvailabilityZones" : [ "us-east-1a", "us-east-1b" ], "DesiredCapacity" : "1", "LaunchConfigurationName" : { "Ref" : "LaunchConfig" }, "MaxSize" : "4", "MinSize" : "1" }, "UpdatePolicy" : { "AutoScalingScheduledAction" : { "IgnoreUnmodifiedGroupSizeProperties" : "true" }, "AutoScalingRollingUpdate" : { "MinInstancesInService" : "1", "MaxBatchSize" : "2", "WaitOnResourceSignals" : "true", "PauseTime" : "PT10M" } } }, "ScheduledAction" : { "Type" : "AWS::AutoScaling::ScheduledAction", "Properties" : { "AutoScalingGroupName" : { "Ref" : "ASG" }, "DesiredCapacity" : "2", "StartTime" : "2017-06-02T20 : 00 : 00Z" } }

YAML

ASG: Type: 'AWS::AutoScaling::AutoScalingGroup' Properties: AvailabilityZones: - us-east-1a - us-east-1b DesiredCapacity: '1' LaunchConfigurationName: Ref: LaunchConfig MaxSize: '4' MinSize: '1' UpdatePolicy: AutoScalingScheduledAction: IgnoreUnmodifiedGroupSizeProperties: 'true' AutoScalingRollingUpdate: MinInstancesInService: '1' MaxBatchSize: '2' WaitOnResourceSignals: 'true' PauseTime: PT10M ScheduledAction: Type: 'AWS::AutoScaling::ScheduledAction' Properties: AutoScalingGroupName: Ref: ASG DesiredCapacity: '2' StartTime: '2017-06-02T20 : 00 : 00Z'

AutoScalingReplacingUpdate 策略

下面的示例声明在更新期间强制替换关联的 Auto Scaling 组的策略。要使更新成功,必须有一定百分比的实例(由 MinSuccessfulPercentParameter 参数指定)在 Timeout 时间内发出成功信号。

JSON

"UpdatePolicy" : { "AutoScalingReplacingUpdate" : { "WillReplace" : "true" } }, "CreationPolicy" : { "ResourceSignal" : { "Count" : { "Ref" : "ResourceSignalsOnCreate"}, "Timeout" : "PT10M" }, "AutoScalingCreationPolicy" : { "MinSuccessfulInstancesPercent" : { "Ref" : "MinSuccessfulPercentParameter" } } }

YAML

UpdatePolicy: AutoScalingReplacingUpdate: WillReplace: 'true' CreationPolicy: ResourceSignal: Count: !Ref 'ResourceSignalsOnCreate' Timeout: PT10M AutoScalingCreationPolicy: MinSuccessfulInstancesPercent: !Ref 'MinSuccessfulPercentParameter'

在更新 cfn-init 帮助程序脚本的元数据时维护可用性

在实例上安装软件应用程序时,您可以使用 AWS::CloudFormation::Init 元数据键和 cfn-init 帮助程序脚本来引导 Auto Scaling 组中的实例。AWS CloudFormation 安装软件包、运行命令并执行元数据中描述的其他引导操作。

在仅更新元数据(例如,在将软件包更新为另一个版本时)时,您可以使用 cfn-hup 帮助程序守护程序检测和应用更新。不过,cfn-hup 守护程序会在每个实例上单独运行。如果守护程序同时在所有实例上运行,则您的应用程序或服务可能在更新期间不可用。要确保可用性,您可以强制滚动更新,以便 AWS CloudFormation 一次更新一批实例。

重要

强制滚动更新要求 AWS CloudFormation 创建新实例,然后删除旧实例。旧实例中存储的任何信息都将丢失。

要强制滚动更新,请更改启动配置资源的逻辑 ID,然后更新堆栈和任何指向原始逻辑 ID 的引用(例如,关联的 Auto Scaling 组)。AWS CloudFormation 将触发对 Auto Scaling 组的滚动更新,并替换所有实例。

原始模板

"LaunchConfig": { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Metadata" : { "Comment" : "Install a simple PHP application", "AWS::CloudFormation::Init" : { ... } } }

更新后的逻辑 ID

"LaunchConfigUpdateRubygemsPkg": { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Metadata" : { "Comment" : "Install a simple PHP application", "AWS::CloudFormation::Init" : { ... } } }