EC2 机群的基于属性的实例类型选择 - Amazon Elastic Compute Cloud

EC2 机群的基于属性的实例类型选择

创建 EC2 机群时,必须指定一种或多种实例类型以配置机群中的按需型实例和竞价型实例。除了手动指定实例类型外,还可以指定实例必须具有的属性,Amazon EC2 将使用这些属性标识所有实例类型。这称为基于属性的实例类型选择。例如,您可以指定实例所需的最小和最大 vCPU 数量,EC2 机群将使用满足这些 vCPU 要求的任何可用实例类型启动实例。

基于属性的实例类型选择是工作负载和框架的理想选择,这些工作负载和框架可以灵活地确定所用的实例类型,例如在运行容器或 Web 机群、处理大数据以及实施持续集成和部署 (CI/CD) 工具等情况下。

优点

基于属性的实例类型选择具有以下优势:

  • 有如此多的实例类型可供使用,因此找到适用于您的工作负载的实例类型可能非常耗时。当您指定实例属性时,实例类型将自动具有工作负载所需的属性。

  • 要为 EC2 机群手动指定多种实例类型,您必须为每种实例类型创建单独的启动模板覆盖。但是,借助基于属性的实例类型选择,要提供多种实例类型,您只需在启动模板或启动模板覆盖中指定实例属性即可。

  • 当您指定实例属性而不是实例类型时,您的机群可以在新一代实例类型发布时使用这些实例类型,“满足未来”机群配置的需求。

  • 当您指定实例属性而不是实例类型时,EC2 机群可以从各种实例类型中进行选择以启动竞价型实例,从而遵循灵活选择实例类型 Spot 最佳实践

基于属性的实例类型选择的工作原理

要在机群配置中使用基于属性的实例类型选择,请将实例类型列表替换为实例所需的实例属性列表。EC2 机群将在具有指定实例属性的任何可用实例类型上启动实例。

实例属性的类型

您可以指定几个实例属性来表示计算需求。有关每个属性和默认值的描述,请参阅 Amazon EC2 API 参考中的 InstanceRequirements

在何处配置基于属性的实例类型选择

根据您使用的是控制台还是 AWS CLI,可以按如下方式为基于属性的实例类型选择指定实例属性:

在控制台中,您可以在以下一个或两个机群配置组件中指定实例属性:

  • 在启动模板中,并在机群请求中引用启动模板

  • 在机群请求中

在 AWS CLI 中,您可以在以下一个或全部机群配置组件中指定实例属性:

  • 在启动模板中,并在机群请求中引用启动模板

  • 在启动模板覆盖中

    如果您想混合应用使用不同 AMI 的实例,则可以在多个启动模板覆盖中指定实例属性。例如,不同的实例类型可以使用 x86 和基于 ARM 的处理器。

  • 在启动规范中

预置机群时,EC2 机群如何使用基于属性的实例类型选择

EC2 机群通过以下方式预置实例集:

  • EC2 机群标识具有指定属性的实例类型。

  • EC2 机群使用价格保护确定要排除的实例类型。

  • EC2 机群根据具有匹配实例类型的AWS区域或可用区确定将从中启动实例的容量池。

  • EC2 机群应用指定的分配策略以确定从中启动实例的容量池。

    请注意,基于属性的实例类型选择不会选择从中预置机群的容量池;这是分配策略的任务。可能有大量具有指定属性的实例类型,其中一些类型可能成本高昂。竞价型和按需型的 lowest-price 默认分配策略可保证 EC2 机群将从成本最低的容量池启动实例。

    如果您指定分配策略,EC2 机群将根据指定的分配策略启动实例。

    • 对于竞价型实例,基于属性的实例类型选择支持 capacity-optimizedlowest-price 分配策略。

    • 对于按需型实例,基于属性的实例类型选择支持 lowest-price 分配策略。

  • 如果没有适用于具有指定实例属性的实例类型的容量,则无法启动任何实例,并且机群返回错误。

