Amazon EC2 Auto Scaling
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Auto Scaling 组具有多个实例类型和购买选项

您可以启动并自动扩展单个 Auto Scaling 组中的一组按需实例和 Spot 实例。除接收折扣以使用 Spot 实例外,如果您指定存在与其匹配的预留实例的实例类型,则常规按需实例定价的折扣费率同样适用。按需实例与预留实例之间唯一的差异是您必须提前购买预留实例。以上所有因素的综合作用是帮助您进一步节约 Amazon EC2 实例成本,同时确保为您的应用程序获得所需的规模和性能。

首先在一个启动模板中指定常用配置参数,并在创建 Auto Scaling 组时选择该模板。当您配置 Auto Scaling 组时,您可以:

  • 指定要启动的按需容量和 Spot 容量

  • 选择一个或多个要使用的实例类型(可以选择性地覆盖启动模板指定的默认实例类型)

  • 定义在每个购买选项中,Amazon EC2 Auto Scaling 应如何在实例类型之间分配您的容量

通过跨多个可用区中运行的多个实例类型部署应用程序以提高可用性。您可以只使用一个实例类型,但最佳实践是使用几个实例类型以避免从容量不足的实例池中启动实例。如果一个 Spot 实例池无法满足 Auto Scaling 组的 Spot 实例请求,它将继续尝试其他 Spot 实例池而不是启动按需实例,使您可以利用 Spot 实例节约成本。

分配策略

以下分配策略决定 Auto Scaling 组如何根据可用的实例类型满足按需实例和 Spot 容量。

在每种情况下,Amazon EC2 Auto Scaling 首先尝试确保实例在您指定的可用区之间均匀平衡。然后,它根据指定的分配策略启动实例类型。

按需实例

按需实例的分配策略是 prioritized。Amazon EC2 Auto Scaling 使用启动模板覆盖列表中的实例类型顺序,确定在满足按需容量时应首先使用哪一实例类型。

例如,您按以下顺序指定三个启动模板覆盖:c5.largec4.largec3.large。在启动您的按需实例时,Auto Scaling 组满足按需容量的顺序是从 c5.large 开始,然后是 c4.large,再然后是 c3.large。如果存在未使用的 c4.large 预留实例,您可以设置实例类型的优先级,通过指定 c4.large 作为最高优先级的实例类型来使您的预留实例具有最高优先级。当 c4.large 实例启动时,您可享受预留实例定价。

Spot 实例

Amazon EC2 Auto Scaling 提供了两种类型的分配策略可用于 Spot 实例:

capacity-optimized

Amazon EC2 Auto Scaling 可以从 Spot 实例池中分配实例,并为启动的实例数量提供最佳容量。通过这种方式部署可帮助您最高效地使用剩余 EC2 容量。

使用 Spot 实例,定价会根据长期供需趋势缓慢发生变化,但容量会实时波动。该 capacity-optimized 策略通过查看实时容量数据并预测可用性最高的池,自动在可用性最高的池中启动 Spot 实例。这适用于与中断相关的重启工作和检查点成本较高的工作负载,例如大数据和分析、图像和媒体渲染、机器学习以及高性能计算。通过实现更低的中断可能性,capacity-optimized 策略可以降低您工作负载的整体成本。

lowest-price

Amazon EC2 Auto Scaling 从您指定数量 (N) 的 Spot 实例池以及在满足需求时单价最低的池中分配您的实例。

例如,如果您指定 4 个实例类型和 4 个可用区,您的 Auto Scaling 组有可能利用多达 16 个不同的 Spot 实例池。如果您为分配策略指定 2 个 Spot 池(N = 2),您的 Auto Scaling 组最少可以使用 8 个不同池中单价最低的 Spot 池来满足 Spot 容量。

首先,我们建议您选择 capacity-optimized 分配策略并指定适合您的应用程序的若干种实例类型。此外,您可以为 Amazon EC2 Auto Scaling 定义一系列可用区,以便在启动实例时从中选择。

(可选)您可以指定您的 Spot 实例的最高价。如果未指定最高价,则默认最高价为按需价格,不过您仍可以获得 Spot 实例提供的大幅折扣。这些折扣得以实现是得益于使用新的 Spot 定价模型带来了稳定的 Spot 定价。

有关 Spot 实例的分配策略的更多信息,请参阅 AWS 博客中的针对 Amazon EC2 Spot 实例的容量优化分配策略简介

控制按需实例的比例

您可以完全控制 Auto Scaling 组中作为按需实例启动的实例所占比例。为确保您始终拥有实例容量,您可以指定组中作为按需实例启动的百分比,也可以选择指定初始的按需实例基数。如果您选择指定按需实例容量基本容量,当 Auto Scaling 扩展时,会确保首先启动按需实例的该基本容量。超出基本容量的任何内容都使用按需百分比来确定要启动多少按需实例和 Spot 实例。您可以指定 0 到 100 之间的任意数字来作为按需百分比。

