Amazon EC2 Auto Scaling
用户指南

适用于 Amazon EC2 Auto Scaling 的简单扩展和分步扩展策略

借助简单和步进扩展策略,您可以为触发扩展流程的 CloudWatch 警报选择扩展指标和阈值,并定义当阈值违反指定数量的评估期时应如何扩展您的 Auto Scaling 组。

即使您只进行单次扩展调整,我们也建议您使用步进扩展策略而不是简单扩展策略。Amazon EC2 Auto Scaling 起初只支持简单扩展策略。如果您在引入目标跟踪和步进策略前创建了自己的扩展策略,您的策略将被视为简单扩展策略。有关更多信息,请参阅 简单扩展策略和冷却时间

如果您的扩展指标是一个随 Auto Scaling 组中实例数成比例增减的使用率指标,我们建议您改用目标跟踪扩展策略。有关更多信息,请参阅 适用于 Amazon EC2 Auto Scaling 的目标跟踪扩展策略。您仍然可以选择使用目标跟踪扩展与步进扩展来实现更高级的扩展策略配置。例如,如果需要,您可以在利用率达到特定级别时配置更积极的响应。

步进扩展策略

步进扩展策略根据一组扩展调整增加或减少 Auto Scaling 组的当前容量,这些调整称为步进调整。这些调整将根据警报违例规模发生变化。

扩展活动启动后,该策略继续响应其他警报,甚至在进行扩展活动或健康检查替换时也是如此。因此,Amazon EC2 Auto Scaling 会在接收警报消息时评估任何突破的警报。

如果要创建扩展策略,可以指定影响聚合指标的新启动实例就绪所需的估计预热时间。有关更多信息,请参阅 实例预热

您还可以为 Amazon EC2 以外的资源使用步进扩展。有关更多信息,请参阅 Application Auto Scaling 用户指南中的步进扩展策略

简单扩展策略和冷却时间

大多数情况下,分步扩展策略优于简单扩展策略。对于简单扩展,在启动扩展活动后,该策略必须等待扩展活动或运行状况检查替换完成并且冷却时间到期,然后才会响应其他警报。冷却时间有助于防止在先前活动产生明显影响前启动其他扩展活动。有关更多信息,请参阅适用于 Amazon EC2 Auto Scaling 的扩展冷却时间

Amazon EC2 Auto Scaling 不支持对分步扩展策略指定冷却时间。因此,对此类策略不能指定冷却时间,组的默认冷却时间也不适用。

扩展调整类型

执行步进扩展或简单扩展策略时,它将使用策略中指定的扩展调整来更改 Auto Scaling 组的当前容量。扩展调整不能将组容量更改为超出最大组大小或低于最小组大小。

对于步进扩展和简单扩展,Amazon EC2 Auto Scaling 支持以下调整类型:

  • ChangeInCapacity — 将当前组容量增加或减少指定的实例数。正值将增加容量,负调整值将减小容量。

    示例:如果当前组容量为 3 个实例,调整值为 5,则当此策略执行时,会向组中添加 5 个实例,总共达到 8 个实例。

  • ExactCapacity — 将当前组容量更改为指定的实例数。为该调整类型指定一个正值。

    示例:如果当前组容量为 3 个实例,调整值为 5,则当此策略执行时,容量将设置为 5 个实例。

  • PercentChangeInCapacity — 将当前组容量增加或减少指定的百分比。正值将增加容量,负值将减小容量。如果得出的值不是整数,将按如下所示进行取整:

    • 大于 1 的值向下取整。例如,12.7 取整为 12

    • 0 和 1 之间的值舍入到 1。例如,.67 取整为 1

    • 0 和 -1 之间的值舍入到 -1。例如,-.58 取整为 -1

    • 小于 -1 的值向上取整。例如,-6.67 取整为 -6

    示例:如果当前容量为 10 个实例,调整值为 10%,则当此策略执行时,将向组中添加 1 个实例,总共达到 11 个实例。