价格保护

价格保护是一项功能,可以防止 EC2 机群使用您认为成本过高的实例类型,即使它们恰好适合您指定的属性。当您使用基于属性的实例类型选择创建机群时,默认情况下会启用价格保护,并为按需型实例和竞价型实例设置了单独的阈值。当 Amazon EC2 选择具有您的属性的实例类型时,会排除定价高于阈值的实例类型。阈值表示您将支付的最大值,以高于具有指定属性的成本最低的最新一代 M、C 或 R 实例类型的百分比表示。

如果不指定阈值,默认情况下将使用以下阈值:

  • 对于按需型实例,价格保护阈值设置为 20%。

  • 对于竞价型实例,价格保护阈值设置为 100%。

指定价格保护阈值

创建 EC2 机群时,配置机群以使用基于属性的实例类型选择,然后执行以下操作:

  • 若要指定按需型实例价格保护阈值,请在 JSON 配置文件的 InstanceRequirements 结构中,为 OnDemandMaxPricePercentageOverLowestPrice 输入以百分比表示的价格保护阈值。

  • 若要指定竞价型实例价格保护阈值,请在 JSON 配置文件的 InstanceRequirements 结构中,为 SpotMaxPricePercentageOverLowestPrice 输入以百分比表示的价格保护阈值。

有关创建机群的更多信息,请参阅 通过基于属性的实例类型选择创建 EC2 机群

注意

创建 EC2 机群时,如果您将 TargetCapacityUnitType 设置为 vcpumemory-mib,价格保护阈值将基于每个 vCPU 或每个内存的价格应用,而不是基于每个实例的价格应用。

注意事项

  • 您可以在 EC2 机群中指定实例类型或实例属性,但不能同时指定两者。

    使用 CLI 时,启动模板覆盖将覆盖启动模板。例如,如果启动模板包含实例类型,而启动模板覆盖包含实例属性,则由实例属性标识的实例将覆盖启动模板中的实例类型。

  • 使用 CLI 时,如果将实例属性指定为覆盖,也无法指定权重或优先级。

  • 在一个请求配置中,最多可以指定四个 InstanceRequirements 结构。

通过基于属性的实例类型选择创建 EC2 机群

您可以通过 AWS CLI 将机群配置为使用基于属性的实例类型选择。

使用 AWS CLI 创建 EC2 机群

创建 EC2 实例集(AWS CLI)

  • 使用 create-fleet(AWS CLI)命令创建 EC2 实例集。在 JSON 文件中指定机群配置。

aws ec2 create-fleet \ --region us-east-1 \ --cli-input-json file://file_name.json

以下 JSON 文件包含在配置 EC2 机群时可以指定的所有参数。基于属性的实例类型选择的参数位于 InstanceRequirements 结构中。有关每个属性和默认值的描述,请参阅 Amazon EC2 API 参考中的 InstanceRequirements

注意

InstanceRequirements 包含在机群配置中时,必须排除 InstanceTypeWeightedCapacity;它们无法与实例属性同时确定机群配置。