在 Auto Scaling 组大小增加时,该组的行为如下所示:

示例:扩展行为

实例分配 各购买选项的运行实例总数
10 20 30 40
示例 1
按需基准:10 10 10 10 10
超过基准的按需百分比:50% 0 5 10 15
Spot 百分比:50% 0 5 10 15
示例 2
按需基准:0 0 0 0 0
超过基准的按需百分比:0% 0 0 0 0
Spot 百分比:100% 10 20 30 40
示例 3
按需基准:0 0 0 0 0
超过基准的按需百分比:60% 6 12 18 24
Spot 百分比:40% 4 8 12 16
示例 4
按需基准:0 0 0 0 0
超过基准的按需百分比:100% 10 20 30 40
Spot 百分比:0% 0 0 0 0
示例 5
按需基准:12 10 12 12 12
超过基准的按需百分比:0% 0 0 0 0
Spot 百分比:100% 0 8 18 28

Spot 实例的最佳实践

创建 Auto Scaling 组以请求 Spot 实例之前,请查看 Spot 最佳实践。使用这些最佳实践规划您的请求,以便以可能的最低价格预置需要的实例类型。还建议执行以下操作:

  • 使用默认最高价 (这是按需价格)。您只需为您启动的 Spot 实例支付 Spot 价格。如果 Spot 价格在最高价范围内,则是否满足您的请求取决于可用性。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南中的定价和节约成本

  • 创建包括多种实例类型的 Auto Scaling 组。由于可用区内每个实例类型的价格分开波动,因此,如果您灵活使用实例类型,则通常可以在价格不变的情况下获得更多计算容量。

  • 同样,不要局限为仅选择最受欢迎的实例类型。由于价格是根据长期需求进行调整的,常见实例类型(如最近启动的实例系列)的价格调整频率往往更高。选择不太热门的较旧实例类型往往能降低成本和减少中断。

  • 如果您选择 lowest-price 分配策略并运行 Web 服务,则需要指定较大的 Spot 池数量(例如 N=10),以减少其中一个可用区中的池暂时不可用时产生的 Spot 实例中断影响。如果您运行批处理或其他非关键任务应用程序,可以指定较小 Spot 池数量,例如,N = 2。这有助于确保您通过每个可用区中价格最低的 Spot 池提供 Spot 实例。

  • 使用 Spot 实例中断通知监控您的 Spot 实例的状态。例如,您可以在 Amazon CloudWatch Events 中设置一个规则,自动将 EC2 Spot 两分钟警告发送到 Amazon SNS 主题、AWS Lambda 函数或其他目标。有关更多信息,请参阅适用于 Linux 实例的 Amazon EC2 用户指南Amazon CloudWatch Events 用户指南 中的 Spot 实例中断通知

先决条件

您的启动模板配置为使用 Auto Scaling 组。有关信息,请参阅 为 Auto Scaling 组创建启动模板

IAM 用户仅在具有调用 ec2:RunInstances 操作的权限时,才能使用启动模板创建 Auto Scaling 组。有关配置用户权限的信息,请参阅 控制对您 Amazon EC2 Auto Scaling 资源的访问权

使用多个购买选项创建 Auto Scaling 组

请按照以下步骤创建您可以扩展的按需实例和 Spot 实例队组。您可以使用 Instances Distribution (实例分布) 中的默认设置快速创建队组。否则,您可以修改任意默认设置。您对组扩展拥有完全控制权。您可以将所需容量设置为特定的实例数量,或者您可以利用自动扩展以根据实际需求调整容量。

