创建 EC2 实例集
要创建 EC2 实例集,请在 JSON 文件中定义实例集配置,然后使用 create-fleet AWS CLI 命令引用该文件。在 JSON 文件中,您必须指定实例集的总目标容量、竞价型实例和按需型实例的单独目标容量,以及用于定义实例集中实例配置(例如 AMI、实例类型、子网、可用区、一个或多个安全组)的启动模板。您可以选择指定其他配置,例如用于覆盖启动模板配置的参数、从 EC2 容量池中选择竞价型实例和按需型实例的分配策略,以及愿意为实例集支付的最高金额。有关更多信息,请参阅 EC2 实例集或竞价型实例集配置选项。
EC2 实例集在有可用容量时启动按需型实例,在最高价超过竞价型实例价格并且有可用容量时启动竞价型实例。
如果实例集包含竞价型实例且类型为 maintain
,Amazon EC2 会尝试在竞价型实例中断时维持实例集的目标容量。
EC2 队列限制
以下限制适用于 EC2 队列。
-
EC2 实例集仅可通过 Amazon EC2 API、AWS CLI、AWS SDK 和 AWS CloudFormation 创建。
-
EC2 队列请求不能跨 AWS 区域。您需要为每个区域创建单独的 EC2 队列。
-
EC2 队列请求不能跨同一可用区内的不同子网。
EC2 队列先决条件
要创建 EC2 实例集,必须满足以下先决条件:
启动模板
启动模板指定要启动的实例的相关配置信息,例如实例类型和可用区。有关启动模板的更多信息,请参阅在 Amazon EC2 启动模板中存储实例启动参数。
EC2 队列的服务相关角色
AWSServiceRoleForEC2Fleet
角色授予 EC2 实例集权限以代表您请求、启动、终止和标记实例。Amazon EC2 使用此服务相关角色来完成以下操作:
-
ec2:RunInstances
– 启动实例。 -
ec2:RequestSpotInstances
– 请求 Spot 实例。 -
ec2:TerminateInstances
– 终止实例。 -
ec2:DescribeImages
:描述实例的亚马逊机器映像(AMI)。 -
ec2:DescribeInstanceStatus
:描述实例的状态。 -
ec2:DescribeSubnets
:描述实例的子网。 -
ec2:CreateTags
– 将标签添加到 EC2 队列、实例和卷中。
确保此角色存在,然后才使用 AWS CLI 或 API 来创建 EC2 实例集。
注意
instant
EC2 队列不需要此角色。
要创建该角色,请如下使用 IAM 控制台。
为 EC2 队列创建 AWSServiceRoleForEC2Fleet 角色
通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
在导航窗格中,选择 Roles(角色)。
-
选择 Create role(创建角色)。
-
在选择受信任的实体页面上,请执行以下操作:
-
在可信实体类型中选择 AWS 服务。
-
在使用案例下,对于服务或使用案例,选择 EC2 - 实例集。
提示
请务必选择 EC2 - 实例集。如果您选择 EC2,则 EC2 - 实例集使用案例不会出现在使用案例列表中。EC2 - 实例集使用案例将自动创建具有所需 IAM 权限的策略,并建议将 AWSServiceRoleForEC2Fleet 作为角色名称。
-
选择 Next(下一步)。
-
-
在添加权限页面上,选择下一步。
-
在命名、检查并创建页面上,选择创建角色。
如果您不再需要使用 EC2 队列,我们建议您删除 AWSServiceRoleForEC2Fleet 角色。当此角色从您的账户中删除后,如果您创建其他队列,可再次创建此角色。
有关更多信息,请参阅《IAM 用户指南》中的服务相关角色。
授予对用于加密的 AMI 和 EBS 快照的客户托管密钥的访问权限
如果在 EC2 实例集中指定加密的 AMI 或加密的 Amazon EBS 快照,并且您使用 AWS KMS 密钥进行加密,则必须授予 AWSServiceRoleForEC2Fleet 角色使用客户托管式密钥的权限,以便 Amazon EC2 可以代表您启动实例。为此,您必须在客户托管密钥中添加授权,如以下过程中所示。
在提供权限时,授权是密钥策略的替代方法。有关更多信息,请参阅 AWS Key Management Service 开发人员指南中的使用授权和在 AWS KMS 中使用密钥策略。
为 AWSServiceRoleForEC2Fleet 角色授予使用客户托管密钥的权限
-
使用 create-grant 命令在客户托管密钥中添加授权,并指定授予权限的主体(AWSServiceRoleForEC2Fleet 服务相关角色),以执行授权允许的操作。客户托管密钥由
key-id
参数和客户托管密钥的 ARN 指定。委托人是由grantee-principal
参数和 AWSServiceRoleForEC2Fleet 服务相关角色的 ARN 指定的。aws kms create-grant \ --region
us-east-1
\ --key-id arn:aws:kms:us-east-1
:444455556666
:key/1234abcd-12ab-34cd-56ef-1234567890ab
\ --grantee-principal arn:aws:iam::111122223333
:role/AWSServiceRoleForEC2Fleet \ --operations "Decrypt" "Encrypt" "GenerateDataKey" "GenerateDataKeyWithoutPlaintext" "CreateGrant" "DescribeKey" "ReEncryptFrom" "ReEncryptTo"
EC2 实例集用户的权限
如果用户打算创建或管理 EC2 实例集,请确保为其授予所需权限。
为 EC2 实例集创建策略
打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
在导航窗格中,选择策略。
-
选择 Create policy。
-
在创建策略页面上,选择 JSON 选项卡,将文本替换为以下内容,并选择查看策略。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:*" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:ListRoles", "iam:PassRole", "iam:ListInstanceProfiles" ], "Resource":"arn:aws:iam::123456789012:role/DevTeam*" } ] }
ec2:*
为用户授予调用所有 Amazon EC2 API 操作的权限。要将用户限制到特定 Amazon EC2 API 操作,请改为指定这些操作。用户必须具有相应权限,可以调用
iam:ListRoles
操作以枚举现有 IAM 角色、调用iam:PassRole
操作以指定 EC2 实例集角色以及调用iam:ListInstanceProfiles
操作以枚举现有实例配置文件。(可选)要允许用户使用 IAM 控制台创建角色或实例配置文件,还必须在策略中添加以下操作:
-
iam:AddRoleToInstanceProfile
-
iam:AttachRolePolicy
-
iam:CreateInstanceProfile
-
iam:CreateRole
-
iam:GetRole
-
iam:ListPolicies
-
-
在查看策略页面上,输入策略名称和描述,然后选择创建策略。
-
要提供访问权限,请为您的用户、组或角色添加权限:
-
AWS IAM Identity Center 中的用户和群组:
创建权限集合。按照《AWS IAM Identity Center 用户指南》中创建权限集的说明进行操作。
-
通过身份提供商在 IAM 中托管的用户:
创建适用于身份联合验证的角色。按照《IAM 用户指南》中针对第三方身份提供商创建角色(联合身份验证)的说明进行操作。
-
IAM 用户:
-
创建您的用户可以担任的角色。按照《IAM 用户指南》中为 IAM 用户创建角色的说明进行操作。
-
(不推荐使用)将策略直接附加到用户或将用户添加到用户组。按照《IAM 用户指南》中向用户添加权限(控制台)中的说明进行操作。
-
-
创建 EC2 实例集
要使用 EC2 实例集启动实例的实例集,只需在实例集请求中指定以下参数,实例集会使用其他参数的默认值:
-
LaunchTemplateId
或LaunchTemplateName
– 指定要使用的启动模板(其中包含要启动的实例的参数,例如实例类型和可用区) -
TotalTargetCapacity
– 指定机群的总目标容量 -
DefaultTargetCapacityType
– 指定默认购买选项是按需型还是竞价型
要覆盖启动模板中指定的参数,可指定一个或多个覆盖。每个覆盖可以有不同的实例类型、可用区、子网和最高价,并且可以包含不同的权重容量。除了指定实例类型外,还可以指定实例必须具有的属性,Amazon EC2 将使用这些属性标识所有实例类型。有关更多信息,请参阅 指定 EC2 实例集或竞价型实例集的实例类型选择属性。
对于 instant
类型的 EC2 实例集,可以指定 Systems Manager 参数而非 AMI ID。您可以在覆盖或启动模板中指定 Systems Manager 参数。有关更多信息,请参阅 使用 Systems Manager 参数而非 AMI ID。
在 JSON 文件中指定实例集参数。有关可以指定的所有可能参数的信息,请参阅查看所有的 EC2 实例集配置选项。
有关实例集配置示例,请参阅 EC2 实例集 CLI 配置示例。
目前没有控制台支持创建 EC2 Fleet。
创建 EC2 实例集
-
使用 create-fleet(AWS CLI)命令创建实例集,并指定包含实例集配置参数的 JSON 文件。
aws ec2 create-fleet --cli-input-json file://
file_name.json
以下是 request
或 maintain
类型的队列的示例输出。
{
"FleetId": "fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE"
}
以下是启动了目标容量的 instant
类型队列的示例输出。
{
"FleetId": "fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE",
"Errors": [],
"Instances": [
{
"LaunchTemplateAndOverrides": {
"LaunchTemplateSpecification": {
"LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE",
"Version": "1"
},
"Overrides": {
"InstanceType": "c5.large",
"AvailabilityZone": "us-east-1a"
}
},
"Lifecycle": "on-demand",
"InstanceIds": [
"i-1234567890abcdef0",
"i-9876543210abcdef9"
],
"InstanceType": "c5.large",
"Platform": null
},
{
"LaunchTemplateAndOverrides": {
"LaunchTemplateSpecification": {
"LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE",
"Version": "1"
},
"Overrides": {
"InstanceType": "c4.large",
"AvailabilityZone": "us-east-1a"
}
},
"Lifecycle": "on-demand",
"InstanceIds": [
"i-5678901234abcdef0",
"i-5432109876abcdef9"
]
]
}
以下是启动了部分目标容量并且出现“无法启动实例”错误的 instant
类型队列的示例输出。
{
"FleetId": "fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE",
"Errors": [
{
"LaunchTemplateAndOverrides": {
"LaunchTemplateSpecification": {
"LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE",
"Version": "1"
},
"Overrides": {
"InstanceType": "c4.xlarge",
"AvailabilityZone": "us-east-1a",
}
},
"Lifecycle": "on-demand",
"ErrorCode": "InsufficientInstanceCapacity",
"ErrorMessage": ""
},
],
"Instances": [
{
"LaunchTemplateAndOverrides": {
"LaunchTemplateSpecification": {
"LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE",
"Version": "1"
},
"Overrides": {
"InstanceType": "c5.large",
"AvailabilityZone": "us-east-1a"
}
},
"Lifecycle": "on-demand",
"InstanceIds": [
"i-1234567890abcdef0",
"i-9876543210abcdef9"
]
]
}
以下是未启动任何实例的 instant
类型队列的示例输出。
{
"FleetId": "fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE",
"Errors": [
{
"LaunchTemplateAndOverrides": {
"LaunchTemplateSpecification": {
"LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE",
"Version": "1"
},
"Overrides": {
"InstanceType": "c4.xlarge",
"AvailabilityZone": "us-east-1a",
}
},
"Lifecycle": "on-demand",
"ErrorCode": "InsufficientCapacity",
"ErrorMessage": ""
},
{
"LaunchTemplateAndOverrides": {
"LaunchTemplateSpecification": {
"LaunchTemplateId": "lt-01234a567b8910abcEXAMPLE",
"Version": "1"
},
"Overrides": {
"InstanceType": "c5.large",
"AvailabilityZone": "us-east-1a",
}
},
"Lifecycle": "on-demand",
"ErrorCode": "InsufficientCapacity",
"ErrorMessage": ""
},
],
"Instances": []
}
创建 EC2 实例集来替换运行状况不佳的竞价型实例
EC2 队列每 2 分钟检查一次队列中实例的运行状况。实例的运行状况为 healthy
或 unhealthy
。
EC2 队列 将使用 Amazon EC2 提供的状态检查来确定实例的运行状况。如果在连续三次运行状况检查中,实例状态检查或系统状态检查的状态有任一项为 unhealthy
,则确定该实例的运行状况为 impaired
。有关更多信息,请参阅Amazon EC2 实例的状态检查。
您可以配置您的队列以替换运行状况不佳的竞价型实例。将 ReplaceUnhealthyInstances
设置为 true
以后,若竞价型实例报告为 unhealthy
则将其替换。在替换运行状况不佳的竞价型实例时,队列可能在几分钟内降至其目标容量之下。
要求
-
仅对保持目标容量的 EC2 队列(类型
maintain
的队列)支持运行状况检查替换,不支持类型为request
或instant
的队列。 -
仅对竞价型实例支持运行状况检查替换。对于 按需型实例 不支持此功能。
-
您可以将 EC2 队列配置为仅在您创建它时替换运行状况不佳的实例。
-
用户仅在其有权调用
ec2:DescribeInstanceStatus
操作时才能使用运行状况检查替换。
配置 EC2 实例集 以替换运行状况不佳的竞价型实例
-
使用创建 EC2 实例集中用于创建 EC2 实例集的信息。
-
要将实例集配置为替换运行状况不佳的竞价型实例,请在 JSON 文件中将
ReplaceUnhealthyInstances
指定true
。
查看所有的 EC2 实例集配置选项
要查看 EC2 机群配置参数的完整列表,可以生成 JSON 文件。有关每个参数的说明,请参阅 AWS CLI 命令参考中的 create-fleet。
通过所有可能的 EC2 实例集参数生成 JSON 文件
使用 create-fleet (AWS CLI) 命令和 --generate-cli-skeleton
参数生成 EC2 机群 JSON 文件,并将输出定向到某个文件以将其保存。
aws ec2 create-fleet \ --generate-cli-skeleton input >
ec2createfleet.json
示例输出
{
"DryRun": true,
"ClientToken": "",
"SpotOptions": {
"AllocationStrategy": "price-capacity-optimized",
"MaintenanceStrategies": {
"CapacityRebalance": {
"ReplacementStrategy": "launch"
}
},
"InstanceInterruptionBehavior": "hibernate",
"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": "termination",
"LaunchTemplateConfigs": [
{
"LaunchTemplateSpecification": {
"LaunchTemplateId": "",
"LaunchTemplateName": "",
"Version": ""
},
"Overrides": [
{
"InstanceType": "r5.metal",
"MaxPrice": "",
"SubnetId": "",
"AvailabilityZone": "",
"WeightedCapacity": 0.0,
"Priority": 0.0,
"Placement": {
"AvailabilityZone": "",
"Affinity": "",
"GroupName": "",
"PartitionNumber": 0,
"HostId": "",
"Tenancy": "dedicated",
"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": "included",
"BurstablePerformance": "required",
"RequireHibernateSupport": true,
"NetworkInterfaceCount": {
"Min": 0,
"Max": 0
},
"LocalStorage": "excluded",
"LocalStorageTypes": [
"ssd"
],
"TotalLocalStorageGB": {
"Min": 0.0,
"Max": 0.0
},
"BaselineEbsBandwidthMbps": {
"Min": 0,
"Max": 0
},
"AcceleratorTypes": [
"inference"
],
"AcceleratorCount": {
"Min": 0,
"Max": 0
},
"AcceleratorManufacturers": [
"amd"
],
"AcceleratorNames": [
"a100"
],
"AcceleratorTotalMemoryMiB": {
"Min": 0,
"Max": 0
}
}
}
]
}
],
"TargetCapacitySpecification": {
"TotalTargetCapacity": 0,
"OnDemandTargetCapacity": 0,
"SpotTargetCapacity": 0,
"DefaultTargetCapacityType": "on-demand",
"TargetCapacityUnitType": "memory-mib"
},
"TerminateInstancesWithExpiration": true,
"Type": "instant",
"ValidFrom": "1970-01-01T00:00:00",
"ValidUntil": "1970-01-01T00:00:00",
"ReplaceUnhealthyInstances": true,
"TagSpecifications": [
{
"ResourceType": "fleet",
"Tags": [
{
"Key": "",
"Value": ""
}
]
}
],
"Context": ""
}