对于 PercentChangeInCapacity,您还可以指定要扩展的最小实例数(使用 MinAdjustmentMagnitude 参数或控制台中的添加实例时至少需添加)。例如,假定您创建一个增加 25% 的策略,并且您指定最小增量为 2 个实例。如果您有一个 Auto Scaling 组包含 4 个实例,而要执行该扩展策略,则 4 的 25% 就是 1 个实例。但是,因为您指定了最小增量 2,则将添加 2 个实例。

分步调整

创建分步扩展策略时,将添加一个或多个分步调整,让您可以根据警报的严重程度进行扩展。每个分步调整指定以下内容:

  • 指标值的下限

  • 指标值的上限

  • 要扩展的数量(基于扩展调整类型)

策略分步调整有一些规则:

  • 分步调整范围不能重叠或有间隙。

  • 只有一个分步调整可以有空下限 (负无穷)。如果一个分步调整有负下限,则必须有一个分步调整有空下限。

  • 只有一个分步调整可以有空上限 (正无穷)。如果一个分步调整有正上限,则必须有一个分步调整有空上限。

  • 同一分步调整中的上限和下限不能为空。

  • 如果指标值高于违例阈值,则含下限而不含上限。如果指标值低于违例阈值,则不含下限而含上限。

CloudWatch 根据与您的 CloudWatch 警报关联的指标的统计信息聚合指标数据点。当突破警报阈值时,将触发相应的扩展策略。Amazon EC2 Auto Scaling 将聚合类型应用于 CloudWatch 中最新的指标数据点(与原始指标数据相对)。它将此聚合指标值与步进调整定义的上限和下限进行比较,以确定执行哪个步进调整。

如果您使用 AWS 管理控制台,则以绝对值的形式指定上限和下限。如果您使用 API 或 CLI,则以违例阈值相对值的形式指定上限和下限。例如,假设您有一个警报的违例阈值为 50,扩展调整类型为 PercentChangeInCapacity。还有具有以下分步调整的扩展和缩减策略:

Scale out policy
Lower bound Upper bound Adjustment Metric value

0

10

0

50 <= < 60

10

20

10

60 <= < 70

20

null

30

70 <= < +无穷

Scale in policy

Lower bound Upper bound Adjustment Metric value

-10

0

0

40 < <= 50

-20

-10

-10

30 < <= 40

null

-20

-30

- 无穷 < <= 30

您的组的当前容量和所需容量均为 10 个实例。当聚合指标值大于 40 小于 60 时,该组维持其当前容量和所需容量。

如果指标值达到 60,根据扩展策略的第二个分步调整 (增加 10 个实例的 10%),组的所需容量将增加 1 个实例,总共达到 11 个实例。在新实例运行并且其指定预热时间过期后,当前组容量将增加到 11 个实例。如果在容量增加后指标值又增加到 70,根据扩展策略的第三个分步调整 (增加 11 个实例的 30%,即 3.3 个实例,向下取整为 3 个实例), 组的所需容量将增加另外 3 个实例,总共达到 14 个实例。

如果指标值降到 40,根据缩减策略的第二个分步调整 (删除 14 个实例的 10%,向下取整为 1 个实例),组的所需容量将减小 1 个实例,达到 13 个实例。如果在容量减小后指标值又降到 30,根据缩减策略的第三个分步调整 (删除 13 个实例的 30%,即 3.9 个实例,向下取整为 3 个实例),组的所需容量将减少另外 3 个实例,达到 10 个实例。

实例预热

通过分步扩展策略可以指定新启动实例的预热时间(秒数)。在指定预热时间过期前,实例不会计入 Auto Scaling 组的聚合指标。在扩展时,AWS 也不会将正在预热的实例看作当前组容量的一部分。因此,落入同一分步调整中的多个警报违例只会导致一个扩展活动。这可确保添加的实例不会超出您的需要。

使用上一部分中的示例,假设指标值增加到 60,而在新实例仍在预热时又增加到 62。当前容量仍为 10 个实例,因此,添加了 1 个实例(10 个实例的 10%)。不过,组的所需容量已经是 11 个实例,因此,AWS 不会进一步增加所需的容量。如果指标在新实例仍在预热时增长到 70,我们应添加 3 个实例(10 个实例的 30%)。但该组的所需容量已经是 11,所以我们只添加 2 个实例,因为新的所需容量为 13 个实例。