{ "DryRun": true, "ClientToken": "", "SpotOptions": { "AllocationStrategy": "capacity-optimized", "MaintenanceStrategies": { "CapacityRebalance": { "ReplacementStrategy": "launch" } }, "InstanceInterruptionBehavior": "stop", "InstancePoolsToUseCount": 0, "SingleInstanceType": true, "SingleAvailabilityZone": true, "MinTargetCapacity": 0, "MaxTotalPrice": "" }, "OnDemandOptions": { "AllocationStrategy": "prioritized", "CapacityReservationOptions": { "UsageStrategy": "use-capacity-reservations-first" }, "SingleInstanceType": true, "SingleAvailabilityZone": true, "MinTargetCapacity": 0, "MaxTotalPrice": "" }, "ExcessCapacityTerminationPolicy": "no-termination", "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateId": "", "LaunchTemplateName": "", "Version": "" }, "Overrides": [ { "InstanceType": "r5ad.large", "MaxPrice": "", "SubnetId": "", "AvailabilityZone": "", "WeightedCapacity": 0.0, "Priority": 0.0, "Placement": { "AvailabilityZone": "", "Affinity": "", "GroupName": "", "PartitionNumber": 0, "HostId": "", "Tenancy": "host", "SpreadDomain": "", "HostResourceGroupArn": "" }, "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 0 }, "MemoryMiB": { "Min": 0, "Max": 0 }, "CpuManufacturers": [ "amd" ], "MemoryGiBPerVCpu": { "Min": 0.0, "Max": 0.0 }, "ExcludedInstanceTypes": [ "" ], "InstanceGenerations": [ "previous" ], "SpotMaxPricePercentageOverLowestPrice": 0, "OnDemandMaxPricePercentageOverLowestPrice": 0, "BareMetal": "excluded", "BurstablePerformance": "required", "RequireHibernateSupport": true, "NetworkInterfaceCount": { "Min": 0, "Max": 0 }, "LocalStorage": "required", "LocalStorageTypes": [ "hdd" ], "TotalLocalStorageGB": { "Min": 0.0, "Max": 0.0 }, "BaselineEbsBandwidthMbps": { "Min": 0, "Max": 0 }, "AcceleratorTypes": [ "fpga" ], "AcceleratorCount": { "Min": 0, "Max": 0 }, "AcceleratorManufacturers": [ "xilinx" ], "AcceleratorNames": [ "vu9p" ], "AcceleratorTotalMemoryMiB": { "Min": 0, "Max": 0 } } } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 0, "OnDemandTargetCapacity": 0, "SpotTargetCapacity": 0, "DefaultTargetCapacityType": "spot", "TargetCapacityUnitType": "vcpu" }, "TerminateInstancesWithExpiration": true, "Type": "instant", "ValidFrom": "1970-01-01T00:00:00", "ValidUntil": "1970-01-01T00:00:00", "ReplaceUnhealthyInstances": true, "TagSpecifications": [ { "ResourceType": "route-table", "Tags": [ { "Key": "", "Value": "" } ] } ], "Context": "" }

有效配置示例和无效配置示例

如果您使用 AWS CLI 创建 EC2 机群,必须确保机群配置有效。以下示例展示了有效配置和无效配置。

如果配置包含以下项,则视为无效:

  • 单个 Overrides 结构,但同时包含 InstanceRequirementsInstanceType

  • 两个 Overrides 结构,其中一个包含 InstanceRequirements,而另一个包含 InstanceType

  • 两个 InstanceRequirements 结构,但在同一 LaunchTemplateSpecification 中具有重叠的属性值

有效配置:具有覆盖的单个启动模板

以下配置有效。包含一个启动模板和一个 Overrides 结构(包含一个 InstanceRequirements 结构)。下面是示例配置的文本说明。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "My-launch-template", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 2, "Max": 8 }, "MemoryMib": { "Min": 0, "Max": 10240 }, "MemoryGiBPerVCpu": { "Max": 10000 }, "RequireHibernateSupport": true } } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 5000, "DefaultTargetCapacityType": "spot", "TargetCapacityUnitType": "vcpu" } } }

InstanceRequirements

要使用基于属性的实例选择,您必须在机群配置中包含 InstanceRequirements 结构,并为机群中的实例指定所需的属性。

在上述示例中,指定了以下实例属性:

  • VCpuCount – 实例类型的 vCPU 数量必须最少为 2 个,最多为 8 个。

  • MemoryMiB – 实例类型的最大内存必须为 10240MiB。最小值 0 表示没有最低限制。

  • MemoryGiBPerVCpu – 实例类型的每个 vCPU 内存最大值必须为 10000GiB。Min 参数是可选的。省略此属性表示没有最低限制。

