亚马逊AWS官方博客

适用于 EC2 Auto Scaling 和 EC2 机群的基于属性的实例类型选择

十多年前,我使用的第一项 AWS 服务是 Amazon Elastic Compute Cloud (Amazon EC2)。随着时间的推移,EC2 加入大量经过优化的实例类型,以适应不同的使用案例。这些实例类型具有不同的 CPU/GPU、内存、存储和网络容量组合,可让您灵活地为应用程序选择适当的资源组合。

云平台的主要优势之一是弹性。借助 EC2 机群,您可以跨多个实例类型和购买选项同步请求容量,跨多个可用区启动实例,以及同时使用按需型实例、预留型实例和竞价型实例。借助 EC2 Auto Scaling,您可以根据自己定义的条件自动添加或删除 EC2 实例,以及添加高级实例管理功能,例如热池实例刷新运行状况检查。借助这些工具,您需要手动更新配置才能从最新的 EC2 实例中受益。此外,当您使用 EC2 竞价型实例优化成本时,重点是选择多种实例类型以访问最大量的竞价型容量。到目前为止,无法通过简单的方法灵活地构建和维护实例类型配置。

我很高兴地与诸位分享,我们正在推出基于属性的实例类型选择 (ABS),这是一项新功能,可让您将实例要求表达为一组属性,例如 vCPU、内存和存储空间。ABS 会将您的要求转换为所有匹配的实例类型,从而简化了实例类型配置的创建和维护任务。该功能还可让您在新一代实例类型发布时自动使用这些实例类型,并通过 EC2 竞价型实例访问更广泛的容量。EC2 机群和 EC2 Auto Scaling 选择并启动符合指定属性的实例,无需您手动选择实例类型。

ABS 非常适合灵活的工作负载和框架,例如在运行容器或 Web 机群、处理大数据以及实施持续集成和部署 (CI/CD) 工具时。使用竞价型实例时,您现在可以使用简单的属性配置来涵盖所有实例类型和大小,而无需选择和输入数十种实例类型和大小,并且可在新实例出现时自动包含新的实例类型和大小。

基于属性的实例类型选择的工作原理
使用 ABS,您可以将实例类型列表替换为实例要求。您可以在启动模板内或在 EC2 机群或 EC2 Auto Scaling 请求中指定实例要求作为启动模板覆盖值。

ABS 分两个步骤工作:

  • 首先,ABS 根据指定的属性、AWS 区域、可用区和价格确定实例类型的列表
  • 然后,EC2 Auto Scaling 或 EC2 机群会将选定的分配策略应用于该列表。

对于竞价型实例,ABS 支持容量优化最低价格的分配策略。

对于按需型实例,ABS 支持最低价格分配策略。EC2 Auto Scaling 或 EC2 机群会将 ABS 属性解析为实例类型列表,并将首先启动价格最低的实例以满足容量请求的按需部分,然后根据需要移动到下一个价格最低的实例。

默认情况下,ABS 启用价格保护以妥善控制您的支出。价格保护可让 ABS 避免配置过于昂贵的实例类型,即使它们恰好符合您选择的属性并将预置实例的价格保持在一定范围内。启用价格保护后,ABS 不会选择价格高于价格保护阈值的实例类型。竞价型和按需型实例有两个单独的阈值,您可以选择自定义这些阈值。

接下来通过几个示例了解 ABS 在实践中是如何工作的。

将基于属性的实例类型选择与 EC2 Auto Scaling 搭配使用
我使用带有 --generate-cli-skeleton 参数的 AWS 命令行界面 (CLI) 来生成 YAML 格式的文件,其中包含 CreateAutoScalingGroup API 接受的所有参数。

aws autoscaling create-auto-scaling-group \
    --generate-cli-skeleton yaml-input > create-asg.yaml

在 YAML 文件中,有一个新的 InstanceRequirements 部分可用于覆盖启动模板的配置。这些都是我可以通过一些示例值选择的属性:

