

这是新的《CloudFormation 模板参考指南》**。请更新您的书签和链接。有关开始使用 CloudFormation 的帮助，请参阅《AWS CloudFormation 用户指南》[https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)。

# `UpdatePolicy` 属性
<a name="aws-attribute-updatepolicy"></a>

使用 `UpdatePolicy` 属性来指定 CloudFormation 在堆栈更新操作期间将如何处理特定资源的更新。

**Topics**
+ [概述](#aws-resource-update-policies)
+ [WorkSpaces 应用程序更新策略](#aws-attribute-update-policy-app-stream-fleet)
+ [AutoScalingReplacingUpdate 策略](#cfn-attributes-updatepolicy-replacingupdate)
+ [AutoScalingRollingUpdate 策略](#cfn-attributes-updatepolicy-rollingupdate)
+ [AutoScalingScheduledAction 策略](#cfn-attributes-updatepolicy-scheduledactions)
+ [UseOnlineResharding 策略](#cfn-attributes-updatepolicy-useonlineresharding)
+ [EnableVersionUpgrade 策略](#cfn-attributes-updatepolicy-upgradeopensearchdomain)
+ [CodeDeployLambdaAliasUpdate 策略](#cfn-attributes-updatepolicy-codedeploylambdaaliasupdate)
+ [示例](#aws-attribute-updatepolicy-examples)

## 概述
<a name="aws-resource-update-policies"></a>

通过使用 `UpdatePolicy` 属性，您可以控制以下资源的更新方式，如下所述：
+ **[AWS::AppStream::Fleet](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-appstream-fleet.html)**：CloudFormation 可以停止和启动实例集，这会导致实例集中的实例被替换。这样，所有实例都将在堆栈更新后立即应用最新的更改。
+ **[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html)** –借助自动扩缩组，您可以使用一个或多个更新策略来控制 CloudFormation 处理特定更新的方式。这些策略包括：
  + **`AutoScalingReplacingUpdate` 和 `AutoScalingRollingUpdate` 策略** – CloudFormation 可以使用 `AutoScalingReplacingUpdate` 策略来替换自动扩缩组及其实例，也可以使用 `AutoScalingRollingUpdate` 策略仅替换实例。这些替换操作将在您执行下列一项或多项更改时发生：
    + 更改自动扩缩组的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-launchconfiguration.html)。
    + 更改自动扩缩组的 `VPCZoneIdentifier` 属性。
    + 更改自动扩缩组的 `LaunchTemplate` 属性。
    + 更改自动扩缩组的 `PlacementGroup` 属性。
    + 更新包含与当前 `LaunchConfiguration` 不匹配的实例的自动扩缩组。

    如果同时指定 `AutoScalingReplacingUpdate` 和 `AutoScalingRollingUpdate` 策略，则将 `WillReplace` 属性设置为 `true` 将使 `AutoScalingReplacingUpdate` 优先。
  + **`AutoScalingScheduledAction` 策略** – 更新包含具有计划操作的自动扩缩组的堆栈时将应用此策略，这些计划操作会在特定时间扩缩该组。除非已在堆栈模板中显式更改，否则 CloudFormation 无法修改该组的最小大小、最大大小或所需容量。此策略有助于防止任何可能干扰计划扩缩活动的意外更新。
+ **[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticache-replicationgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticache-replicationgroup.html)** – CloudFormation 可以通过增加或移除分片来修改副本组的分片，而不是替换整个资源。
+ **[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opensearchservice-domain.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opensearchservice-domain.html)** 和 **[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticsearch-domain.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticsearch-domain.html)**（旧版）– CloudFormation 可以将 OpenSearch Service 域升级到新版本的 OpenSearch 或 Elasticsearch，而无需替换整个资源。
+ **[https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-alias.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-lambda-alias.html)** – CloudFormation 可以在别名发生版本更改时执行 CodeDeploy 部署。

以下章节描述了每种资源类型所支持的 `UpdatePolicy` 属性的语法和特性。

## WorkSpaces 应用程序更新策略
<a name="aws-attribute-update-policy-app-stream-fleet"></a>

要在更新之前停止 WorkSpaces 应用程序实例集并在更新后将其重启，请使用 WorkSpaces 应用程序更新策略。

### 语法
<a name="aws-attribute-update-policy-app-stream-fleet-syntax"></a>

#### JSON
<a name="aws-attribute-update-policy-app-stream-fleet-syntax-json"></a>

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

#### YAML
<a name="aws-attribute-update-policy-app-stream-fleet-syntax-yaml"></a>

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

`StopBeforeUpdate`  <a name="cfn-attributes-updatepolicy-replacingupdate-StopBeforeUpdate"></a>
更新前停止指定的实例集。  
*必需*：否

`StartAfterUpdate`  <a name="cfn-attributes-updatepolicy-replacingupdate-StartAfterUpdate"></a>
更新后启动指定的实例集。  
*必需*：否

## AutoScalingReplacingUpdate 策略
<a name="cfn-attributes-updatepolicy-replacingupdate"></a>

要替换自动扩缩组及其包含的实例，请使用 `AutoScalingReplacingUpdate` 策略。

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

### 语法
<a name="cfn-attributes-updatepolicy-replacingupdate-syntax"></a>

#### JSON
<a name="aws-attribute-updatepolicy-replacingupdate-syntax.json"></a>

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

#### YAML
<a name="aws-attribute-updatepolicy-replacingupdate-syntax.yaml"></a>

```
UpdatePolicy:
  AutoScalingReplacingUpdate:
    WillReplace: Boolean
```

### 属性
<a name="cfn-attributes-updatepolicy-replacingupdate-properties"></a>

`WillReplace`  <a name="cfn-attributes-updatepolicy-replacingupdate-willreplace"></a>
指定在更新期间是否替换自动扩缩组及其包含的实例。在替换期间，CloudFormation 将保留旧组，直至完成创建新组。如果更新失败，CloudFormation 可以回滚到旧的自动扩缩组，并删除新的自动扩缩组。  
当 CloudFormation 创建新组时，不会分离或附加任何实例。在成功创建新的自动扩缩组后，CloudFormation 在清除过程中，删除旧的自动扩缩组。  
在设置 `WillReplace` 参数时，请记住指定匹配的 [`CreationPolicy` 属性](aws-attribute-creationpolicy.md)。如果在 `Timeout` 期间（在 `CreationPolicy` 属性中指定）发出成功信号的实例未达到最小实例数（由 `MinSuccessfulInstancesPercent` 属性指定），替换更新将失败，并且 CloudFormation 回滚到旧的自动扩缩组。  
*类型*：布尔值  
*必需*：否

## AutoScalingRollingUpdate 策略
<a name="cfn-attributes-updatepolicy-rollingupdate"></a>

要对自动扩缩组中的实例执行滚动更新，而不是等待扩缩活动逐渐用较新的实例替换旧实例，请使用 `AutoScalingRollingUpdate` 策略。此策略让您可以灵活指定 CloudFormation 是分批替换自动扩缩组中的实例，还是一次性全部替换自动扩缩组中的实例，但不替换整个资源。

使用 `AutoScalingRollingUpdate` 策略时的注意事项：
+ 回滚更新时，CloudFormation 会使用在当前堆栈更新之前在模板中指定的 `UpdatePolicy` 配置。例如，假设您在 `UpdatePolicy` 中将 `MaxBatchSize` 从 1 更改为 10 并执行堆栈更新，但更新失败了。CloudFormation 在回滚时将以 1 为最大批次大小，而不是 10。要避免这种情况，请首先通过单独的更新更改 `UpdatePolicy`，然后再进行任何可能启动滚动更新的自动扩缩组更新。
+ CloudFormation 建议指定 `SuspendProcesses` 属性来临时暂停可能会干扰滚动更新并导致更新失败的 Amazon EC2 Auto Scaling 进程。有关更多信息，请参阅[如何在更新 CloudFormation 堆栈时更新我的自动扩缩组？](https://repost.aws/knowledge-center/auto-scaling-group-rolling-updates)
+ CloudFormation 支持在启动或终止实例时使用 Amazon EC2 Auto Scaling 生命周期挂钩。这样，在实例进入下一个状态之前，您将有时间在实例上执行自定义操作。要确保新实例达到 `InService` 状态，请在自定义操作完成后完成生命周期挂钩并确保返回了 `CONTINUE` 结果。默认情况下，如果未收到任何响应并且生命周期挂钩超时，实例启动将被视为失败并被放弃。如果没有实例达到 `InService` 状态，则滚动更新最终将会失败。
+ 实例维护策略、终止策略和横向缩减保护等 Amazon EC2 Auto Scaling 功能不支持 CloudFormation 滚动更新。请相应地计划您的滚动更新。
+ 如果您使用 `AutoScalingRollingUpdate` 策略并移除置放群组设置，则该置放群组将从自动扩缩组和 CloudFormation 模板中移除。此外，这还会触发滚动更新，因此新实例不会启动到置放群组中。

### 语法
<a name="cfn-attributes-updatepolicy-rollingupdate-syntax"></a>

#### JSON
<a name="aws-attribute-updatepolicy-rollingupdate-syntax.json"></a>

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

#### YAML
<a name="aws-attribute-updatepolicy-rollingupdate-syntax.yaml"></a>

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

### 属性
<a name="aws-attribute-updatepolicy-rollingupdate-properties"></a>

`MaxBatchSize`  <a name="cfn-attributes-updatepolicy-rollingupdate-maxbatchsize"></a>
指定可以同时替换的最大实例数量。  
*默认值*：`1`  
*最大值*：`100`  
*类型*：整数  
*必需*：否

`MinActiveInstancesPercent`  <a name="cfn-attributes-updatepolicy-rollingupdate-minactiveinstancespercent"></a>
指定要确保更新成功，自动扩缩组中必须处于 `InService` 状态的实例相对于滚动更新期间该组所需容量的百分比。可以指定从 0 到 100 的值。CloudFormation 取整到最接近的十分位值。例如，如果您更新五个实例，最小 `InService` 百分比为 50，则至少有三个实例必须处于 `InService` 状态。如果实例未在 1 小时的固定时间内转换为 `InService` 状态，則 CloudFormation 会假定该实例未更新。  
在 `UpdatePolicy` 中设置 `MinActiveInstancesPercent` 还会影响在 `AWS::AutoScaling::AutoScalingGroup` 资源中的 `DesiredCapacity` 属性高于该自动扩缩组当前所需容量时启动的实例。  
*默认值*：`100`  
*类型*：整数  
*必需*：否

`MinInstancesInService`  <a name="cfn-attributes-updatepolicy-rollingupdate-mininstancesinservice"></a>
指定当 Auto Scaling 更新旧实例时，CloudFormation 组中必须处于服务状态的实例的最小数目。该值必须小于自动扩缩组的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html#cfn-autoscaling-autoscalinggroup-maxsize](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html#cfn-autoscaling-autoscalinggroup-maxsize)。  
我们建议您将 `MinInstancesInService` 属性的值至少设置为自动扩缩组的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html#cfn-autoscaling-autoscalinggroup-minsize](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html#cfn-autoscaling-autoscalinggroup-minsize)。这样，在滚动更新期间，可以避免由于没有实例为客户流量提供服务而导致的潜在可用性问题。
*默认值*：`0`  
*类型*：整数  
*必需*：否

`MinSuccessfulInstancesPercent`  <a name="cfn-attributes-updatepolicy-rollingupdate-minsuccessfulinstancespercent"></a>
指定 Auto Scaling 回滚更新中必须有多少实例 (百分比) 发送成功信号，才认为更新成功。可以指定从 0 到 100 的值。CloudFormation 取整到最接近的十分位值。例如，如果您更新五个实例，最小成功百分比为 `50`，则必须有三个实例发送成功信号才行。如果实例未在 `PauseTime` 属性中指定的时间内发出信号，则 CloudFormation 会假定实例未更新。  
建议您将 `MinSuccessfulInstancesPercent` 属性的值设置为大于 0 的值。将 `MinSuccessfulInstancesPercent` 属性将设定为 0 时，CloudFormation 会等待 0% 的容量实例进入 `InService` 状态。`MinSuccessfulInstancesPercent` 在将自动扩缩组的状态视为 `UPDATE_COMPLETE` 之前立即返回，以继续进入堆栈模板中定义的后续资源。如果在 CloudFormation 模板中定义了其他自动扩缩组，则它们将同时更新。当所有自动扩缩组在 0% 的容量实例处于 `InService` 状态时同时部署时，您将遇到可用性问题，因为有 0 个实例提供客户流量。  
*默认值*：`100`  
*类型*：整数  
*必需*：否

`PauseTime`  <a name="cfn-attributes-updatepolicy-rollingupdate-pausetime"></a>
在对一批实例进行更改以便为这些实例提供启动软件应用程序的时间后，CloudFormation 暂停的时间量。  
使用 [ISO8601 持续时间格式](https://en.wikipedia.org/wiki/ISO_8601#Durations)（在 `PT#H#M#S` 格式中，每个 *\$1* 分别表示小时数、分钟数和秒数）指定 `PauseTime`。最大 `PauseTime` 为 1 小时 (`PT1H`)。  
如果将 `WaitOnResourceSignals` 设置为 `true`，则 `PauseTime` 会充当超时值。该参数决定了对于在滚动更新期间从被替换的实例以及通过增加 `AWS::AutoScaling::AutoScalingGroup` 资源的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html#cfn-autoscaling-autoscalinggroup-desiredcapacity](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-autoscaling-autoscalinggroup.html#cfn-autoscaling-autoscalinggroup-desiredcapacity) 属性而添加的新实例，CloudFormation 为了从这些实例收到所需数量的有效信号而需要等待的最长时间。如果在 Cloudformation 收到所需数量的信号之前超过了 `PauseTime`，则更新将会失败。要获得最佳结果，请指定一个可确保应用程序有足够启动时间的时间段。如果更新需要回滚，则较短的 `PauseTime` 会导致回滚失败。
*默认值*：`PT5M`（5 分钟），此时 `WaitOnResourceSignals` 属性设置为 `true`。否则，不会设置任何默认值。  
*类型*：字符串  
*必需*：否

`SuspendProcesses`  <a name="cfn-attributes-updatepolicy-rollingupdate-suspendprocesses"></a>
指定堆栈更新期间要暂停的 Auto Scaling 流程。暂停处理可防止 Auto Scaling 干扰堆栈更新。例如，您可以暂停警报，以便 Amazon EC2 Auto Scaling 不执行与警报关联的扩展策略。有关有效值，请参阅《Amazon EC2 Auto Scaling 用户指南》中的 [Types of processes](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-suspend-resume-processes.html#process-types)**。  
*默认值*：未指定  
*类型*：Auto Scaling 流程列表  
*必需*：否

`WaitOnResourceSignals`  <a name="cfn-attributes-updatepolicy-rollingupdate-waitonresourcesignals"></a>
指定在继续更新之前，CloudFormation 是否等待来自新实例的成功信号。CloudFormation 在指定的 `PauseTime` 持续时间内等待成功信号。  
要将信号发送到自动扩缩组，请使用 [cfn-signal](cfn-signal.md) 帮助程序脚本。对于与弹性负载均衡关联的自动扩缩组，可以考虑使用 [cfn-init](cfn-init.md) 帮助程序脚本添加运行状况检查，以确保在实例运行状况良好后再发出成功信号。有关示例，请参阅 [GitHub 存储库](https://github.com/aws-cloudformation/aws-cloudformation-templates/tree/main/AutoScaling)中 Amazon EC2 Auto Scaling 滚动更新示例模板中的 `verify_instance_health` 命令。  
*默认值*：`false`  
*类型*：布尔值  
*必填*：条件性。如果指定 `MinSuccessfulInstancesPercent` 属性，则必须将 `WaitOnResourceSignals` 属性设为 `true`。

## AutoScalingScheduledAction 策略
<a name="cfn-attributes-updatepolicy-scheduledactions"></a>

要指定在 `AWS::AutoScaling::AutoScalingGroup` 资源具有关联的计划操作时 CloudFormation 如何处理 `MinSize`、`MaxSize` 和 `DesiredCapacity` 属性的更新，请使用 `AutoScalingScheduledAction` 策略。

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

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



### 语法
<a name="cfn-attributes-updatepolicy-scheduledactions-syntax"></a>

#### JSON
<a name="aws-attribute-updatepolicy-scheduledactions-syntax.json"></a>

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

#### YAML
<a name="aws-attribute-updatepolicy-scheduledactions-syntax.yaml"></a>

```
UpdatePolicy:
  AutoScalingScheduledAction:
    IgnoreUnmodifiedGroupSizeProperties: Boolean
```

### 属性
<a name="cfn-attributes-updatepolicy-scheduledactions-properties"></a>

`IgnoreUnmodifiedGroupSizeProperties`  <a name="cfn-attributes-updatepolicy-scheduledactions-ignoreunmodifiedgroupsizeproperties"></a>
如果为 `true`，则 CloudFormation 在堆栈更新期间，忽略当前自动扩缩组与模板的 `AWS::AutoScaling::AutoScalingGroup` 资源中所述自动扩缩组之间的组大小属性差异。如果修改了模板中的任何组大小属性值，CloudFormation 将使用修改后的值并更新自动扩缩组。  
堆栈回滚期间将忽略此属性。
*默认值*：`false`  
*类型*：布尔值  
*必需*：否

## UseOnlineResharding 策略
<a name="cfn-attributes-updatepolicy-useonlineresharding"></a>

要通过添加或删除分片，而不是通过替换整个 [AWS::ElastiCache::ReplicationGroup](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticache-replicationgroup.html) 资源，来修改复制组的分片，请使用 `UseOnlineResharding` 更新策略。

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

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

在将 `UseOnlineResharding` 更新策略设置为 `true` 时考虑的事项：
+ 我们强烈建议您将 `NumNodeGroups` 和 `NodeGroupConfiguration` 属性更新作为给定堆栈更新操作中的唯一更新执行。

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

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

  在创建复制组时，如果您没有指定每个节点组的 ID，则 ElastiCache 自动为每个节点组生成一个 ID。要在没有中断的情况下更新复制组，请使用 ElastiCache 控制台（[https://console.aws.amazon.com/elasticache/](https://console.aws.amazon.com/elasticache/)）或 [DescribeReplicationGroups](https://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_DescribeReplicationGroups.html) 检索复制组中的所有节点组的 ID。接下来，在堆栈模板中指定每个节点组的 ID，然后再尝试添加或删除分片。
**注意**  
作为最佳实践，在堆栈模板中创建复制组时，请包括指定的每个节点组的 ID。

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

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

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

有关修改复制组的更多信息，请参阅《Amazon ElastiCache API 参考》中的 [ModifyReplicationGroupShardConfiguration](https://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/API_ModifyReplicationGroupShardConfiguration.html)。

### 语法
<a name="cfn-attributes-updatepolicy-useonlineresharding-syntax"></a>

#### JSON
<a name="cfn-attributes-updatepolicy-useonlineresharding-syntax.json"></a>

```
"UpdatePolicy" : {
  "UseOnlineResharding" : Boolean
}
```

#### YAML
<a name="cfn-attributes-updatepolicy-useonlineresharding-syntax.yaml"></a>

```
UpdatePolicy:
  UseOnlineResharding: Boolean
```

## EnableVersionUpgrade 策略
<a name="cfn-attributes-updatepolicy-upgradeopensearchdomain"></a>

将 OpenSearch Service 域升级到新版本的 OpenSearch 或 Elasticsearch 而不是替换整个 [AWS::OpenSearchService::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-opensearchservice-domain.html) 或 [AWS::Elasticsearch::Domain](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticsearch-domain.html) 资源，请使用 `EnableVersionUpgrade` 更新策略。

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

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

有关更多信息，请参阅《Amazon OpenSearch Service Developer Guide》中的 [Upgrading OpenSearch Service domains](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/version-migration.html)。

### 语法
<a name="cfn-attributes-updatepolicy-upgradeopensearchdomain-syntax"></a>

#### JSON
<a name="cfn-attributes-updatepolicy-upgradeopensearchdomain-syntax.json"></a>

```
"UpdatePolicy" : {
  "EnableVersionUpgrade" : Boolean
}
```

#### YAML
<a name="cfn-attributes-updatepolicy-upgradeopensearchdomain-syntax.yaml"></a>

```
UpdatePolicy:
  EnableVersionUpgrade: Boolean
```

## CodeDeployLambdaAliasUpdate 策略
<a name="cfn-attributes-updatepolicy-codedeploylambdaaliasupdate"></a>

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

### 语法
<a name="cfn-attributes-updatepolicy-codedeploylambdaaliasupdate-syntax"></a>

#### JSON
<a name="aws-attribute-updatepolicy-codedeploylambdaaliasupdate-syntax.json"></a>

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

#### YAML
<a name="aws-attribute-updatepolicy-codedeploylambdaaliasupdate-syntax.yaml"></a>

```
UpdatePolicy:
  CodeDeployLambdaAliasUpdate:
    AfterAllowTrafficHook: String
    ApplicationName: String
    BeforeAllowTrafficHook: String
    DeploymentGroupName: String
```

### 属性
<a name="aws-attribute-updatepolicy-codedeploylambdaaliasupdate-properties"></a>

`AfterAllowTrafficHook`  <a name="cfn-attributes-updatepolicy-codedeploylambdaaliasupdate-afterallowtraffichook"></a>
要在流量路由完成后运行的 Lambda 函数的名称。  
*必需*：否  
*类型*：字符串

`ApplicationName`  <a name="cfn-attributes-updatepolicy-codedeploylambdaaliasupdate-applicationname"></a>
CodeDeploy 应用程序的名称。  
*是否必需*：是  
*类型*：字符串

`BeforeAllowTrafficHook`  <a name="cfn-attributes-updatepolicy-codedeploylambdaaliasupdate-beforeallowtraffichook"></a>
要在流量路由开始前运行的 Lambda 函数的名称。  
*必需*：否  
*类型*：字符串

`DeploymentGroupName`  <a name="cfn-attributes-updatepolicy-codedeploylambdaaliasupdate-deploymentgroupname"></a>
CodeDeploy 部署组的名称。这是设置流量转移策略的位置。  
*是否必需*：是  
*类型*：字符串

有关为 `AWS::Lambda::Alias` 资源指定 `UpdatePolicy` 属性的示例，请参阅 [Lambda 别名更新策略](#aws-resource-lambda-alias-example)。

## 示例
<a name="aws-attribute-updatepolicy-examples"></a>

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

### 将 `UpdatePolicy` 添加到自动扩缩组中
<a name="aws-attribute-updatepolicy-example-1"></a>

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

#### JSON
<a name="attribute-updatepolicy-example-1.json"></a>

```
"ASG" : {
  "Type":"AWS::AutoScaling::AutoScalingGroup",
  "Properties":{
    "VPCZoneIdentifier":[ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ],
    "LaunchTemplate":{
      "LaunchTemplateId":{
        "Ref":"logicalName"
      },
      "Version":{
        "Fn::GetAtt":[
          "logicalName",
          "LatestVersionNumber"
        ]
      }
    },
    "MaxSize":"4",
    "MinSize":"1"
  },
  "UpdatePolicy":{
    "AutoScalingScheduledAction":{
      "IgnoreUnmodifiedGroupSizeProperties":"true"
    },
    "AutoScalingRollingUpdate":{
      "MinInstancesInService":"1",
      "MaxBatchSize":"2",
      "WaitOnResourceSignals":"true",
      "PauseTime":"PT10M",
      "SuspendProcesses":[
        "HealthCheck",
        "ReplaceUnhealthy",
        "AZRebalance",
        "AlarmNotification",
        "ScheduledActions",
        "InstanceRefresh"
      ]
    }
  }
}
```

#### YAML
<a name="attribute-updatepolicy-example-1.yaml"></a>

```
ASG:
  Type: AWS::AutoScaling::AutoScalingGroup
  Properties:
    VPCZoneIdentifier:
      - subnetIdAz1
      - subnetIdAz2
      - subnetIdAz3
    LaunchTemplate:
      LaunchTemplateId: !Ref logicalName
      Version: !GetAtt logicalName.LatestVersionNumber
    MaxSize: '4'
    MinSize: '1'
  UpdatePolicy:
    AutoScalingScheduledAction:
      IgnoreUnmodifiedGroupSizeProperties: 'true'
    AutoScalingRollingUpdate:
      MinInstancesInService: '1'
      MaxBatchSize: '2'
      WaitOnResourceSignals: 'true'
      PauseTime: PT10M
      SuspendProcesses:
        - HealthCheck
        - ReplaceUnhealthy
        - AZRebalance
        - AlarmNotification
        - ScheduledActions
        - InstanceRefresh
```

### AutoScalingReplacingUpdate 策略
<a name="attribute-updatepolicy-AutoScalingReplacingUpdate"></a>

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

#### JSON
<a name="attribute-updatepolicy-example-2.json"></a>

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

#### YAML
<a name="attribute-updatepolicy-example-2.yaml"></a>

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

### 在更新 cfn-init 帮助程序脚本的元数据时维护可用性
<a name="aws-attribute-updatepolicy-cfn-init-metadata"></a>

在实例上安装软件应用程序时，您使用 [`AWS::CloudFormation::Init`](aws-resource-init.md) 元数据键和 [cfn-init](cfn-init.md) 帮助程序脚本来引导自动扩缩组中的实例。CloudFormation 安装软件包、运行命令并执行元数据中描述的其他引导操作。

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

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

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

### 原始模板
<a name="aws-attribute-updatepolicy-cfn-init-metadata-original"></a>

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

### 更新后的逻辑 ID
<a name="aws-attribute-updatepolicy-cfn-init-metadata-updated"></a>

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

### Lambda 别名更新策略
<a name="aws-resource-lambda-alias-example"></a>

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

#### JSON
<a name="aws-attribute-updatepolicy-codedeploylambda.json"></a>

```
"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
<a name="aws-attribute-updatepolicy-codedeploylambda-example.yaml"></a>

```
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
```