UpdatePolicy 属性 - AWS CloudFormation
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

UpdatePolicy 属性

可以使用 UpdatePolicy 属性指定 AWS CloudFormation 如何处理 AWS::AutoScaling::AutoScalingGroupAWS::ElastiCache::ReplicationGroupAWS::Elasticsearch::DomainAWS::Lambda::Alias 资源的更新。

  • 对于 AWS::AutoScaling::AutoScalingGroup 资源,AWS CloudFormation 调用三种更新策略之一,具体取决于所做的更改类型或计划的操作是否与 Auto Scaling 组关联。

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

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

      • 更改 Auto Scaling 组的 VPCZoneIdentifier 属性

      • 更改 Auto Scaling 组的 LaunchTemplate 属性

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

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

    • 如果更新的堆栈,包含具有关联的计划操作的 Auto Scaling 组,则将应用 AutoScalingScheduledAction 策略。

  • 对于 AWS::ElastiCache::ReplicationGroup 资源,AWS CloudFormation 可以添加或删除分片,以修改复制组的分片,而不是替换整个资源。有关更多信息,请参阅 UseOnlineResharding 策略

  • 对于 AWS::Elasticsearch::Domain 资源,AWS CloudFormation 可以将 Amazon ES 域,升级到新的 Elasticsearch 版本,而无需替换整个资源。有关更多信息,请参阅EnableVersionUpgrade 策略

  • 对于 AWS::Lambda::Alias 资源,在别名上的版本发生变化时,AWS CloudFormation 将执行 CodeDeploy 部署。有关更多信息,请参阅 CodeDeployLambdaAliasUpdate 策略

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 组滚动更新的最佳实践建议

请注意,在堆栈更新回滚操作期间,CloudFormation 使用在当前堆栈更新操作之前在模板中指定的 UpdatePolicy 配置。例如,假设您将堆栈模板的 UpdatePolicy 中的 MaxBatchSize 从 1 更新为 10。然后,您执行堆栈更新,该更新失败并且 CloudFormation 启动更新回滚操作。在这种情况下,CloudFormation 将 1 作为最大批次大小,而不是 10。因此,在堆栈更新中对 UpdatePolicy 配置进行更改时,我们建议您将该更新与可能触发滚动更新的任何 AWS::AutoScaling::AutoScalingGroup 资源更新分开,并在这些资源更新之前进行。

语法

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 组中必须处于运行状态的最小实例数。该值必须小于 Auto Scaling 组的 MaxSize

默认值0

Type: Integer

Required: No

MinSuccessfulInstancesPercent

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

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

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

MinSuccessfulInstancesPercent 参数仅适用于只用于发信号的实例。要指定 Auto Scaling 组中的实例数,请参阅 AWS::AutoScaling::AutoScalingGroup 资源的 MinSizeMaxSizeDesiredCapacity 属性。

默认值100

Type: Integer

Required: No

PauseTime

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

如果启用 WaitOnResourceSignals 属性,则 PauseTime 是 AWS CloudFormation 等待 Auto Scaling 组从添加或替换的实例中接收所需的有效信号数的时间长度。如果在 Auto Scaling 组收到所需信号数之前超过 PauseTime,更新将失败。要获得最佳结果,请指定一个时段,以便于您的应用程序有足够的时间启动。如果更新需要回滚,则较短的 PauseTime 会导致回滚失败。

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

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

Type: String

Required: No

SuspendProcesses

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

默认值:未指定

类型:Auto Scaling 流程的列表

Required: No

WaitOnResourceSignals

指定 Auto Scaling 组在更新期间是否等待来自新实例的信号。可以使用该属性确保在 Auto Scaling 组继续更新之前实例已完成应用程序安装和配置。在 Auto Scaling 组中启动新的 EC2 实例后,AWS CloudFormation 将暂停更新该组。在继续更新之前,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::AutoScaling::AutoScalingGroup 资源具有关联的计划操作时 AWS CloudFormation 如何处理 MinSizeMaxSizeDesiredCapacity 属性的更新,请使用 AutoScalingScheduledAction 策略。

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

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

语法

JSON

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

属性

IgnoreUnmodifiedGroupSizeProperties

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

默认值false

Type: Boolean

Required: No

UseOnlineResharding 策略

要通过添加或删除分片,而不是通过替换整个 AWS::ElastiCache::ReplicationGroup 资源,来修改复制组的分片,请使用 UseOnlineResharding 更新策略。

如果 UseOnlineResharding 设置为 true,您可以更新 AWS::ElastiCache::ReplicationGroup 资源的 NumNodeGroupsNodeGroupConfiguration 属性,CloudFormation 将在没有中断的情况下,更新这些属性。如果未指定 UseOnlineResharding 或将其设置为 false,更新 NumNodeGroupsNodeGroupConfiguration 属性,将导致 CloudFormation 替换整个 AWS::ElastiCache::ReplicationGroup 资源。

UseOnlineResharding 更新策略没有任何属性。