使用多个购买选项创建 Auto Scaling 组(控制台)

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在屏幕顶部的导航栏中,选择在创建启动模板时使用的同一 AWS 区域。

  3. 在导航窗格中,选择 Auto Scaling Groups

  4. 选择 Create Auto Scaling group (创建 Auto Scaling 组)

  5. 选择启动模板,选择您的启动模板,然后选择下一步

  6. 配置 Auto Scaling 组详细信息页上,为组名输入 Auto Scaling 组的名称。

  7. 对于 Launch template version (启动模板版本),选择 Auto Scaling 组在扩展时使用启动模板的默认版本、最新版本还是特定版本。

  8. Fleet Composition (队组组合) 选择 Combine purchase options and instances (组合购买选项和实例),以使用按需和 Spot 购买选项跨多个实例类型启动实例。

  9. 对于实例类型,选择可以启动的实例类型。默认情况下,选定启动模板指定单个实例类型,但是如果您要指定其他实例类型,则可以更改。当选择多个实例类型时,您添加实例类型时的顺序设定了它们对于按需实例的优先级。当 Auto Scaling 组启动按需容量时,位于列表顶部的实例类型优先级最高。

  10. 对于 Instances Distribution (实例分布),选择是要保留还是编辑默认设置。清除 Use the default settings to get started quickly (使用默认设置以快速入门),即可编辑默认设置。

  11. 如果您选择编辑默认设置,请提供以下信息。

    • 对于最高 Spot 价格,选择使用默认设置以将最高 Spot 价格限定为按需价格。或者选择 Set your maximum price (设置最高价) 并输入值,以指定您愿意为 Spot 实例支付的、按小时计算的实例价格。

    • 对于 Spot Allocation Strategy (Spot 分配策略),默认值为 Launch Spot Instances optimally based on the available Spot capacity per Availability Zone (根据各可用区的可用 Spot 容量启动最优 Spot 实例)。要改为使用最低价格策略,请选择 Diversify Spot Instances across your N lowest priced instance types per Availability Zone (使各可用区的 N 个最低价格实例类型的 Spot 实例实现多样化),然后输入要使用的 Spot 池数量,或者接受默认值 (2)。

    • 对于 Optional On-Demand Base (可选的按需基准),指定必须使用按需实例满足的、Auto Scaling 组的初始容量的最小实例数。

    • 对于 On-Demand Percentage Above Base (超过基准的按需百分比),为超出可选按需基准数量的额外容量指定按需实例和 Spot 实例的百分比。

  12. 对于组大小,输入 Auto Scaling 组的初始实例数。

  13. 对于 Network (网络),为您的 Auto Scaling 组选择 VPC。

    注意

    EC2-Classic 中不支持使用实例类型和购买选项的组合来启动实例。

  14. 对于 Subnet (子网),选择指定 VPC 中的一个或多个子网。可以在多个可用区中使用子网以提供高可用性。有关 Amazon EC2 Auto Scaling 高可用性的更多信息,请参阅在可用区之间分配实例

  15. (可选)要在负载均衡器中注册您的 Amazon EC2 实例,依次选择高级详细信息从一个或多个负载均衡器接收流量,然后选择一个或多个 Classic Load Balancer 或目标组。

  16. 选择 Next: Configure scaling policies

  17. Configure scaling policies (配置扩展策略) 页面上,选择下列选项之一,然后选择 Next: Configure Notifications (下一步:配置通知)

    • 要根据需要手动调整 Auto Scaling 组的大小,请选择 Keep this group at its initial size (保留该组的初始大小)。有关更多信息,请参阅 Amazon EC2 Auto Scaling 的手动扩展

    • 要根据您指定的条件自动调整 Auto Scaling 组的大小,选择 Use scaling policies to adjust the capacity of this group (使用扩展处理调整该组的容量),然后按照指示操作。有关详细信息,请参阅配置扩展策略

  18. (可选) 要接收通知,请选择 Add notification,配置通知,然后选择 Next: Configure Tags

  19. (可选) 要添加标签,请选择 Edit tags,为每个标签提供标签键和值,然后选择 Review

    或者,您可以稍后添加标签。有关更多信息,请参阅标记 Auto Scaling 组和实例

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

  21. Auto Scaling group creation status 页面上,选择 Close

使用命令行创建包含多个购买选项的 Auto Scaling 组

您可以使用以下任一命令:

示例:使用 capacity-optimized 分配策略启动 Spot 实例

以下 create-auto-scaling-group 命令会创建一个 Auto Scaling 组,该组指定以下内容:

  • 作为按需实例 (0) 启动的组的百分比以及以 (1) 开头的按需实例的基本数量

  • 按优先级顺序启动(c3.largec4.largec5.large)的实例类型

  • 要在其中启动实例的子网(subnet-5ea0c127subnet-6194ea3bsubnet-c934b782),每个子网对应于不同的可用区

  • 启动模板 (my-launch-template) 和启动模板版本 ($Default)

Amazon EC2 Auto Scaling 尝试满足您的按需容量时,它会首先启动 c3.large 实例类型。Spot 实例来自每个可用区中基于 Spot 实例容量的最佳 Spot 池。

aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json

下面是一个 config.json 示例文件。

{ "AutoScalingGroupName": "my-asg", "MixedInstancesPolicy": { "LaunchTemplate": { "LaunchTemplateSpecification": { "LaunchTemplateName": "my-launch-template", "Version": "$Default" }, "Overrides": [ { "InstanceType": "c3.large" }, { "InstanceType": "c4.large" }, { "InstanceType": "c5.large" } ] }, "InstancesDistribution": { "OnDemandBaseCapacity": 1, "OnDemandPercentageAboveBaseCapacity": 0, "SpotAllocationStrategy": "capacity-optimized" } }, "MinSize": 1, "MaxSize": 5, "DesiredCapacity": 3, "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782", "Tags": [] }

