EC2 机群的基于属性的实例类型选择
创建 EC2 机群时,必须指定一种或多种实例类型以配置机群中的按需型实例和竞价型实例。除了手动指定实例类型外,还可以指定实例必须具有的属性,Amazon EC2 将使用这些属性标识所有实例类型。这称为基于属性的实例类型选择。例如,您可以指定实例所需的最小和最大 vCPU 数量,EC2 机群将使用满足这些 vCPU 要求的任何可用实例类型启动实例。
基于属性的实例类型选择是工作负载和框架的理想选择,这些工作负载和框架可以灵活地确定所用的实例类型,例如在运行容器或 Web 机群、处理大数据以及实施持续集成和部署 (CI/CD) 工具等情况下。
优点
基于属性的实例类型选择具有以下优势:
-
有如此多的实例类型可供使用,因此找到适用于您的工作负载的实例类型可能非常耗时。当您指定实例属性时,实例类型将自动具有工作负载所需的属性。
-
要为 EC2 机群手动指定多种实例类型,您必须为每种实例类型创建单独的启动模板覆盖。但是,借助基于属性的实例类型选择,要提供多种实例类型,您只需在启动模板或启动模板覆盖中指定实例属性即可。
-
当您指定实例属性而不是实例类型时,您的机群可以在新一代实例类型发布时使用这些实例类型,“满足未来”机群配置的需求。
-
当您指定实例属性而不是实例类型时,EC2 机群可以从各种实例类型中进行选择以启动竞价型实例,从而遵循灵活选择实例类型 Spot 最佳实践。
基于属性的实例类型选择的工作原理
要在机群配置中使用基于属性的实例类型选择,请将实例类型列表替换为实例所需的实例属性列表。EC2 机群将在具有指定实例属性的任何可用实例类型上启动实例。
实例属性的类型
您可以指定几个实例属性来表示计算需求。有关每个属性和默认值的描述,请参阅 Amazon EC2 API 参考中的 InstanceRequirements。
在何处配置基于属性的实例类型选择
根据您使用的是控制台还是 Amazon CLI,可以按如下方式为基于属性的实例类型选择指定实例属性:
在控制台中,您可以在以下实例集配置组件中指定实例属性:
-
在启动模板中,并在实例集请求中引用启动模板
在 Amazon CLI 中,您可以在以下一个或全部机群配置组件中指定实例属性:
-
在启动模板中,并在实例集请求中引用启动模板
-
在启动模板覆盖中
如果您想混合应用使用不同 AMI 的实例,则可以在多个启动模板覆盖中指定实例属性。例如,不同的实例类型可以使用 x86 和基于 ARM 的处理器。
-
在启动规范中
预置机群时,EC2 机群如何使用基于属性的实例类型选择
EC2 机群通过以下方式预置实例集:
-
EC2 机群标识具有指定属性的实例类型。
-
EC2 机群使用价格保护确定要排除的实例类型。
-
EC2 机群根据具有匹配实例类型的Amazon区域或可用区确定将从中启动实例的容量池。
-
EC2 机群应用指定的分配策略以确定从中启动实例的容量池。
请注意,基于属性的实例类型选择不会选择从中预置机群的容量池;这是分配策略的任务。可能有大量具有指定属性的实例类型,其中一些类型可能成本高昂。竞价型和按需型的
lowest-price
默认分配策略可保证 EC2 机群将从成本最低的容量池启动实例。如果您指定分配策略,EC2 机群将根据指定的分配策略启动实例。
-
对于竞价型实例,基于属性的实例类型选择支持
price-capacity-optimized
、capacity-optimized
和lowest-price
分配策略。 -
对于按需型实例,基于属性的实例类型选择支持
lowest-price
分配策略。
-
-
如果没有适用于具有指定实例属性的实例类型的容量,则无法启动任何实例,并且机群返回错误。
价格保护
价格保护是一项功能,可以防止 EC2 机群使用您认为成本过高的实例类型,即使它们恰好适合您指定的属性。当您使用基于属性的实例类型选择创建机群时,默认情况下会启用价格保护,并为按需型实例和竞价型实例设置了单独的阈值。当 Amazon EC2 选择具有您的属性的实例类型时,会排除定价高于阈值的实例类型。阈值表示您将支付的最大值,以高于具有指定属性的成本最低的最新一代 M、C 或 R 实例类型的百分比表示。
如果不指定阈值,默认情况下将使用以下阈值:
-
对于按需型实例,价格保护阈值设置为 20%。
-
对于竞价型实例,价格保护阈值设置为 100%。
指定价格保护阈值
创建 EC2 机群时,配置机群以使用基于属性的实例类型选择,然后执行以下操作:
-
若要指定按需型实例价格保护阈值,请在 JSON 配置文件的
InstanceRequirements
结构中,为OnDemandMaxPricePercentageOverLowestPrice
输入以百分比表示的价格保护阈值。 -
若要指定竞价型实例价格保护阈值,请在 JSON 配置文件的
InstanceRequirements
结构中,为SpotMaxPricePercentageOverLowestPrice
输入以百分比表示的价格保护阈值。
有关创建机群的更多信息,请参阅 通过基于属性的实例类型选择创建 EC2 机群。
注意
创建 EC2 机群时,如果您将 TargetCapacityUnitType
设置为 vcpu
或 memory-mib
,价格保护阈值将基于每个 vCPU 或每个内存的价格应用,而不是基于每个实例的价格应用。
注意事项
-
您可以在 EC2 机群中指定实例类型或实例属性,但不能同时指定两者。
使用 CLI 时,启动模板覆盖将覆盖启动模板。例如,如果启动模板包含实例类型,而启动模板覆盖包含实例属性,则由实例属性标识的实例将覆盖启动模板中的实例类型。
-
使用 CLI 时,如果将实例属性指定为覆盖,也无法指定权重或优先级。
-
在一个请求配置中,最多可以指定四个
InstanceRequirements
结构。
通过基于属性的实例类型选择创建 EC2 机群
您可以通过 Amazon CLI 将机群配置为使用基于属性的实例类型选择。
若要通过基于属性的实例类型选择创建 EC2 实例集(Amazon CLI)
使用 create-fleet(Amazon CLI)命令创建 EC2 实例集。在 JSON 文件中指定机群配置。
aws ec2 create-fleet \ --region
us-east-1
\ --cli-input-json file://file_name
.json
示例
文件file_name
.json
以下示例包含配置 EC2 实例集的参数,以使用基于属性的实例类型选择,后附文本说明。
{ "SpotOptions": { "AllocationStrategy": "
price-capacity-optimized
" }, "LaunchTemplateConfigs": [{ "LaunchTemplateSpecification": { "LaunchTemplateName": "my-launch-template
", "Version": "" }, "Overrides": [{ "InstanceRequirements": { "VCpuCount": { "Min":
1
2
}, "MemoryMiB": { "Min":4
} } }] }], "TargetCapacitySpecification": { "TotalTargetCapacity":20
, "DefaultTargetCapacityType": "spot
" }, "Type": "instant
" }
基于属性的实例类型选择的属性在 InstanceRequirements
结构中指定。在此示例中,指定了两个属性:
-
VCpuCount
– 至少指定了 2 个 vCPU。由于未指定最大值,因此没有最大限制。 -
MemoryMiB
– 至少指定了 4 MiB 的内存。由于未指定最大值,因此没有最大限制。
将识别具有 2 个或更多 vCPU 和 4 MiB 或更大内存的任何实例类型。然而,当 EC2 实例集预置实例集时,价格保护和分配策略可能会排除某些实例类型。
有关您可以指定的所有可能属性的列表和描述,请参阅 Amazon EC2 API Reference(《Amazon EC2 API 参考》)中的 InstanceRequirements。
注意
当 InstanceRequirements
包含在机群配置中时,必须排除 InstanceType
和 WeightedCapacity
;它们无法与实例属性同时确定机群配置。
JSON 还包含以下实例集配置:
-
"AllocationStrategy": "
– 实例集中竞价型实例的分配策略。price-capacity-optimized
" -
"LaunchTemplateName": "
– 启动模板包含一些实例配置信息,但如果指定了任何实例类型,则这些配置信息将被my-launch-template
", "Version": "
"1
InstanceRequirements
中指定的属性覆盖。 -
"TotalTargetCapacity":
– 目标容量为 20 个竞价型实例。20
-
"DefaultTargetCapacityType": "
– 默认容量为竞价型实例。spot
" -
"Type": "
– 实例集的请求类型是instant
"instant
。
有效配置示例和无效配置示例
如果您使用 Amazon CLI 创建 EC2 机群,必须确保机群配置有效。以下示例展示了有效配置和无效配置。
如果配置包含以下项,则视为无效:
-
单个
Overrides
结构,但同时包含InstanceRequirements
和InstanceType
-
两个
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
结构)。此配置适用于在同一机群中支持 arm
和 x86
架构。
{ "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" } } }
有效配置:仅指定 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" } } }
配置无效:Overrides
包含 InstanceRequirements
和 InstanceType
以下配置无效。Overrides
结构同时包含 InstanceRequirements
和 InstanceType
。对于 Overrides
,可以指定 InstanceRequirements
或 InstanceType
,但不能同时指定两者。
{
"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
包含 InstanceRequirements
和 InstanceType
以下配置无效。Overrides
结构同时包含 InstanceRequirements
和 InstanceType
。您可以指定 InstanceRequirements
或 InstanceType
,但不能同时指定两者,即使采用不同的 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
结构,每个结构都包含 "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 Amazon CLI 命令预览与您指定的属性匹配的实例类型。这对于在不启动任何实例的情况下确定要在请求配置中指定的属性尤其有用。请注意,该命令不考虑可用容量。
通过使用 Amazon CLI 指定属性来预览实例类型列表
-
(可选)要生成所有可以指定的可能属性,请使用 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": [ "i386" ], "VirtualizationTypes": [ "hvm" ], "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": "included", "RequireHibernateSupport": true, "NetworkInterfaceCount": { "Min": 0, "Max": 0 }, "LocalStorage": "included", "LocalStorageTypes": [ "hdd" ], "TotalLocalStorageGB": { "Min": 0.0, "Max": 0.0 }, "BaselineEbsBandwidthMbps": { "Min": 0, "Max": 0 }, "AcceleratorTypes": [ "gpu" ], "AcceleratorCount": { "Min": 0, "Max": 0 }, "AcceleratorManufacturers": [ "nvidia" ], "AcceleratorNames": [ "a100" ], "AcceleratorTotalMemoryMiB": { "Min": 0, "Max": 0 }, "NetworkBandwidthGbps": { "Min": 0.0, "Max": 0.0 }, "AllowedInstanceTypes": [ "" ] }, "MaxResults": 0, "NextToken": "" }
-
使用上一步的输出创建 JSON 配置文件,然后按如下方式进行配置:
注意
您必须提供
ArchitectureTypes
、VirtualizationTypes
、VCpuCount
和MemoryMiB
的值。您可以省略其它属性;如果省略,则使用默认值。有关每个属性及其默认值的描述,请参阅 Amazon EC2 命令行参考中的 get-instance-types-from-instance-requirements。
-
对于
ArchitectureTypes
,请指定一个或多个处理器架构类型。 -
对于
VirtualizationTypes
,请指定一个或多个虚拟化类型。 -
对于
VCpuCount
,请指定最小和最大 vCPU 数量。要指定没有最低限制,对于Min
,请指定0
。要指定没有最大限制,请省略Max
参数。 -
对于
MemoryMiB
,请指定最小和最大内存量(以 MiB 为单位)。要指定没有最低限制,对于Min
,请指定0
。要指定没有最大限制,请省略Max
参数。 -
您可以选择指定一个或多个其他属性来进一步限制返回的实例类型列表。
-
-
要预览具有您在 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 文件包含所需属性。它们是
ArchitectureTypes
、VirtualizationTypes
、VCpuCount
和MemoryMiB
。此外,还包含可选属性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 || ...
-
在确定满足您的需求的实例类型后,请记下您使用的实例属性,以便在配置机群请求时可以使用。