在将 UseOnlineResharding 更新策略设置为 true 时考虑的事项:

  • 我们强烈建议您将 NumNodeGroupsNodeGroupConfiguration 属性更新作为给定堆栈更新操作中的唯一更新执行。

    更新复制组的节点组配置是一个资源密集型操作。如果堆栈更新失败,CloudFormation 不会将更改回滚到复制组的节点组配置。不过,CloudFormation 会将回滚更新操作失败期间更改的任何其它属性。

  • 任何节点组更新需要指定所有节点组。

    如果指定 NodeGroupConfiguration 属性,您还必须指定每个节点组配置的 NodeGroupId,以便 CloudFormation 在没有中断的情况下更新节点数。

    在创建复制组时,如果您没有指定每个节点组的 ID,则 ElastiCache 自动为每个节点组生成一个 ID。要在没有中断的情况下更新复制组,请使用 ElastiCache 控制台 (https://console.amazonaws.cn/elasticache/) 或 DescribeReplicationGroups 检索复制组中的所有节点组的 ID。接下来,在堆栈模板中指定每个节点组的 ID,然后再尝试添加或删除分片。

    注意

    作为最佳实践,在堆栈模板中创建复制组时,请包括指定的每个节点组的 ID。

    此外,在没有中断的情况下,更新节点数还要求为每个 NodeGroupConfiguration 准确地指定 PrimaryAvailabilityZoneReplicaAvailabilityZonesReplicaCount 属性。同样,您可以使用 ElastiCache 控制台 (https://console.amazonaws.cn/elasticache/) 或 DescribeReplicationGroups 检索每个节点组的实际值,并将其与堆栈模板中的值进行比较。您可以将节点组的属性值更新作为单独的堆栈更新,或作为更改节点组数的相同堆栈更新的一部分。

    如果使用 UseOnlineResharding 更新策略在没有中断的情况下,更新节点组数,ElastiCache 将在指定数量的槽之间平均分配密钥空间。以后,无法对其进行更新。因此,在以这种方式更新节点组数后,应删除从堆栈模板中为每个 NodeGroupConfigurationSlots 属性指定的值,因为它不再反映每个节点组中的实际值。

  • 实际节点组删除结果可能会有所不同。

    在指定的 NumNodeGroups 值小于当前节点组数时,CloudFormation 指示 ElastiCache 删除所需数量的节点组以达到指定的节点数。不过,ElastiCache 可能并非始终能够删除所需数量的节点组。如果 ElastiCache 无法删除所需数量的节点组,CloudFormation 将生成一个堆栈事件,以提醒您该问题。如果 ElastiCache 无法删除任何 节点组,CloudFormation 资源更新将失败。

有关修改复制组的更多信息,请参阅 Amazon ElastiCache API Reference 中的 ModifyReplicationGroupShardConfiguration

语法

JSON

"UpdatePolicy" : { "UseOnlineResharding" : Boolean }

YAML

UpdatePolicy: UseOnlineResharding: Boolean

EnableVersionUpgrade 策略

要将 Amazon ES 域升级到新版本的 Elasticsearch,而不是替换整个 AWS::Elasticsearch::Domain 资源,请使用 EnableVersionUpgrade 更新策略。

如果 EnableVersionUpgrade 设置为 true,您可以更新 AWS::Elasticsearch::Domain 资源的 ElasticsearchVersion 属性,CloudFormation 将更新该属性,而不会发生中断。如果未指定 EnableVersionUpgrade 或将其设置为 false,更新 ElasticsearchVersion 属性将导致 CloudFormation 替换整个 AWS::Elasticsearch::Domain 资源。

EnableVersionUpgrade 更新策略没有任何属性。

有关升级 Amazon ES 域的更多信息,请参阅 Amazon Elasticsearch Service 开发人员指南 中的 UpgradeElasticsearchDomain

语法

JSON

"UpdatePolicy" : { "EnableVersionUpgrade" : Boolean }

YAML

UpdatePolicy: EnableVersionUpgrade: Boolean

CodeDeployLambdaAliasUpdate 策略

要在 AWS::Lambda::Alias 资源上的版本发生变化时,执行 CodeDeploy 部署,请使用 CodeDeployLambdaAliasUpdate 更新策略。

语法

JSON

"UpdatePolicy" : { "CodeDeployLambdaAliasUpdate" : { "AfterAllowTrafficHook" : String, "ApplicationName" : String, "BeforeAllowTrafficHook" : String, "DeploymentGroupName" : String } }

属性

AfterAllowTrafficHook

要在流量路由完成后运行的 Lambda 函数的名称。

必需:

类型:字符串

ApplicationName

CodeDeploy 应用程序的名称。

必需:

类型:字符串

BeforeAllowTrafficHook

要在流量路由开始前运行的 Lambda 函数的名称。

必需:

类型:字符串

DeploymentGroupName

CodeDeploy 部署组的名称。这是设置流量转移策略的位置。

必需:

类型:字符串

有关为 AWS::Lambda::Alias 资源指定 UpdatePolicy 属性的示例,请参阅 Lambda 别名更新策略

示例

以下示例说明如何将更新策略添加到 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" : { ... } } }

Lambda 别名更新策略

以下示例为 UpdatePolicy 资源指定 AWS::Lambda::Alias 属性。部署的所有详细信息,均由传入策略的应用程序和部署组定义。

JSON

"Alias": { "Type": "AWS::Lambda::Alias", "Properties": { "FunctionName": { "Ref": "LambdaFunction" }, "FunctionVersion": { "Fn::GetAtt": [ "FunctionVersionTwo", "Version" ] }, "Name": "MyAlias" }, "UpdatePolicy": { "CodeDeployLambdaAliasUpdate": { "ApplicationName": { "Ref": "CodeDeployApplication" }, "DeploymentGroupName": { "Ref": "CodeDeployDeploymentGroup" }, "BeforeAllowTrafficHook": { "Ref": "PreHookLambdaFunction" }, "AfterAllowTrafficHook": { "Ref": "PreHookLambdaFunction" } } } }

YAML

Alias: Type: 'AWS::Lambda::Alias' Properties: FunctionName: !Ref LambdaFunction FunctionVersion: !GetAtt FunctionVersionTwo.Version Name: MyAlias UpdatePolicy: CodeDeployLambdaAliasUpdate: ApplicationName: !Ref CodeDeployApplication DeploymentGroupName: !Ref CodeDeployDeploymentGroup BeforeAllowTrafficHook: !Ref PreHookLambdaFunction AfterAllowTrafficHook: !Ref PreHookLambdaFunction