在缩减时,AWS 将正在终止的实例视为当前组容量的一部分。因此不会从 Auto Scaling 组中删除更多实例。

正在进行扩展活动时不能启动收缩活动。

创建带有分步扩展策略的 Auto Scaling 组(控制台)

您可以创建一个使用 CloudWatch 警报来确定 Auto Scaling 组何时应缩减或扩展的扩展策略。每个 CloudWatch 警报均监控一个指标,并在该指标超过您在策略中指定的阈值时向 Amazon EC2 Auto Scaling 发送消息。您可以使用警报来监控从您使用的 AWS 中的服务发送到 CloudWatch 的任何指标。或者,您可以创建和监控自己的指标。

创建 CloudWatch 警报后,可以指定 Amazon SNS 主题,以在警报状态改变时发送电子邮件通知。有关更多信息,请参阅创建 Amazon CloudWatch 警报

使用控制台可以创建具有两个扩展策略的 Auto Scaling 组:将组容量增加 30% 的扩展策略,以及将组容量减小到两个实例的收缩策略。

创建带有分步扩展策略的 Auto Scaling 组

  1. 打开 Amazon EC2 控制台 https://console.aws.amazon.com/ec2/

  2. 在导航窗格上的 Auto Scaling 下,选择 Auto Scaling 组

  3. 选择 Create Auto Scaling group

  4. Create Auto Scaling Group 页面上,执行以下操作之一:

    • 选择 Create an Auto Scaling group from an existing launch configuration,选择现有的启动配置,然后选择 Next Step (下一步)

    • 如果您没有想要使用的启动配置,请选择 Create a new launch configuration,然后按照指示操作。有关更多信息,请参阅创建启动配置

  5. Configure Auto Scaling group details 页面上,执行以下操作:

    1. 对于Group name (组名),键入 Auto Scaling 组的名称。

    2. 对于 Group size (组大小),键入 Auto Scaling 组所需的容量。

    3. 如果启动配置指定需要 VPC 的实例(如 T2 实例),则必须从 Network 选择一个 VPC。另外,如果您的 AWS 账户支持 EC2-Classic 并且这些实例不需要 VPC,您可以选择 Launch into EC2-Classic 或 VPC。

    4. 如果您在上一步中选择了 VPC,请从 Subnet 中选择一个或多个子网。如果您在上一步中已选择 EC2-Classic,请从 Availability Zone(s) 中选择一个或多个可用区。

    5. 选择 Next: Configure scaling policies

  6. Configure scaling policies (配置扩展策略) 页面上,执行以下操作:

    1. 选择 Use scaling policies to adjust the capacity of this group (使用扩展策略调整此组的容量)

    2. 使用以 Scale between (扩展范围) 开头的行指定 Auto Scaling 组的最小大小和最大大小。例如,如果组已经是最大大小,则需要指定一个新的最大值才能进行扩展。

      
                                        为您的组指定最小容量和最大容量。
    3. Increase Group Size 下指定扩展策略。您可以选择为该策略指定名称,然后选择 Add new alarm

    4. Create Alarm 页面上,选择 create topic。对于 Send a notification to,键入 SNS 主题的名称。对于 With these recipients,键入一个或多个用于接收通知的电子邮件地址。可以使用自定义名称替换默认警报名称。接下来,为策略指定指标和标准。例如,您可以保留 Whenever 的默认设置 (CPU 使用率平均值)。对于 Is,选择 >= 并键入 80%。对于 For at least,键入 1 个连续的 5 Minutes 时间段。选择 Create Alarm

      
                                        创建警报
    5. 对于 Take the action,选择 Add,在下一个字段中键入 30,然后选择 percent of group。默认情况下,此步骤调整的下限为警报阈值,上限为 null(正无穷)。

      要添加其他步骤调整,请选择 Add step。要设置可扩展的最少实例数,请更新 Add instances in increments of at least 1 instance(s) 中的数量字段。

      (可选)建议您采用默认值通过几个步骤创建这些扩展策略。要创建简单扩展策略,请选择 Create a simple scaling policy。有关更多信息,请参阅适用于 Amazon EC2 Auto Scaling 的简单扩展和分步扩展策略

      
                                        创建扩展策略
    6. Instances need (实例需要) 指定实例预热值,用于控制新启动的实例在多长时间后开始作用于 CloudWatch 指标。

    7. Decrease Group Size 下指定缩减策略。您可以选择为该策略指定名称,然后选择 Add new alarm

    8. Create Alarm 页面上,您可以选择为扩展策略创建的通知,也可以为缩减策略创建一个新通知。可以使用自定义名称替换默认警报名称。保留 Whenever 的默认设置(CPU 使用率平均值)。对于 Is,选择 <= 并键入 40%。对于 For at least,键入 1 个连续的 5 Minutes 时间段。选择 Create Alarm

    9. 对于 Take the action,选择 Remove,在下一个字段中键入 2,然后选择 instances。默认情况下,此步骤调整的上限为警报阈值,下限为 null(负无穷)。要添加其他步骤调整,请选择 Add step

      (可选)建议您采用默认值通过几个步骤创建这些扩展策略。要创建简单扩展策略,请选择 Create a simple scaling policy。有关更多信息,请参阅扩展策略类型

      
                                        创建扩展策略
    10. 选择 Review

    11. Review 页面上,选择 Create Auto Scaling group

  7. 使用以下步骤验证您的 Auto Scaling 组的扩展策略。

    1. Auto Scaling Group creation status 页面确认您的 Auto Scaling 组已成功创建。选择 View your Auto Scaling Groups (查看您的 Auto Scaling 组)

    2. Auto Scaling Groups 页面上,选择您刚创建的 Auto Scaling 组。

    3. Activity History (活动历史记录) 选项卡上,Status (状态) 列显示 Auto Scaling 组是否具有已成功启动的实例。

    4. Instances 选项卡上,Lifecycle 列包含实例的状态。启动实例只需很短的时间。实例启动后,其生命周期状态更改为 InService

      Health Status (运行状态) 列显示对您的实例进行 EC2 实例运行状况检查的结果。

    5. 扩展策略选项卡上,可以查看为 Auto Scaling 组创建的策略。