InstanceRequirements:
  VCpuCount:  # [REQUIRED] 
    Min: 0
    Max: 0
  MemoryMiB: # [REQUIRED] 
    Min: 0
    Max: 0
  CpuManufacturers:
  - amd
  MemoryGiBPerVCpu:
    Min: 0.0
    Max: 0.0
  ExcludedInstanceTypes:
  - ''
  InstanceGenerations:
  - previous
  SpotMaxPricePercentageOverLowestPrice: 0
  OnDemandMaxPricePercentageOverLowestPrice: 0
  BareMetal: required  #  Valid values are: included, excluded, required.
  BurstablePerformance: excluded #  Valid values are: included, excluded, required.
  RequireHibernateSupport: true
  NetworkInterfaceCount:
    Min: 0
    Max: 0
  LocalStorage: required  #  Valid values are: included, excluded, required.
  LocalStorageTypes:
  - ssd
  TotalLocalStorageGB:
    Min: 0.0
    Max: 0.0
  BaselineEbsBandwidthMbps:
    Min: 0
    Max: 0
  AcceleratorTypes:
  - inference
  AcceleratorCount:
    Min: 0
    Max: 0
  AcceleratorManufacturers:
  - amazon-web-services
  AcceleratorNames:
  - a100
  AcceleratorTotalMemoryMiB:
    Min: 0
    Max: 0

我现在可以根据自己的要求选择实例类型,而不是提供覆盖列表,每个覆盖都有一个选择了单个实例类型的 InstanceType 属性。我可以指定 vCPU 的最小和最大数量以及内存范围。或者,我可以要求为每个 vCPU 提供最低内存量。

我可以从中选择更多属性。例如,我可以包括、排除或要求使用裸机或突发实例。我可以添加网络或存储要求。如有必要,我可以要求 GPU 或 FPGA 加速器,诸如此类。

就我而言,我要求提供带有两到四个 vCPU 和至少 2048 MiB 内存的实例。以前,此工作需要大约 40 个覆盖,每个满足这些要求的实例类型需要一个覆盖。但在使用 ABS 之后,我只需要在 InstanceRequirements 部分中指定三个参数即可。下面是我用来创建 Auto Scaling 组的完整配置文件:

AutoScalingGroupName: 'my-asg' # [REQUIRED] 
MixedInstancesPolicy:
  LaunchTemplate:
    LaunchTemplateSpecification:
      LaunchTemplateId: 'lt-0537239d9aef10a77'
    Overrides:
    - InstanceRequirements:
        VCpuCount: # [REQUIRED] 
          Min: 2
          Max: 4
        MemoryMiB: # [REQUIRED] 
          Min: 2048
  InstancesDistribution:
    OnDemandPercentageAboveBaseCapacity: 50
    SpotAllocationStrategy: 'capacity-optimized'
MinSize: 0 # [REQUIRED] 
MaxSize: 100 # [REQUIRED] 
DesiredCapacity: 4
VPCZoneIdentifier: 'subnet-e76a128a,subnet-e66a128b,subnet-e16a128c'

我创建了 Auto Scaling 组,并用 --cli-input-yaml 参数传递配置文件:

aws autoscaling create-auto-scaling-group \
    --cli-input-yaml file://my-create-asg.yaml

几分钟后,EC2 控制台中运行四个 EC2 实例(对应于我的 DesiredCapacity 值)。在列表中,我找到了涵盖时间和 CPU 制造商的 C3 和 C5a 实例。

控制台屏幕截图。

在这些实例中,50% 是按需型实例(基于 InstancesDistribution 部分中的 OnDemandPercentageAboveBaseCapacity 选项)。在 EC2 控制台的 Spot 请求选项卡中,我看到了两个请求:

控制台屏幕截图。

正如预期,所有实例类型都符合我的要求且规模较大。但是,我很快意识到我的应用程序在每个实例中都需要更多的计算容量。我用新的要求更新了 Auto Scaling 组,要求更多的 vCPU(介于四到六个之间):

aws autoscaling update-auto-scaling-group \
    --auto-scaling-group-name my-asg \
    --mixed-instances-policy '{
        "LaunchTemplate": {
            "Overrides": [
                {
                    "InstanceRequirements": {
                    "VCpuCount":{"Min": 4, "Max": 6},
                    "MemoryMiB":{"Min": 2048} }
                } ]
        } }' 

然后,我开始 Auto Scaling 组的实例刷新:

aws autoscaling start-instance-refresh \
    --auto-scaling-group-name my-asg