TargetCapacityUnitType

TargetCapacityUnitType 参数为目标容量指定单位。在该示例中,目标容量是 5000,目标容量单位类型是 vcpu,它们共同指定了所需的 5000 个 vCPU 目标容量。EC2 机群将启动足够多的实例,以便机群中的 vCPU 总数为 5000 个 vCPU。

有效配置:具有多个 InstanceRequirements 的单个启动模板

以下配置有效。包含一个启动模板和一个 Overrides 结构(包含两个 InstanceRequirements 结构)。InstanceRequirements 中指定的属性有效,因为值不重叠,第一个 InstanceRequirements 结构指定 VCpuCount 为 0-2 个 vCPU,而第二个 InstanceRequirements 结构指定 4-8 个 vCPU。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } }, { "InstanceRequirements": { "VCpuCount": { "Min": 4, "Max": 8 }, "MemoryMiB": { "Min": 0 } } } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "spot" } } }

有效配置:两个启动模板,每个都具有覆盖

以下配置有效。包含两个启动模板,每个模板都有一个 Overrides 结构(包含一个 InstanceRequirements 结构)。此配置适用于在同一机群中支持 armx86 架构。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "armLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } }, { "LaunchTemplateSpecification": { "LaunchTemplateName": "x86LaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "spot" } } }

配置无效:Overrides 包含 InstanceRequirementsInstanceType

以下配置无效。Overrides 结构同时包含 InstanceRequirementsInstanceType。对于 Overrides,可以指定 InstanceRequirementsInstanceType,但不能同时指定两者。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } }, { "InstanceType": "m5.large" } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "spot" } } }

配置无效:两个 Overrides 包含 InstanceRequirementsInstanceType

以下配置无效。Overrides 结构同时包含 InstanceRequirementsInstanceType。您可以指定 InstanceRequirementsInstanceType,但不能同时指定两者,即使采用不同的 Overrides 结构也是如此。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } } ] }, { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyOtherLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceType": "m5.large" } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "spot" } } }

有效配置:仅指定 InstanceRequirements,且属性值不重叠

以下配置有效。包含两个 LaunchTemplateSpecification 结构,每个结构都有一个启动模板和一个 Overrides 结构(包含一个 InstanceRequirements 结构)。InstanceRequirements 中指定的属性有效,因为值不重叠,第一个 InstanceRequirements 结构指定 VCpuCount 为 0-2 个 vCPU,而第二个 InstanceRequirements 结构指定 4-8 个 vCPU。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } } ] }, { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyOtherLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 4, "Max": 8 }, "MemoryMiB": { "Min": 0 } } } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "spot" } } }

配置无效:属性值重叠

以下配置无效。两个 InstanceRequirements 结构,每个结构都包含 "VCpuCount": {"Min": 0, "Max": 2}。这些属性的值重叠,这将导致容量池重复。