示例:使用在两个池之间不同的 lowest-price 分配策略启动 Spot 实例

以下 create-auto-scaling-group 命令会创建一个 Auto Scaling 组,该组指定以下内容:

  • 作为按需实例 (50) 启动的组的百分比,不同时指定以某个数字开头的按需实例的基本数量

  • 按优先级顺序启动(c3.largec4.largec5.large)的实例类型

  • 要在其中启动实例的子网(subnet-5ea0c127subnet-6194ea3bsubnet-c934b782),每个子网对应于不同的可用区

  • 启动模板 (my-launch-template) 和启动模板版本 ($Latest)

Amazon EC2 Auto Scaling 尝试满足您的按需容量时,它会首先启动 c3.large 实例类型。对于您的 Spot 容量,Amazon EC2 Auto Scaling 尝试在每个可用区中的两个价格最低的池中平均启动 Spot 实例。

aws autoscaling create-auto-scaling-group --cli-input-json file://~/config.json

下面是一个 config.json 示例文件。

{ "AutoScalingGroupName": "my-asg", "MixedInstancesPolicy": { "LaunchTemplate": { "LaunchTemplateSpecification": { "LaunchTemplateName": "my-launch-template", "Version": "$Latest" }, "Overrides": [ { "InstanceType": "c3.large" }, { "InstanceType": "c4.large" }, { "InstanceType": "c5.large" } ] }, "InstancesDistribution": { "OnDemandPercentageAboveBaseCapacity": 50, "SpotAllocationStrategy": "lowest-price", "SpotInstancePools": 2 } }, "MinSize": 1, "MaxSize": 5, "DesiredCapacity": 3, "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782", "Tags": [] }

要验证该组是否已启动实例

使用以下 describe-auto-scaling-groups 命令:

aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names my-asg

以下示例响应显示所需的容量为 3 并且组具有三个运行的实例。

{ "AutoScalingGroups": [ { "AutoScalingGroupARN": "arn", "ServiceLinkedRoleARN": "arn", "TargetGroupARNs": [], "SuspendedProcesses": [], "DesiredCapacity": 3, "MixedInstancesPolicy": { "InstancesDistribution": { "SpotAllocationStrategy": "lowest-price", "OnDemandPercentageAboveBaseCapacity": 50, "OnDemandAllocationStrategy": "prioritized", "SpotInstancePools": 2, "OnDemandBaseCapacity": 0 }, "LaunchTemplate": { "LaunchTemplateSpecification": { "LaunchTemplateName": "my-launch-template", "Version": "$Latest", "LaunchTemplateId": "lt-050555ad16a3f9c7f" }, "Overrides": [ { "InstanceType": "c3.large" }, { "InstanceType": "c4.large" }, { "InstanceType": "c5.large" } ] } }, "EnabledMetrics": [], "Tags": [], "AutoScalingGroupName": "my-asg", "DefaultCooldown": 300, "MinSize": 1, "Instances": [ { "ProtectedFromScaleIn": false, "AvailabilityZone": "us-west-2a", "LaunchTemplate": { "LaunchTemplateName": "my-launch-template", "Version": "1", "LaunchTemplateId": "lt-050555ad16a3f9c7f" }, "InstanceId": "i-0aae8709d49eeba4f", "HealthStatus": "Healthy", "LifecycleState": "InService" }, { "ProtectedFromScaleIn": false, "AvailabilityZone": "us-west-2b", "LaunchTemplate": { "LaunchTemplateName": "my-launch-template", "Version": "1", "LaunchTemplateId": "lt-050555ad16a3f9c7f" }, "InstanceId": "i-0c43f6003841d2d2b", "HealthStatus": "Healthy", "LifecycleState": "InService" }, { "ProtectedFromScaleIn": false, "AvailabilityZone": "us-west-2c", "LaunchTemplate": { "LaunchTemplateName": "my-launch-template", "Version": "1", "LaunchTemplateId": "lt-050555ad16a3f9c7f" }, "InstanceId": "i-0feb4cd6677d39903", "HealthStatus": "Healthy", "LifecycleState": "InService" } ], "MaxSize": 5, "VPCZoneIdentifier": "subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782", "HealthCheckGracePeriod": 0, "TerminationPolicies": [ "Default" ], "LoadBalancerNames": [], "CreatedTime": "2019-02-17T02:29:12.853Z", "AvailabilityZones": [ "us-west-2a", "us-west-2b", "us-west-2c" ], "HealthCheckType": "EC2", "NewInstancesProtectedFromScaleIn": false } ] }