配置分步扩展策略 (AWS CLI)

按如下方式使用 AWS CLI 为 Auto Scaling 组配置分步扩展策略。

步骤 1:创建 Auto Scaling 组

使用以下 create-auto-scaling-group 命令,通过使用启动配置 my-launch-config 创建一个名为 my-asg 的 Auto Scaling 组。如果您没有要使用的启动配置,可以创建一个。有关更多信息,请参阅 create-launch-configuration

aws autoscaling create-auto-scaling-group --auto-scaling-group-name my-asg \ --launch-configuration-name my-launch-config \ --vpc-zone-identifier "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782" \ --max-size 5 --min-size 1

第 2 步:创建扩展策略

您可以创建分步或简单扩展策略,指示 Auto Scaling 在应用程序负载发生变化时该怎么做。

示例:my-step-scaleout-policy

使用以下 put-scaling-policy 命令创建名为 my-step-scaleout-policy 的分步扩展策略,其调整类型为 PercentChangeInCapacity、基于以下分步增加组容量(假设 CloudWatch 警报阈值为 60%):

  • 当指标值大于或等于 70% 但小于 80% 时,将实例计数增加 10%

  • 当指标值大于或等于 80% 但小于 90% 时,将实例计数增加 20%

  • 当指标值大于或等于 90% 时,将实例计数增加 30%

aws autoscaling put-scaling-policy \ --auto-scaling-group-name my-asg \ --policy-name my-step-scaleout-policy \ --policy-type StepScaling \ --adjustment-type PercentChangeInCapacity \ --metric-aggregation-type Average \ --step-adjustments MetricIntervalLowerBound=10.0,MetricIntervalUpperBound=20.0,ScalingAdjustment=10 \ MetricIntervalLowerBound=20.0,MetricIntervalUpperBound=30.0,ScalingAdjustment=20 \ MetricIntervalLowerBound=30.0,ScalingAdjustment=30 \ --min-adjustment-magnitude 1

输出包括策略的 ARN。将此 ARN 保存在安全位置。您需要使用它来创建 CloudWatch 警报。

