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

UpdatePolicy 属性

使用 UpdatePolicy 属性指定 Amazon CloudFormation 如何处理以下资源的更新:

资源更新策略

  • 对于 AWS::AppStream::Fleet 资源,CloudFormation 可以使用较新的 AppStream 2.0 代理软件更新映像生成器。有关更多信息,请参阅管理 AppStream 2.0 版本

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

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

      • 更改自动扩缩组的 AWS::AutoScaling::LaunchConfiguration

      • 更改自动扩缩组的 VPCZoneIdentifier 属性。

      • 更改自动扩缩组的 LaunchTemplate 属性。

      • 更新包含与当前 LaunchConfiguration 不匹配的实例的自动扩缩组。

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

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

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

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

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

AppStream 2.0 更新策略

更新策略的 AppStream 2.0 配置。

语法

JSON

{ "UpdatePolicy": { "StopBeforeUpdate": { "Type": "Boolean" }, "StartAfterUpdate": { "Type": "Boolean" } } }

YAML

UpdatePolicy: StopBeforeUpdate: Type: Boolean StartAfterUpdate: Type: Boolean
StopBeforeUpdate

更新前停止指定的实例集。

必需:否

StartAfterUpdate

更新后启动指定的实例集。

必需:否

AutoScalingReplacingUpdate 策略

要指定 Amazon CloudFormation 如何处理自动扩缩组的替换更新,请使用 AutoScalingReplacingUpdate 策略。对于该策略,您可以指定 Amazon CloudFormation 是将自动扩缩组替换为新组,还是仅替换自动扩缩组中的实例。

重要

在尝试更新之前,请确保您具有足够的 Amazon EC2 容量来容纳旧的和新的自动扩缩组。

语法

JSON

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

YAML

UpdatePolicy: AutoScalingReplacingUpdate: WillReplace: Boolean

属性

WillReplace

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

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

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

类型:布尔值

必需:否

AutoScalingRollingUpdate 策略

要指定 CloudFormation 处理自动扩缩组的滚动更新方式,请使用 AutoScalingRollingUpdate 策略。对于滚动更新,您可以指定 Amazon CloudFormation 是批量更新自动扩缩组中的实例,还是一次性更新所有实例。

重要

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

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

语法

JSON

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

属性

MaxBatchSize

指定可以同时替换的最大实例数量。

默认值1

最大值100

类型:整数

必需:否

MinActiveInstancesPercent

指定要取得更新成功,自动扩缩组中必须处于 InService 状态的实例相对于滚动更新期间该组所需容量的百分比。可以指定从 0 到 100 的值。CloudFormation 取整到最接近的十分位值。例如,如果您更新五个实例,最小 InService 百分比为 50,则至少有三个实例必须处于 InService 状态。

如果实例未在 1 小时的固定时间内转换为 InService 状态,則 CloudFormation 会假定该实例未更新。

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

MinActiveInstancesPercent 参数仅适用于只用于稳定目的的实例。要指定自动扩缩组中的实例数,请参阅 AWS::AutoScaling::AutoScalingGroup 资源的 MinSizeMaxSizeDesiredCapacity 属性。

UpdatePolicy 中设置 MinActiveInstancesPercent 还会影响为响应 AWS::AutoScaling::AutoScalingGroup 资源中的 DesiredCapacity 属性高于该自动扩缩组当前所需容量而启动的实例。

默认值100

类型:整数

必需:否

MinInstancesInService

指定当 Auto Scaling 更新旧实例时,CloudFormation 组中必须处于服务状态的实例的最小数目。该值必须小于自动扩缩组的 MaxSize

默认值0

类型:整数

必需:否

MinSuccessfulInstancesPercent

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

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

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

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

默认值100

类型:整数

必需:否

重要

当您将 MinSuccessfulInstancesPercent 属性将设定为 0 时,CloudFormation 等待 0% 的容量实例进入 InService 状态。MinSuccessfulInstancesPercent 在将自动扩缩组的状态视为 Update Complete 之前立即返回,以继续进入堆栈模板中定义的后续资源。

如果在 CloudFormation 模板中定义了其他自动扩缩组,则它们将同时更新。当所有自动扩缩组在 0% 的容量实例处于 InService 状态时同时部署时,您将遇到可用性问题,因为有 0 个实例提供客户流量。

CloudFormation 建议将 MinSuccessfulInstancesPercent 设置为大于 0 的值,允许在考虑完成自动扩缩组更新之前验证合理的最小实例数。

PauseTime

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

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

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

默认值PT1H(1 小时),此时 WaitOnResourceSignals 属性设置为 true

类型:字符串

必需:否

SuspendProcesses

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

默认值:未指定

类型:Auto Scaling 流程列表

必需:否

WaitOnResourceSignals

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

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

默认值true

类型:布尔值

必填:条件性。如果您指定 MinSuccessfulInstancesPercent 属性,则还必须启用 WaitOnResourceSignalsPauseTime 属性。

AutoScalingScheduledAction 策略

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

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

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

语法

JSON

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

属性

IgnoreUnmodifiedGroupSizeProperties

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

默认值false

类型:布尔值

必需:否

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.aws.amazon.com/elasticache/)或 DescribeReplicationGroups 检索复制组中的所有节点组的 ID。接下来,在堆栈模板中指定每个节点组的 ID,然后再尝试添加或删除分片。

    注意

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

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

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

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

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

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

语法

JSON

"UpdatePolicy" : { "UseOnlineResharding" : Boolean }

YAML

UpdatePolicy: UseOnlineResharding: Boolean

EnableVersionUpgrade 策略

将 OpenSearch Service 域升级到新版本的 OpenSearch 或 Elasticsearch 而不是替换整个 AWS::OpenSearchService::DomainAWS::Elasticsearch::Domain 资源,请使用 EnableVersionUpgrade 更新策略。

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

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

有关升级 OpenSearch Service 域的更多信息,请参阅《Amazon OpenSearch Service 开发人员指南》中的 UpgradeDomain

语法

JSON

"UpdatePolicy" : { "EnableVersionUpgrade" : Boolean }

YAML

UpdatePolicy: EnableVersionUpgrade: Boolean

CodeDeployLambdaAlias 更新策略

要在 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 别名更新策略

示例

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

UpdatePolicy 添加到自动扩缩组中

以下示例说明如何添加更新策略。更新期间,自动扩缩组将更新两批实例并至少保留一个实例可用。由于设置了 WaitOnResourceSignals 标记,自动扩缩组将等待添加到组中的新实例发送信号。新实例必须在其更新下一批实例之前,向自动扩缩组发送信号。

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 策略

以下示例声明在更新期间强制替换关联的自动扩缩组的策略。要使更新成功,必须有一定百分比的实例 (由 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 帮助程序脚本来引导自动扩缩组中的实例。CloudFormation 安装软件包、运行命令并执行元数据中描述的其他引导操作。

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

重要

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

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

原始模板

"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