{ "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateName": "MyLaunchTemplate", "Version": "1" }, "Overrides": [ { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } }, { "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 2 }, "MemoryMiB": { "Min": 0 } } } } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 1, "DefaultTargetCapacityType": "spot" } } }

预览具有指定属性的实例类型

您可以使用 get-instance-types-from-instance-requirements AWS CLI 命令预览与您指定的属性匹配的实例类型。这对于在不启动任何实例的情况下确定要在请求配置中指定的属性尤其有用。请注意,该命令不考虑可用容量。

通过使用 AWS CLI 指定属性来预览实例类型列表

  1. (可选)要生成所有可以指定的可能属性,请使用 get-instance-types-from-instance-requirements 命令和 --generate-cli-skeleton 参数。您可以选择使用 input > attributes.json 将输出定向到某个文件以将其保存。

    aws ec2 get-instance-types-from-instance-requirements \ --region us-east-1 \ --generate-cli-skeleton input > attributes.json

    预期输出

    { "DryRun": true, "ArchitectureTypes": [ "x86_64_mac" ], "VirtualizationTypes": [ "paravirtual" ], "InstanceRequirements": { "VCpuCount": { "Min": 0, "Max": 0 }, "MemoryMiB": { "Min": 0, "Max": 0 }, "CpuManufacturers": [ "intel" ], "MemoryGiBPerVCpu": { "Min": 0.0, "Max": 0.0 }, "ExcludedInstanceTypes": [ "" ], "InstanceGenerations": [ "current" ], "SpotMaxPricePercentageOverLowestPrice": 0, "OnDemandMaxPricePercentageOverLowestPrice": 0, "BareMetal": "included", "BurstablePerformance": "excluded", "RequireHibernateSupport": true, "NetworkInterfaceCount": { "Min": 0, "Max": 0 }, "LocalStorage": "required", "LocalStorageTypes": [ "hdd" ], "TotalLocalStorageGB": { "Min": 0.0, "Max": 0.0 }, "BaselineEbsBandwidthMbps": { "Min": 0, "Max": 0 }, "AcceleratorTypes": [ "inference" ], "AcceleratorCount": { "Min": 0, "Max": 0 }, "AcceleratorManufacturers": [ "xilinx" ], "AcceleratorNames": [ "t4" ], "AcceleratorTotalMemoryMiB": { "Min": 0, "Max": 0 } }, "MaxResults": 0, "NextToken": "" }
  2. 使用上一步的输出创建 JSON 配置文件,然后按如下方式进行配置:

    注意

    您必须提供 ArchitectureTypesVirtualizationTypesVCpuCountMemoryMiB 的值。您可以省略其它属性;如果省略,则使用默认值。

    有关每个属性及其默认值的描述,请参阅 Amazon EC2 命令行参考中的 get-instance-types-from-instance-requirements

    1. 对于 ArchitectureTypes,请指定一个或多个处理器架构类型。

    2. 对于 VirtualizationTypes,请指定一个或多个虚拟化类型。

    3. 对于 VCpuCount,请指定最小和最大 vCPU 数量。要指定没有最低限制,对于 Min,请指定 0。要指定没有最大限制,请省略 Max 参数。

    4. 对于 MemoryMiB,请指定最小和最大内存量(以 MiB 为单位)。要指定没有最低限制,对于 Min,请指定 0。要指定没有最大限制,请省略 Max 参数。

    5. 您可以选择指定一个或多个其他属性来进一步限制返回的实例类型列表。

  3. 要预览具有您在 JSON 文件中所指定属性的实例类型,请使用 get-instance-types-from-instance-requirements 命令,然后使用 --cli-input-json 参数指定 JSON 文件的名称和路径。您可以选择将输出格式设置为以表格格式显示。

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

    示例 attributes.json 文件

    在此示例中,JSON 文件包含所需属性。它们是 ArchitectureTypesVirtualizationTypesVCpuCountMemoryMiB。此外,还包含可选属性 InstanceGenerations。请注意,对于 MemoryMiB,可以省略 Max 值,指示没有限制。

    { "ArchitectureTypes": [ "x86_64" ], "VirtualizationTypes": [ "hvm" ], "InstanceRequirements": { "VCpuCount": { "Min": 4, "Max": 6 }, "MemoryMiB": { "Min": 2048 }, "InstanceGenerations": [ "current" ] } }

    输出示例

    ------------------------------------------ |GetInstanceTypesFromInstanceRequirements| +----------------------------------------+ || InstanceTypes || |+--------------------------------------+| || InstanceType || |+--------------------------------------+| || c4.xlarge || || c5.xlarge || || c5a.xlarge || || c5ad.xlarge || || c5d.xlarge || || c5n.xlarge || || d2.xlarge || ...
  4. 在确定满足您的需求的实例类型后,请记下您使用的实例属性,以便在配置机群请求时可以使用。