{ "PolicyARN": "arn:aws:autoscaling:region:123456789012:scalingPolicy:4ee9e543-86b5-4121-b53b-aa4c23b5bbcc:autoScalingGroupName/my-asg:policyName/my-step-scalein-policy }

示例:my-step-scalein-policy

使用以下 put-scaling-policy 命令创建名为 my-step-scalein-policy 的分步扩展策略,其调整类型为 ChangeInCapacity、将组容量减少 2 个实例:

aws autoscaling put-scaling-policy \ --auto-scaling-group-name my-asg \ --policy-name my-step-scalein-policy \ --policy-type StepScaling \ --adjustment-type ChangeInCapacity \ --step-adjustments MetricIntervalUpperBound=0.0,ScalingAdjustment=-2

输出包括作为策略唯一名称的 ARN。随后,您可以使用 ARN 或者策略名称和组名称的组合来指定策略。将此 ARN 保存在安全位置。您需要使用它来创建 CloudWatch 警报。

{ "PolicyARN": "arn:aws:autoscaling:region:123456789012:scalingPolicy:ac542982-cbeb-4294-891c-a5a941dfa787:autoScalingGroupName/my-asg:policyName/my-step-scaleout-policy }

简单扩展策略示例

或者,您可以使用以下 CLI 命令而不是前文中的 CLI 命令创建简单扩展策略。这些命令的输出包括每个策略的 ARN,您在创建 CloudWatch 警报时需要它。请记住,使用简单扩展策略会取代冷却时间。

示例:my-simple-scaleout-policy

使用以下 put-scaling-policy 命令创建名为 my-simple-scaleout-policy 的简单扩展策略,其调整类型为 PercentChangeInCapacity、将组容量增加 30%:

aws autoscaling put-scaling-policy --policy-name my-simple-scaleout-policy \ --auto-scaling-group-name my-asg --scaling-adjustment 30 \ --adjustment-type PercentChangeInCapacity

示例:my-simple-scalein-policy

使用以下 put-scaling-policy 命令创建名为 my-simple-scalein-policy 的简单扩展策略,其调整类型为 ChangeInCapacity、将组容量减少两个实例:

aws autoscaling put-scaling-policy --policy-name my-simple-scalein-policy \ --auto-scaling-group-name my-asg --scaling-adjustment -2 \ --adjustment-type ChangeInCapacity

第 3 步:创建 CloudWatch 警报

在步骤 2 中,您已创建扩展策略,这些策略可以指示 Auto Scaling 组在指定条件发生变化时如何缩减和扩展。在此步骤中,您将通过标识要监控的指标、定义用于扩展的条件来创建警报,然后将警报与扩展策略相关联。

示例:AddCapacity

使用以下 CloudWatch put-metric-alarm 命令创建警报,基于至少两个连续评估期(两分钟)内 60% 的平均 CPU 阈值增加 Auto Scaling 组的大小。要使用您自己的自定义指标,请在 --metric-name 中指定其名称,并在 --namespace 指定其命名空间。

aws cloudwatch put-metric-alarm --alarm-name Step-Scaling-AlarmHigh-AddCapacity \ --metric-name CPUUtilization --namespace AWS/EC2 --statistic Average \ --period 120 --evaluation-periods 2 --threshold 60 \ --comparison-operator GreaterThanOrEqualToThreshold \ --dimensions "Name=AutoScalingGroupName,Value=my-asg" \ --alarm-actions PolicyARN

示例:RemoveCapacity

使用以下 CloudWatch put-metric-alarm 命令创建警报,基于至少两个连续评估期(两分钟)内 40% 的平均 CPU 阈值减小 Auto Scaling 组的大小。要使用您自己的自定义指标,请在 --metric-name 中指定其名称,并在 --namespace 指定其命名空间。

aws cloudwatch put-metric-alarm --alarm-name Step-Scaling-AlarmLow-RemoveCapacity \ --metric-name CPUUtilization --namespace AWS/EC2 --statistic Average \ --period 120 --evaluation-periods 2 --threshold 40 \ --comparison-operator LessThanOrEqualToThreshold \ --dimensions "Name=AutoScalingGroupName,Value=my-asg" \ --alarm-actions PolicyARN