EC2 Auto Scaling 会根据新要求对实例进行滚动替换。几分钟后,所有实例都被大小为 xlarge 的新实例所取代,并且我混合运行 C5、C5a 和 M3 实例。之前的所有实例都已终止。

控制台屏幕截图。

与之前类似,其中两个新实例是使用 Spot 请求启动的。之前的 Spot 请求已关闭。

控制台屏幕截图。

如何预览匹配的实例而不启动它们
为了更好地了解新 ABS 的工作原理,我使用了新的 EC2 GetInstanceTypesFromInstanceRequirements API。此 API 返回符合我要求的实例类型列表。

首先,我创建 YAML 参数文件:

aws ec2 get-instance-types-from-instance-requirements --generate-cli-skeleton yaml-input > requirements.yaml

我按照以前更新 Auto Scaling 组的相同要求编辑文件。这次,我还要求使用当代的实例

ArchitectureTypes:  # [REQUIRED] 
- x86_64
VirtualizationTypes: # [REQUIRED] 
- hvm
InstanceRequirements: # [REQUIRED] 
  VCpuCount:
    Min: 4
    Max: 6
  MemoryMiB:
    Min: 2048
  InstanceGenerations:
    - current

请注意,这里必须指定架构类型 (x86_64) 和虚拟化 (hvm)。创建 Auto Scaling 组时,此信息由启动模板使用的 Amazon Machine Images (AMI) 提供。

现在,让我们预览按照这些要求选择的所有实例类型:

aws ec2 get-instance-types-from-instance-requirements \
    --cli-input-yaml file://requirements.yaml \
    --output table

------------------------------------------
|GetInstanceTypesFromInstanceRequirements|
+----------------------------------------+
||             InstanceTypes            ||
|+--------------------------------------+|
||             InstanceType             ||
|+--------------------------------------+|
||  c4.xlarge                           ||
||  c5.xlarge                           ||
||  c5a.xlarge                          ||
||  c5ad.xlarge                         ||
||  c5d.xlarge                          ||
||  c5n.xlarge                          ||
||  d2.xlarge                           ||
||  d3.xlarge                           ||
||  d3en.xlarge                         ||
||  g3s.xlarge                          ||
||  g4ad.xlarge                         ||
||  g4dn.xlarge                         ||
||  i3.xlarge                           ||
||  i3en.xlarge                         ||
||  inf1.xlarge                         ||
||  m4.xlarge                           ||
||  m5.xlarge                           ||
||  m5a.xlarge                          ||
||  m5ad.xlarge                         ||
||  m5d.xlarge                          ||
||  m5dn.xlarge                         ||
||  m5n.xlarge                          ||
||  m5zn.xlarge                         ||
||  m6i.xlarge                          ||
||  p2.xlarge                           ||
||  r4.xlarge                           ||
||  r5.xlarge                           ||
||  r5a.xlarge                          ||
||  r5ad.xlarge                         ||
||  r5b.xlarge                          ||
||  r5d.xlarge                          ||
||  r5dn.xlarge                         ||
||  r5n.xlarge                          ||
||  x1e.xlarge                          ||
||  z1d.xlarge                          ||
|+--------------------------------------+|

使用这个新的 EC2 API,我可以快速测试不同的要求,了解它们如何映射到实例类型。当新的实例类型发布时,如果它们符合我的要求,则会自动添加到列表中。

可用性和定价
您现在可以在所有公有区域和 GovCloud AWS 区域中将基于属性的实例类型选择 (ABS) 与 EC2 Auto ScalingEC2 机群结合使用,但我们需要更多时间部署的中国区域除外。您可以使用 AWS 命令行界面 (CLI)AWS 软件开发工具包AWS 管理控制台AWS CloudFormation。使用 ABS 不会产生额外费用;您只需为预置的实例支付标准 EC2 定价。有关价格保护的更多信息,请参阅 EC2 Auto Scaling 文档

借助这项新功能,可以轻松地使用灵活的实例类型配置,而无需获取长篇的实例类型列表。这样,当新一代实例类型在区域中发布时,您可以自动使用这些实例类型。此外,您可以通过 Spot 请求轻松访问更多容量。

通过基于属性的实例类型选择简化 EC2 实例类型配置。

Danilo