这是新的《CloudFormation 模板参考指南》。请更新您的书签和链接。有关开始使用 CloudFormation 的帮助,请参阅《AWS CloudFormation 用户指南》https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html。
UpdatePolicy 属性
使用 UpdatePolicy 属性来指定 CloudFormation 在堆栈更新操作期间将如何处理特定资源的更新。
主题
概述
通过使用 UpdatePolicy 属性,您可以控制以下资源的更新方式,如下所述:
-
AWS::AppStream::Fleet:CloudFormation 可以停止和启动实例集,这会导致实例集中的实例被替换。这样,所有实例都将在堆栈更新后立即应用最新的更改。
-
AWS::AutoScaling::AutoScalingGroup –借助自动扩缩组,您可以使用一个或多个更新策略来控制 CloudFormation 处理特定更新的方式。这些策略包括:
-
AutoScalingReplacingUpdate和AutoScalingRollingUpdate策略 – CloudFormation 可以使用AutoScalingReplacingUpdate策略来替换自动扩缩组及其实例,也可以使用AutoScalingRollingUpdate策略仅替换实例。这些替换操作将在您执行下列一项或多项更改时发生:-
更改自动扩缩组的 AWS::AutoScaling::LaunchConfiguration。
-
更改自动扩缩组的
VPCZoneIdentifier属性。 -
更改自动扩缩组的
LaunchTemplate属性。 -
更改自动扩缩组的
PlacementGroup属性。 -
更新包含与当前
LaunchConfiguration不匹配的实例的自动扩缩组。
如果同时指定
AutoScalingReplacingUpdate和AutoScalingRollingUpdate策略,则将WillReplace属性设置为true将使AutoScalingReplacingUpdate优先。 -
-
AutoScalingInstanceRefresh策略 - 当您更改自动扩缩组组的某些属性时,CloudFormation 会触发自动扩缩实例刷新。与AutoScalingRollingUpdate相比,该策略支持实例维护策略(包括“先启动后终止”)、终止策略、横向缩减保护、根卷替换以及其他 Amazon EC2 Auto Scaling 功能。您不能在同一个自动扩缩组中同时指定AutoScalingInstanceRefresh和AutoScalingRollingUpdate。有关更多信息,请参阅AutoScalingInstanceRefresh 策略。 -
AutoScalingScheduledAction策略 – 更新包含具有计划操作的自动扩缩组的堆栈时将应用此策略,这些计划操作会在特定时间扩缩该组。除非已在堆栈模板中显式更改,否则 CloudFormation 无法修改该组的最小大小、最大大小或所需容量。此策略有助于防止任何可能干扰计划扩缩活动的意外更新。
-
-
AWS::ElastiCache::ReplicationGroup – CloudFormation 可以通过增加或移除分片来修改副本组的分片,而不是替换整个资源。
-
AWS::OpenSearchService::Domain 和 AWS::Elasticsearch::Domain(旧版)– CloudFormation 可以将 OpenSearch Service 域升级到新版本的 OpenSearch 或 Elasticsearch,而无需替换整个资源。
-
AWS::Lambda::Alias – CloudFormation 可以在别名发生版本更改时执行 CodeDeploy 部署。
以下章节描述了每种资源类型所支持的 UpdatePolicy 属性的语法和特性。
WorkSpaces 应用程序更新策略
要在更新之前停止 WorkSpaces 应用程序实例集并在更新后将其重启,请使用 WorkSpaces 应用程序更新策略。
语法
JSON
{ "UpdatePolicy": { "StopBeforeUpdate": { "Type": "Boolean" }, "StartAfterUpdate": { "Type": "Boolean" } } }
YAML
UpdatePolicy: StopBeforeUpdate: Type:BooleanStartAfterUpdate: Type:Boolean
StopBeforeUpdate-
更新前停止指定的实例集。
必需:否
StartAfterUpdate-
更新后启动指定的实例集。
必需:否
AutoScalingReplacingUpdate 策略
要替换自动扩缩组及其包含的实例,请使用 AutoScalingReplacingUpdate 策略。
在尝试更新之前,请确保您具有足够的 Amazon EC2 容量来容纳旧的和新的自动扩缩组。
语法
JSON
"UpdatePolicy" : { "AutoScalingReplacingUpdate" : { "WillReplace" :Boolean} }
YAML
UpdatePolicy: AutoScalingReplacingUpdate: WillReplace:Boolean
属性
WillReplace-
指定在更新期间是否替换自动扩缩组及其包含的实例。在替换期间,CloudFormation 将保留旧组,直至完成创建新组。如果更新失败,CloudFormation 可以回滚到旧的自动扩缩组,并删除新的自动扩缩组。
当 CloudFormation 创建新组时,不会分离或附加任何实例。在成功创建新的自动扩缩组后,CloudFormation 在清除过程中,删除旧的自动扩缩组。
在设置
WillReplace参数时,请记住指定匹配的 CreationPolicy 属性。如果在Timeout期间(在CreationPolicy属性中指定)发出成功信号的实例未达到最小实例数(由MinSuccessfulInstancesPercent属性指定),替换更新将失败,并且 CloudFormation 回滚到旧的自动扩缩组。类型:布尔值
必需:否
AutoScalingRollingUpdate 策略
要对自动扩缩组中的实例执行滚动更新,而不是等待扩缩活动逐渐用较新的实例替换旧实例,请使用 AutoScalingRollingUpdate 策略。此策略让您可以灵活指定 CloudFormation 是分批替换自动扩缩组中的实例,还是一次性全部替换自动扩缩组中的实例,但不替换整个资源。
使用 AutoScalingRollingUpdate 策略时的注意事项:
警告
滚动更新不会遵循您在自动扩缩组上配置的实例维护策略。在滚动更新期间,正常运行的容量可能会低于该组设置的 MinHealthyPercentage,且无论 MaxHealthyPercentage 如何,CloudFormation 都不会在终止现有实例之前启动新实例。若要在堆栈更新期间保留实例维护策略,请改用 AutoScalingInstanceRefresh 策略。
-
回滚更新时,CloudFormation 会使用在当前堆栈更新之前在模板中指定的
UpdatePolicy配置。例如,假设您在UpdatePolicy中将MaxBatchSize从 1 更改为 10 并执行堆栈更新,但更新失败了。CloudFormation 在回滚时将以 1 为最大批次大小,而不是 10。要避免这种情况,请首先通过单独的更新更改UpdatePolicy,然后再进行任何可能启动滚动更新的自动扩缩组更新。 -
CloudFormation 建议指定
SuspendProcesses属性来临时暂停可能会干扰滚动更新并导致更新失败的 Amazon EC2 Auto Scaling 进程。有关更多信息,请参阅如何在更新 CloudFormation 堆栈时更新我的自动扩缩组?此外,
AutoScalingInstanceRefresh策略在堆栈更新期间支持所有自动扩缩组进程,因此您无需暂停这些进程。如果您需要保持运行状况检查和可用区重新平衡等进程处于活动状态,请改用AutoScalingInstanceRefresh。有关更多信息,请参阅AutoScalingInstanceRefresh 策略。 -
CloudFormation 支持在启动或终止实例时使用 Amazon EC2 Auto Scaling 生命周期挂钩。这样,在实例进入下一个状态之前,您将有时间在实例上执行自定义操作。要确保新实例达到
InService状态,请在自定义操作完成后完成生命周期挂钩并确保返回了CONTINUE结果。默认情况下,如果未收到任何响应并且生命周期挂钩超时,实例启动将被视为失败并被放弃。如果没有实例达到InService状态,则滚动更新最终将会失败。 -
Amazon EC2 Auto Scaling 的其他功能(例如,终止策略和横向缩减保护)无法与 CloudFormation 滚动更新一起使用。如果您需要这些功能中的任何一项,请改用
AutoScalingInstanceRefresh。有关更多信息,请参阅 AutoScalingInstanceRefresh 策略。 -
如果您使用
AutoScalingRollingUpdate策略并移除置放群组设置,则该置放群组将从自动扩缩组和 CloudFormation 模板中移除。此外,这还会触发滚动更新,因此新实例不会启动到置放群组中。
语法
JSON
"UpdatePolicy" : { "AutoScalingRollingUpdate" : { "MaxBatchSize" :Integer, "MinActiveInstancesPercent" :Integer, "MinInstancesInService" :Integer, "MinSuccessfulInstancesPercent" :Integer, "PauseTime" :String, "SuspendProcesses" : [List of processes], "WaitOnResourceSignals" :Boolean} }
YAML
UpdatePolicy: AutoScalingRollingUpdate: MaxBatchSize:IntegerMinActiveInstancesPercent:IntegerMinInstancesInService:IntegerMinSuccessfulInstancesPercent:IntegerPauseTime:StringSuspendProcesses: -List of processesWaitOnResourceSignals:Boolean
属性
MaxBatchSize-
指定可以同时替换的最大实例数量。
默认值:
1最大值:
100类型:整数
必需:否
MinActiveInstancesPercent-
指定要确保更新成功,自动扩缩组中必须处于
InService状态的实例相对于滚动更新期间该组所需容量的百分比。可以指定从 0 到 100 的值。CloudFormation 取整到最接近的十分位值。例如,如果您更新五个实例,最小InService百分比为 50,则至少有三个实例必须处于InService状态。如果实例未在 1 小时的固定时间内转换为InService状态,則 CloudFormation 会假定该实例未更新。在
UpdatePolicy中设置MinActiveInstancesPercent还会影响在AWS::AutoScaling::AutoScalingGroup资源中的DesiredCapacity属性高于该自动扩缩组当前所需容量时启动的实例。默认值:
100类型:整数
必需:否
MinInstancesInService-
指定当 Auto Scaling 更新旧实例时,CloudFormation 组中必须处于服务状态的实例的最小数目。该值必须小于自动扩缩组的 MaxSize。
警告
我们建议您将
MinInstancesInService属性的值至少设置为自动扩缩组的 MinSize。这样,在滚动更新期间,可以避免由于没有实例为客户流量提供服务而导致的潜在可用性问题。默认值:
0类型:整数
必需:否
MinSuccessfulInstancesPercent-
指定 Auto Scaling 回滚更新中必须有多少实例 (百分比) 发送成功信号,才认为更新成功。可以指定从 0 到 100 的值。CloudFormation 取整到最接近的十分位值。例如,如果您更新五个实例,最小成功百分比为
50,则必须有三个实例发送成功信号才行。如果实例未在PauseTime属性中指定的时间内发出信号,则 CloudFormation 会假定实例未更新。建议您将
MinSuccessfulInstancesPercent属性的值设置为大于 0 的值。将MinSuccessfulInstancesPercent属性将设定为 0 时,CloudFormation 会等待 0% 的容量实例进入InService状态。MinSuccessfulInstancesPercent在将自动扩缩组的状态视为UPDATE_COMPLETE之前立即返回,以继续进入堆栈模板中定义的后续资源。如果在 CloudFormation 模板中定义了其他自动扩缩组,则它们将同时更新。当所有自动扩缩组在 0% 的容量实例处于InService状态时同时部署时,您将遇到可用性问题,因为有 0 个实例提供客户流量。默认值:
100类型:整数
必需:否
PauseTime-
在对一批实例进行更改以便为这些实例提供启动软件应用程序的时间后,CloudFormation 暂停的时间量。
使用 ISO8601 持续时间格式
(在 PT格式中,每个#H#M#S#分别表示小时数、分钟数和秒数)指定PauseTime。最大PauseTime为 1 小时 (PT1H)。警告
如果将
WaitOnResourceSignals设置为true,则PauseTime会充当超时值。该参数决定了对于在滚动更新期间从被替换的实例以及通过增加AWS::AutoScaling::AutoScalingGroup资源的 DesiredCapacity 属性而添加的新实例,CloudFormation 为了从这些实例收到所需数量的有效信号而需要等待的最长时间。如果在 Cloudformation 收到所需数量的信号之前超过了PauseTime,则更新将会失败。要获得最佳结果,请指定一个可确保应用程序有足够启动时间的时间段。如果更新需要回滚,则较短的PauseTime会导致回滚失败。默认值:
PT5M(5 分钟),此时WaitOnResourceSignals属性设置为true。否则,不会设置任何默认值。类型:字符串
必需:否
SuspendProcesses-
指定堆栈更新期间要暂停的 Auto Scaling 流程。暂停处理可防止 Auto Scaling 干扰堆栈更新。例如,您可以暂停警报,以便 Amazon EC2 Auto Scaling 不执行与警报关联的扩展策略。有关有效值,请参阅《Amazon EC2 Auto Scaling 用户指南》中的 Types of processes。
默认值:未指定
类型:Auto Scaling 流程列表
必需:否
WaitOnResourceSignals-
指定在继续更新之前,CloudFormation 是否等待来自新实例的成功信号。CloudFormation 在指定的
PauseTime持续时间内等待成功信号。要将信号发送到自动扩缩组,请使用 cfn-signal 帮助程序脚本。对于与弹性负载均衡关联的自动扩缩组,可以考虑使用 cfn-init 帮助程序脚本添加运行状况检查,以确保在实例运行状况良好后再发出成功信号。有关示例,请参阅 GitHub 存储库
中 Amazon EC2 Auto Scaling 滚动更新示例模板中的 verify_instance_health命令。默认值:
false类型:布尔值
必填:条件性。如果指定
MinSuccessfulInstancesPercent属性,则必须将WaitOnResourceSignals属性设为true。
AutoScalingInstanceRefresh 策略
若要通过执行自动扩缩实例刷新来更新自动扩缩组中的实例,请使用 AutoScalingInstanceRefresh 策略。有关实例刷新功能的完整列表,请参阅《Amazon EC2 Auto Scaling 用户指南》中的使用实例刷新来更新自动扩缩组中的实例。
只有当您更新 AWS::AutoScaling::AutoScalingGroup 资源的以下属性之一时,CloudFormation 才会执行实例刷新:
LaunchTemplateMixedInstancesPolicyVPCZoneIdentifierAvailabilityZonesAvailabilityZoneIdsPlacementGroup
在使用 AutoScalingInstanceRefresh 策略时,请注意以下几点:
-
您不能在同一个自动扩缩组中同时指定
AutoScalingInstanceRefresh和AutoScalingRollingUpdate策略。如果您这样操作,则堆栈更新将失败。 -
CloudFormation 堆栈回滚是
AutoScalingInstanceRefresh的回滚机制。如果实例刷新失败,CloudFormation 会回滚堆栈,并启动新的实例刷新操作,以将该组恢复到之前的配置。对于 CloudFormation 已启动的实例刷新,您无法使用自动扩缩 APIRollbackInstanceRefresh操作。要恢复刷新,请使用CancelInstanceRefreshAPI 或回滚堆栈更新。 -
自动扩缩组一次只能运行一个实例刷新操作。如果在您使用
AutoScalingInstanceRefresh策略启动堆栈更新时,用户发起的实例刷新正在进行中,则堆栈更新可能会失败。 -
当您将实例刷新设置为从
Strategy到ReplaceRootVolume时,仅允许在启动模板或混合实例策略中对ImageId进行更改。其他属性更改可能会导致堆栈更新失败。有关更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的在实例刷新期间替换根卷。 -
堆栈更新的每个方向(向前更新和回滚)均受 CloudFormation 资源 36 小时超时限制的约束。
-
长时间运行的实例刷新可能会超过 CloudFormation 用于调用自动扩缩功能所使用的临时凭证的有效期。为避免这种情况,请在堆栈上配置服务角色。有关更多信息,请参阅 CloudFormation 服务角色。
注意
实例刷新不支持 cfn-signal 帮助程序脚本。有关如何在实例刷新期间验证实例就绪情况的信息,请参阅 在实例刷新期间验证实例就绪状态。
语法
JSON
"UpdatePolicy" : { "AutoScalingInstanceRefresh" : { "Strategy" :String, "Preferences" : { "AlarmSpecification" : { "Alarms" : [List of alarm names] }, "BakeTime" :Integer, "CheckpointDelay" :Integer, "CheckpointPercentages" : [List of integers], "InstanceWarmup" :Integer, "MaxHealthyPercentage" :Integer, "MinHealthyPercentage" :Integer, "ScaleInProtectedInstances" :String, "SkipMatching" :Boolean, "StandbyInstances" :String} } }
YAML
UpdatePolicy: AutoScalingInstanceRefresh: Strategy:StringPreferences: AlarmSpecification: Alarms: -List of alarm namesBakeTime:IntegerCheckpointDelay:IntegerCheckpointPercentages: -List of integersInstanceWarmup:IntegerMaxHealthyPercentage:IntegerMinHealthyPercentage:IntegerScaleInProtectedInstances:StringSkipMatching:BooleanStandbyInstances:String
属性
Strategy-
用于实例刷新的策略。有效值为
Rolling和ReplaceRootVolume。有关ReplaceRootVolume策略的更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的在实例刷新期间替换根卷。类型:字符串
是否必需:是
Preferences-
设置实例刷新的首选项。包括实例预热时间、正常运行百分比的最小值和最大值,以及当实例处于“
Standby”状态或被保护免受横向缩减影响时,Amazon EC2 Auto Scaling 所采用的行为。您还可以启用其他功能:检查点
CloudWatch alarms(CloudWatch 警报)
跳过匹配
烘焙时间
类型:Preferences
必需:否
Preferences(首选项)
AlarmSpecification-
云监视警报规范。您可以使用 CloudWatch 警报来识别实例刷新过程中的任何问题,并在警报阈值被触发时回滚堆栈。有关更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的启动带自动回滚的实例刷新。
必需:否
BakeTime-
在实例刷新结束时,需要等待的时间(以秒为单位),之后该实例刷新才被视为完成。
默认值:
0最小值:
0最大值:
172800类型:整数
必需:否
CheckpointDelay-
在到达检查点之后与继续操作之前需要等待的时间量(以秒为单位)。如果为
CheckpointPercentages指定了值但未为CheckpointDelay指定值,则CheckpointDelay默认值为3600(1 小时)。最小值:
0最大值:
172800类型:整数
必需:否
CheckpointPercentages-
各检查点的阈值按升序排列。每个数值必须唯一。要替换自动扩缩组中的所有实例,数组中的最后一个数字必须为
100。有关使用示例,请参阅《Amazon EC2 Auto Scaling 用户指南》中的将检查点添加到实例刷新。类型:整数值列表
必需:否
InstanceWarmup-
一段时间(以秒为单位),在此期间,在新实例进入
InService状态后,实例刷新在继续替换下一个实例之前等待。如果您未指定
InstanceWarmup,自动扩缩功能将改用DefaultInstanceWarmup属性的值。我们建议您在所有用例中为DefaultInstanceWarmup设置一个值。如果您未为任一属性指定值,自动扩缩功能将使用
HealthCheckGracePeriod属性的值。类型:整数
必需:否
MaxHealthyPercentage-
指定在替换实例时,为支持您的工作负载,该组中处于运行状态且状态为“正常”或“待处理”的实例所占的最大百分比。该值以自动扩缩组目标容量的百分比形式表示。如果指定了
MaxHealthyPercentage,则必须同时指定MinHealthyPercentage,且两者之间的差值不得大于 100。范围越大,可以同时替换的实例的数量就会增加。默认:如果已定义,则为在自动扩缩组实例维护策略中设置的值。否则,当
Strategy为Rolling时为110,当Strategy为ReplaceRootVolume时为100。最小值:
100最大值:
200类型:整数
必需:否
MinHealthyPercentage-
指定该组中必须保持运行、运行正常且随时可用的实例的最小百分比,以支持您的工作负载并确保操作能够继续进行。该值以自动扩缩组目标容量的百分比形式表示。
默认:如果已定义,则为在自动扩缩组实例维护策略中设置的值。否则,当
Strategy为Rolling时为100,当Strategy为ReplaceRootVolume时为90。最小值:
0最大值:
100类型:整数
必需:否
ScaleInProtectedInstances-
选择您希望 Amazon EC2 Auto Scaling 在找到受保护而无法横向缩减的实例时使用的行为。下面列出了有效值:
-
刷新:Amazon EC2 Auto Scaling 会替换免受横向缩减影响的实例。
-
忽略:Amazon EC2 Auto Scaling 会免受横向缩减影响的实例,并继续替换受横向缩减影响的实例。
-
等待:Amazon EC2 Auto Scaling 会等待一小时,以便您移除横向缩减保护。否则,实例刷新将失败。
默认值:
Wait类型:字符串
必需:否
-
SkipMatching-
指示是否已启用“跳过匹配”。如果已启用 (
true),那么自动扩缩功能将跳过替换那些已经符合您堆栈模板中指定配置的实例。有关更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的使用带“跳过匹配”的实例刷新。默认值:
true类型:布尔值
必需:否
StandbyInstances-
选择您希望 Amazon EC2 Auto Scaling 在找到处于
Standby状态的实例时使用的行为。下面列出了有效值:-
终止:Amazon EC2 Auto Scaling 会终止处于
Standby状态的实例。 -
忽略:Amazon EC2 Auto Scaling 会忽略处于
Standby状态的实例,并继续替换处于InService状态的实例。 -
等待:Amazon EC2 Auto Scaling 会等待一小时,以便您将实例恢复到运行状态。否则,实例刷新将失败。
默认值:
Wait类型:字符串
必需:否
-
类型:AlarmSpecification
Alarms-
用于监控该实例刷新的一个或多个 CloudWatch 警报的名称。您最多可以指定 10 个警报。
类型:字符串列表
必需:否
在实例刷新期间验证实例就绪状态
默认情况下,当新启动的实例通过您在自动扩缩组中配置的运行状况检查后,实例刷新会自动进入下一组实例。这些包括 Amazon EC2 运行状况检查,以及(如果已配置)Elastic Load Balancing 运行状况检查。有关更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的自动扩缩组中实例的运行状况检查。
如果您的实例在进入 InService 之前需要进行应用程序引导,请向自动扩缩组添加一个 autoscaling:EC2_INSTANCE_LAUNCHING 生命周期挂钩。实例刷新会等待生命周期挂钩完成,然后再进入下一组实例。通过调用 CompleteLifecycleAction API 来完成挂钩。您可以使用启动模板的用户数据脚本从实例本身进行此调用,也可以从外部服务进行调用。有关更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的Amazon EC2 Auto Scaling 生命周期挂钩和在自动扩缩组中完成生命周期操作。
AutoScalingScheduledAction 策略
要指定在 AWS::AutoScaling::AutoScalingGroup 资源具有关联的计划操作时 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,则 CloudFormation 在堆栈更新期间,忽略当前自动扩缩组与模板的AWS::AutoScaling::AutoScalingGroup资源中所述自动扩缩组之间的组大小属性差异。如果修改了模板中的任何组大小属性值,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 更新策略没有任何属性。
有关更多信息,请参阅《Amazon OpenSearch Service Developer Guide》中的 Upgrading OpenSearch Service domains。
语法
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} }
YAML
UpdatePolicy: CodeDeployLambdaAliasUpdate: AfterAllowTrafficHook:StringApplicationName:StringBeforeAllowTrafficHook:StringDeploymentGroupName:String
属性
AfterAllowTrafficHook-
要在流量路由完成后运行的 Lambda 函数的名称。
必需:否
类型:字符串
ApplicationName-
CodeDeploy 应用程序的名称。
是否必需:是
类型:字符串
BeforeAllowTrafficHook-
要在流量路由开始前运行的 Lambda 函数的名称。
必需:否
类型:字符串
DeploymentGroupName-
CodeDeploy 部署组的名称。这是设置流量转移策略的位置。
是否必需:是
类型:字符串
有关为 AWS::Lambda::Alias 资源指定 UpdatePolicy 属性的示例,请参阅 Lambda 别名更新策略。
示例
以下示例说明如何将更新策略添加到自动扩缩组,以及如何在更新元数据时维护可用性。
将 UpdatePolicy 添加到自动扩缩组中
以下示例说明如何添加更新策略。更新期间,自动扩缩组将更新两批实例并至少保留一个实例可用。由于设置了 WaitOnResourceSignals 标记,自动扩缩组将等待添加到组中的新实例发送信号。新实例必须在其更新下一批实例之前,向自动扩缩组发送信号。
JSON
"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
ASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: -subnetIdAz1-subnetIdAz2-subnetIdAz3LaunchTemplate: LaunchTemplateId: !ReflogicalNameVersion: !GetAttlogicalName.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 策略
以下示例声明在更新期间强制替换关联的自动扩缩组的策略。要使更新成功,必须有一定百分比的实例 (由 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'
AutoScalingInstanceRefresh 策略
以下示例展示了 AutoScalingInstanceRefresh 策略的两种常见配置。第一个示例使用“先启动后终止”机制,以便在刷新期间保持容量。第二个示例使用 CloudWatch 警报,如果部署出现问题,则回滚堆栈。
“先启动后终止”刷新
以下示例说明了一项使用“先启动后终止”机制的 AutoScalingInstanceRefresh 策略。将 MinHealthyPercentage 设置为 100,可确保新实例在现有实例终止之前启动,而 200 的 MaxHealthyPercentage 则让该组的大小可以暂时翻倍。该策略还会跳过已经符合配置的实例。
JSON
"ASG" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ], "LaunchTemplate" : { "LaunchTemplateId" : { "Ref" : "logicalName" }, "Version" : { "Fn::GetAtt" : [ "logicalName", "LatestVersionNumber" ] } }, "MaxSize" : "4", "MinSize" : "1" }, "UpdatePolicy" : { "AutoScalingInstanceRefresh" : { "Strategy" : "Rolling", "Preferences" : { "MinHealthyPercentage" : 100, "MaxHealthyPercentage" : 200, "SkipMatching" : true } } } }
YAML
ASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: -subnetIdAz1-subnetIdAz2-subnetIdAz3LaunchTemplate: LaunchTemplateId: !ReflogicalNameVersion: !GetAttlogicalName.LatestVersionNumber MaxSize: '4' MinSize: '1' UpdatePolicy: AutoScalingInstanceRefresh: Strategy: Rolling Preferences: MinHealthyPercentage: 100 MaxHealthyPercentage: 200 SkipMatching: true
使用基于警报的回滚进行刷新
以下示例说明了一项包含检查点、基于警报的回滚和烘焙时间的 AutoScalingInstanceRefresh 策略。自动扩缩会在每个检查点都会暂停 5 分钟,并在完成后等待 10 分钟,才会判定操作为成功。
JSON
"ASG" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "VPCZoneIdentifier" : [ "subnetIdAz1", "subnetIdAz2", "subnetIdAz3" ], "LaunchTemplate" : { "LaunchTemplateId" : { "Ref" : "logicalName" }, "Version" : { "Fn::GetAtt" : [ "logicalName", "LatestVersionNumber" ] } }, "MaxSize" : "4", "MinSize" : "1" }, "UpdatePolicy" : { "AutoScalingInstanceRefresh" : { "Strategy" : "Rolling", "Preferences" : { "CheckpointPercentages" : [ 33, 66, 100 ], "CheckpointDelay" : 300, "BakeTime" : 600, "AlarmSpecification" : { "Alarms" : [ "my-cloud-watch-alarm" ] } } } } }
YAML
ASG: Type: AWS::AutoScaling::AutoScalingGroup Properties: VPCZoneIdentifier: -subnetIdAz1-subnetIdAz2-subnetIdAz3LaunchTemplate: LaunchTemplateId: !ReflogicalNameVersion: !GetAttlogicalName.LatestVersionNumber MaxSize: '4' MinSize: '1' UpdatePolicy: AutoScalingInstanceRefresh: Strategy: Rolling Preferences: CheckpointPercentages: - 33 - 66 - 100 CheckpointDelay: 300 BakeTime: 600 AlarmSpecification: Alarms: -my-cloud-watch-alarm
在更新 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