UpdatePolicy
属性
使用 UpdatePolicy
属性指定 Amazon CloudFormation 如何处理以下资源的更新:
资源更新策略
-
对于
AWS::AppStream::Fleet
资源,CloudFormation 可以使用较新的 AppStream 2.0 代理软件更新映像生成器。有关更多信息,请参阅管理 AppStream 2.0 版本。 -
对于
AWS::AutoScaling::AutoScalingGroup
资源,CloudFormation 调用三种更新策略之一,具体取决于所做更改的类型或计划的操作是否与自动扩缩组关联。-
AutoScalingReplacingUpdate
和AutoScalingRollingUpdate
策略仅在您完成下列一项或多项操作时适用:-
更改自动扩缩组的
AWS::AutoScaling::LaunchConfiguration
。 -
更改自动扩缩组的
VPCZoneIdentifier
属性。 -
更改自动扩缩组的
LaunchTemplate
属性。 -
更新包含与当前
LaunchConfiguration
不匹配的实例的自动扩缩组。
如果同时指定
AutoScalingReplacingUpdate
和AutoScalingRollingUpdate
策略,则将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
, "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
-
指定 CloudFormation 更新的实例的最大数目。
默认值:
1
最大值:
100
类型:整数
必需:否
MinInstancesInService
-
指定当 Auto Scaling 更新旧实例时,CloudFormation 组中必须处于服务状态的实例的最小数目。该值必须小于自动扩缩组的 MaxSize。
默认值:
0
类型:整数
必需:否
MinSuccessfulInstancesPercent
-
指定 Auto Scaling 回滚更新中必须有多少实例 (百分比) 发送成功信号,才认为更新成功。可以指定从
0
到100
的值。CloudFormation 取整到最接近的十分位值。例如,如果您更新五个实例,最小成功百分比为50
,则必须有三个实例发送成功信号才行。如果实例未在
PauseTime
属性中指定的时间内发出信号,则 CloudFormation 会假定实例未更新。如果您指定该属性,则还必须启用
WaitOnResourceSignals
和PauseTime
属性。MinSuccessfulInstancesPercent
参数仅适用于只用于发信号的实例。要指定自动扩缩组中的实例数,请参阅 AWS::AutoScaling::AutoScalingGroup 资源的MinSize
、MaxSize
和DesiredCapacity
属性。默认值:
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
属性,则还必须启用WaitOnResourceSignals
和PauseTime
属性。
AutoScalingScheduledAction 策略
要指定在 AWS::AutoScaling::AutoScalingGroup
资源具有关联的计划操作时 Amazon CloudFormation 如何处理 MinSize
、MaxSize
和 DesiredCapacity
属性的更新,请使用 AutoScalingScheduledAction
策略。
利用计划操作,自动扩缩组的组大小属性可随时更改。当您利用自动扩缩组和计划操作更新堆栈时, CloudFormation 始终将您的自动扩缩组的组大小属性值设置为模板的 AWS::AutoScaling::AutoScalingGroup
资源中定义的值,即使计划操作已生效。
如果您不希望 CloudFormation 在您具有生效的计划操作时,更改任何组大小属性值,请使用 AutoScalingScheduledAction
更新策略并将 IgnoreUnmodifiedGroupSizeProperties
设置为 true
来阻止 CloudFormation 更改 MinSize
、MaxSize
或 DesiredCapacity
属性,除非您已在模板中修改这些值。
语法
JSON
"UpdatePolicy" : { "AutoScalingScheduledAction" : { "IgnoreUnmodifiedGroupSizeProperties" :
Boolean
} }
YAML
UpdatePolicy: AutoScalingScheduledAction: IgnoreUnmodifiedGroupSizeProperties:
Boolean
属性
IgnoreUnmodifiedGroupSizeProperties
-
如果为
true
,则 Amazon CloudFormation 在堆栈更新期间,忽略当前自动扩缩组和模板的AWS::AutoScaling::AutoScalingGroup
资源中描述的自动扩缩组之间的组大小属性差异。如果在模板中修改任何组大小属性值,Amazon CloudFormation 将使用修改的值并更新自动扩缩组。默认值:
false
类型:布尔值
必需:否
UseOnlineResharding 策略
要通过添加或删除分片,而不是通过替换整个 AWS::ElastiCache::ReplicationGroup 资源,来修改复制组的分片,请使用 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/
)或 DescribeReplicationGroups 检索复制组中的所有节点组的 ID。接下来,在堆栈模板中指定每个节点组的 ID,然后再尝试添加或删除分片。 注意
作为最佳实践,在堆栈模板中创建复制组时,请包括指定的每个节点组的 ID。
此外,在没有中断的情况下,更新节点数还要求为每个
NodeGroupConfiguration
准确地指定PrimaryAvailabilityZone
、ReplicaAvailabilityZones
和ReplicaCount
属性。同样,您使用 ElastiCache 控制台(https://console.aws.amazon.com/elasticache/)或 DescribeReplicationGroups 检索每个节点组的实际值,并将其与堆栈模板中的值进行比较。您可以将节点组的属性值更新作为单独的堆栈更新,或作为更改节点组数的相同堆栈更新的一部分。 如果使用
UseOnlineResharding
更新策略在没有中断的情况下,更新节点组数,ElastiCache 将在指定数量的槽之间平均分配密钥空间。以后,无法对其进行更新。因此,在以这种方式更新节点组数后,应删除从堆栈模板中为每个NodeGroupConfiguration
的Slots
属性指定的值,因为它不再反映每个节点组中的实际值。 -
实际节点组删除结果可能会有所不同。
在指定的
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::Domain 或 AWS::Elasticsearch::Domain 资源,请使用 EnableVersionUpgrade
更新策略。
如果 EnableVersionUpgrade
设置为 true
,您可以更新 AWS::OpenSearchService::Domain
资源的 EngineVersion
属性(或旧式 AWS::Elasticsearch::Domain
资源的 ElasticsearchVersion
属性),CloudFormation 将更新该属性,而不会发生中断。如果 EnableVersionUpgrade
被设置为 false
,或未指定,则更新 EngineVersion
或 ElasticsearchVersion
属性将导致 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
} }
YAML
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