使用 EC2 队列
要开始使用 EC2 队列,请创建一个请求,其中包括总目标容量、按需容量、Spot 容量、实例的一个或多个启动规范以及您愿意支付的最高价。队列请求必须包括队列启动实例所需信息 (例如 AMI、实例类型、子网或可用区、一个或多个安全组) 的启动模板。您可以为您愿意支付的实例类型、子网、可用区以及您愿意支付的最高价指定启动规范覆盖,而且,您可以为每个启动规范覆盖分配权重容量。
EC2 实例集在有可用容量时启动按需型实例,在最高价超过 Spot 价格并且有可用容量时启动竞价型实例。
如果队列包括竞价型实例,Amazon EC2 将尝试在 Spot 价格变化时保持队列的目标容量。
类型 maintain
或 request
的 EC2 队列 请求在过期或您删除它之前一直有效。在删除类型 maintain
或request
的队列时,您可以指定删除操作是否会终止该队列中的实例。否则,按需型实例持续运行至您将其终止,竞价型实例持续运行至遇到中断或您将其终止。
EC2 队列请求状态
EC2 队列请求可以处于以下某种状态:
submitted
-
EC2 队列 正在接受评估,并且 Amazon EC2 正准备启动目标数量的实例。请求可包括 按需型实例、竞价型实例 或两者。
active
-
EC2 队列 请求已验证,并且 Amazon EC2 正在尝试使正在运行的实例保持目标数量。请求会保持这一状态,直到其被修改或删除。
modifying
-
正在修改 EC2 队列 请求。请求会保持这一状态,直到修改全部完成或请求被删除。只能修改
maintain
队列类型。此状态不适用于其他请求类型。 deleted_running
-
EC2 队列 请求已删除,且不启动其他实例。其现有实例将继续运行,直至中断或被手动终止。请求会保持此状态,直到所有实例都已中断或终止。删除 EC2 队列 请求后,只有类型
maintain
或request
的 EC2 队列 才能有正在运行的实例。不支持包含正在运行实例的已删除instant
队列。此状态不适用于instant
队列。 deleted_terminating
-
EC2 队列 请求已删除,正在终止其实例。请求会保持此状态,直到所有实例都已终止。
deleted
-
EC2 队列 已删除,没有正在运行的实例。请求将在其实例终止两天后被删除。
以下显示了 EC2 队列请求状态之间的转换。如果您超出队列限制,请求会立即被删除。

EC2 队列先决条件
要创建 EC2 队列,必须满足以下先决条件:
启动模板
启动模板包含要启动的实例的有关信息,例如,实例类型、可用区以及您愿意支付的最高价。有关更多信息,请参阅通过启动模板启动实例。
EC2 队列的服务相关角色
AWSServiceRoleForEC2Fleet
角色授予 EC2 实例集权限以代表您请求、启动、终止和标记实例。Amazon EC2 使用此服务相关角色来完成以下操作:
-
ec2:RunInstances
– 启动实例。 -
ec2:RequestSpotInstances
– 请求 Spot 实例。 -
ec2:TerminateInstances
– 终止实例。 -
ec2:DescribeImages
– 描述 Spot 实例 的 Amazon 系统映像 (AMI)。 -
ec2:DescribeInstanceStatus
– 描述 Spot 实例的状态。 -
ec2:DescribeSubnets
– 描述 Spot 实例的子网。 -
ec2:CreateTags
– 将标签添加到 EC2 队列、实例和卷中。
确保此角色存在,然后才使用 AWS CLI 或 API 来创建 EC2 实例集。
注意
instant
EC2 队列不需要此角色。
要创建该角色,请如下使用 IAM 控制台。
为 EC2 队列创建 AWSServiceRoleForEC2Fleet 角色
访问:https://console.aws.amazon.com/iam/
,打开 IAM 控制台。 -
在导航窗格中,选择角色,然后选择创建角色。
-
对于Select type of trusted entity(选择受信任实体的类型),选择 AWS service(服务)。
-
对于 Choose the service that will use this role (选择将使用此角色的服务),选择 EC2 - Fleet (EC2 - 队列),然后依次选择 Next: Permissions (下一步: 权限)、Next: Tags (下一步: 标签) 和 Next: Review (下一步: 审核)。
-
在 Review (审核) 页面上,选择 Create role (创建角色)。
如果您不再需要使用 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/
。 -
在导航窗格中,选择 Policies (策略)。
-
选择 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 队列每 2 分钟检查一次队列中实例的运行状况。实例的运行状况为 healthy
或 unhealthy
。
EC2 队列 将使用 Amazon EC2 提供的状态检查来确定实例的运行状况。如果在连续三次运行状况检查中,实例状态检查或系统状态检查的状态有任一项为 unhealthy
,则确定该实例的运行状况为 impaired
。有关更多信息,请参阅实例的状态检查。
您可以配置您的队列以替换运行状况不佳的竞价型实例。将 ReplaceUnhealthyInstances
设置为 true
以后,若竞价型实例报告为 unhealthy
则将其替换。在替换运行状况不佳的竞价型实例时,队列可能在几分钟内降至其目标容量之下。
要求
-
仅对保持目标容量的 EC2 队列(类型
maintain
的队列)支持运行状况检查替换,不支持类型为request
或instant
的队列。 -
仅对竞价型实例支持运行状况检查替换。对于 按需型实例 不支持此功能。
-
您可以将 EC2 队列配置为仅在您创建它时替换运行状况不佳的实例。
-
用户仅在其有权调用
ec2:DescribeInstanceStatus
操作时才能使用运行状况检查替换。
配置 EC2 实例集 以替换运行状况不佳的竞价型实例
-
按创建 EC2 队列 的步骤操作。有关更多信息,请参阅创建 EC2 队列。
-
要将队列配置为替换运行状况不佳的 Spot 实例,请在 JSON 文件中,对于
ReplaceUnhealthyInstances
输入true
。
生成 EC2 队列 JSON 配置文件
要查看 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": "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": "" }
创建 EC2 队列
要创建 EC2 机群,您只需指定以下参数:
-
LaunchTemplateId
或LaunchTemplateName
– 指定要使用的启动模板(其中包含要启动的实例的参数,例如,实例类型、可用区以及您愿意支付的最高价) -
TotalTargetCapacity
– 指定机群的总目标容量 -
DefaultTargetCapacityType
– 指定默认购买选项是按需型还是竞价型
您可以指定多个覆盖启动模板的启动规范。启动规范可以有不同的实例类型、可用区、子网和最高价,并且可以包含不同的权重容量。或者,也可以指定实例必须具有的属性,Amazon EC2 将使用这些属性标识所有实例类型。有关更多信息,请参阅 EC2 机群的基于属性的实例类型选择。
如果不指定参数,机群将使用参数的默认值。
在 JSON 文件中指定机群参数。有关更多信息,请参阅生成 EC2 队列 JSON 配置文件。
目前没有控制台支持创建 EC2 Fleet。
创建 EC2 实例集(AWS CLI)
-
使用 create-fleet (AWS CLI) 命令创建 EC2 机群并指定包含机群配置参数的 JSON 文件。
aws ec2 create-fleet --cli-input-json file://
file_name.json
有关示例配置文件,请参阅EC2 队列 示例配置。
以下是 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 队列 请求进行分类和管理,您可使用自定义元数据标记它们。您可以在创建 EC2 队列 请求时或之后为其分配标签。
在标记队列请求时,不会自动标记队列启动的实例和卷。您需要明确标记队列启动的实例和卷。您可以选择仅将标签分配给队列请求,仅分配给队列启动的实例,仅分配给附加到队列启动的实例的卷,或者分配给所有这三种内容。
注意
对于 instant
队列类型,您可以标记附加到按需实例和Spot 实例的卷。对于 request
或 maintain
队列类型,您只能标记附加到按需实例的卷。
有关标签的工作原理的更多信息,请参阅标记 Amazon EC2 资源。
先决条件
授予用户标记资源的权限。有关更多信息,请参阅示例:标记资源。
授予用户标记资源的权限
创建包含以下内容的 IAM policy:
-
ec2:CreateTags
操作。这将授予用户创建标签的权限。 -
ec2:CreateFleet
操作。这将授予用户创建 EC2 实例集请求的权限。 -
对于
Resource
,我们建议您指定"*"
。这允许用户标记所有资源类型。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "TagEC2FleetRequest", "Effect": "Allow", "Action": [ "ec2:CreateTags", "ec2:CreateFleet" ], "Resource": "*" }
重要
对于 create-fleet
资源,我们目前不支持资源级权限。如果您指定 create-fleet
以作为资源,在您尝试标记队列时,将会发生未经授权异常。以下示例说明如何不 设置策略。
{ "Effect": "Allow", "Action": [ "ec2:CreateTags", "ec2:CreateFleet" ], "Resource": "arn:aws:ec2:
us-east-1
:111122223333
:create-fleet/*" }
要提供访问权限,请为您的用户、组或角色添加权限:
-
AWS IAM Identity Center 中的用户和组:
创建权限集合。按照《AWS IAM Identity Center 用户指南》中 创建权限集 的说明进行操作。
-
通过身份提供商在 IAM 中托管的用户:
创建适用于身份联合验证的角色。按照《IAM 用户指南》中为第三方身份提供商创建角色(联合身份验证)的说明进行操作。
-
IAM 用户:
-
创建您的用户可以担任的角色。按照《IAM 用户指南》中为 IAM 用户创建角色的说明进行操作。
-
(不推荐使用)将策略直接附加到用户或将用户添加到用户组。按照《IAM 用户指南》中向用户添加权限(控制台)中的说明进行操作。
-
标记新的 EC2 队列 请求
要在创建时标记 EC2 队列请求,请在用于创建该队列的 JSON 文件中指定键值对。ResourceType
的值必须为 fleet
。如果指定其他值,队列请求失败。
标记 EC2 队列启动的实例和卷
要在队列启动实例和卷时标记它们,请在 EC2 队列请求中引用的启动模板中指定标签。
注意
您无法标记附加到 request
或 maintain
队列类型启动的 Spot 实例的卷。
标记现有的 EC2 实例集请求、实例和卷(AWS CLI)
使用 create-tags 命令标记现有的资源。
aws ec2 create-tags \ --resources
fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE
i-1234567890abcdef0
vol-1234567890EXAMPLE
\ --tags Key=purpose
,Value=test
描述 EC2 机群
您可以描述 EC2 机群配置、EC2 机群中的实例,以及 EC2 机群的历史事件。
描述 EC2 机群 (AWS CLI)
可以使用 describe-fleets 命令描述 EC2 队列。
aws ec2 describe-fleets
重要
如果机群是 instant
类型,则您必须指定机群 ID,否则其不会出现在响应中。按如下所示包含 --fleet-ids
:
aws ec2 describe-fleets --fleet-ids
fleet-8a22eee4-f489-ab02-06b8-832a7EXAMPLE
输出示例
{
"Fleets": [
{
"ActivityStatus": "fulfilled",
"CreateTime": "2022-02-09T03:35:52+00:00",
"FleetId": "fleet-364457cd-3a7a-4ed9-83d0-7b63e51bb1b7",
"FleetState": "active",
"ExcessCapacityTerminationPolicy": "termination",
"FulfilledCapacity": 2.0,
"FulfilledOnDemandCapacity": 0.0,
"LaunchTemplateConfigs": [
{
"LaunchTemplateSpecification": {
"LaunchTemplateName": "my-launch-template",
"Version": "$Latest"
}
}
],
"TargetCapacitySpecification": {
"TotalTargetCapacity": 2,
"OnDemandTargetCapacity": 0,
"SpotTargetCapacity": 2,
"DefaultTargetCapacityType": "spot"
},
"TerminateInstancesWithExpiration": false,
"Type": "maintain",
"ReplaceUnhealthyInstances": false,
"SpotOptions": {
"AllocationStrategy": "capacity-optimized",
"InstanceInterruptionBehavior": "terminate"
},
"OnDemandOptions": {
"AllocationStrategy": "lowestPrice"
}
}
]
}
可以使用 describe-fleet-instances 命令描述指定 EC2 队列的实例。正在运行的实例的返回列表将定期刷新,或可能过时。
aws ec2 describe-fleet-instances --fleet-id
fleet-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE
输出示例
{
"ActiveInstances": [
{
"InstanceId": "i-09cd595998cb3765e",
"InstanceHealth": "healthy",
"InstanceType": "m4.large",
"SpotInstanceRequestId": "sir-86k84j6p"
},
{
"InstanceId": "i-09cf95167ca219f17",
"InstanceHealth": "healthy",
"InstanceType": "m4.large",
"SpotInstanceRequestId": "sir-dvxi7fsm"
}
],
"FleetId": "fleet-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
}
可以使用 describe-fleet-history 命令描述指定 EC2 队列在指定时间内的历史记录。
aws ec2 describe-fleet-history --fleet-id
fleet-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE
--start-time 2018-04-10T00:00:00Z
输出示例
{
"HistoryRecords": [
{
"EventInformation": {
"EventSubType": "submitted"
},
"EventType": "fleetRequestChange",
"Timestamp": "2020-09-01T18:26:05.000Z"
},
{
"EventInformation": {
"EventSubType": "active"
},
"EventType": "fleetRequestChange",
"Timestamp": "2020-09-01T18:26:15.000Z"
},
{
"EventInformation": {
"EventDescription": "t2.small, ami-07c8bc5c1ce9598c3, ...",
"EventSubType": "progress"
},
"EventType": "fleetRequestChange",
"Timestamp": "2020-09-01T18:26:17.000Z"
},
{
"EventInformation": {
"EventDescription": "{\"instanceType\":\"t2.small\", ...}",
"EventSubType": "launched",
"InstanceId": "i-083a1c446e66085d2"
},
"EventType": "instanceChange",
"Timestamp": "2020-09-01T18:26:17.000Z"
},
{
"EventInformation": {
"EventDescription": "{\"instanceType\":\"t2.small\", ...}",
"EventSubType": "launched",
"InstanceId": "i-090db02406cc3c2d6"
},
"EventType": "instanceChange",
"Timestamp": "2020-09-01T18:26:17.000Z"
}
],
"FleetId": "fleet-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE",
"LastEvaluatedTime": "1970-01-01T00:00:00.000Z",
"StartTime": "2018-04-09T23:53:20.000Z"
}
修改 EC2 队列
您可以修改处于 submitted
或 active
状态的 EC2 队列。当您修改队列时,它会进入 modifying
状态。
您只能修改类型为 maintain
的EC2 队列。您不能修改类型为 request
或 instant
的 EC2 队列。
您可以修改 EC2 队列的以下参数:
-
target-capacity-specification
– 增加或减少TotalTargetCapacity
、OnDemandTargetCapacity
和SpotTargetCapacity
的目标容量。 -
excess-capacity-termination-policy
– 当 EC2 队列的总目标容量降到队列的当前大小以下时是否应终止正在运行的实例。有效值为no-termination
和termination
。
如果提升目标容量,EC2 队列会根据为 DefaultTargetCapacityType
指定的实例购买选项(按需实例或 Spot 实例)启动额外的实例。
如果 DefaultTargetCapacityType
为 spot
,EC2 队列会根据其分配策略启动额外的 Spot 实例。如果分配策略为 lowest-price
,实例集将从请求中价格最低的 Spot 容量池启动实例。如果分配策略为 diversified
,队列将在请求中的池间分配实例。
在减少目标容量时,EC2 队列会删除超过新目标容量的任何打开的请求。您可以请求 队列终止 实例,直到队列的大小达到新目标容量。如果分配策略是 lowest-price
,则 队列会终止每单位价格最高的实例。如果分配策略是 diversified
,则 队列会在池间终止实例。或者,您可以请求 EC2 实例集保持队列当前的队列大小,而不替换已中断的竞价型实例或者您手动终止的任何实例。
当 EC2 实例集因目标容量下降而终止某个竞价型实例时,该实例将收到一条竞价型实例中断通知。
修改 EC2 实例集(AWS CLI)
可以使用 modify-fleet 命令更新指定 EC2 队列的目标容量。
aws ec2 modify-fleet \ --fleet-id
fleet-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE
\ --target-capacity-specification TotalTargetCapacity=20
如果要减少目标容量,但希望保持队列的当前大小,您可以按如下方式修改上面的命令。
aws ec2 modify-fleet \ --fleet-id
fleet-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE
\ --target-capacity-specification TotalTargetCapacity=10
\ --excess-capacity-termination-policy no-termination
删除 EC2 队列
如果您不再需要某一 EC2 队列,可以将其删除。删除实例集后,将取消与实例集关联的所有竞价型实例请求,从而不会启动任何新的竞价型实例。
删除 EC2 实例集后,您还必须指定是否要终止其所有实例。包括按需型实例和竞价型实例。
如果您指定在实例集删除后必须终止实例,实例集会进入 deleted_terminating
状态。否则,队列会进入 deleted_running
状态,并且实例会继续运行,直到遇到中断或您手动将其终止。
限制
-
在单个请求中,您可以删除最多 25 个
instant
队列。如果超过此数量,则不删除任何instant
队列,并会返回错误。对于类型为maintain
或request
的队列,在单个请求中可删除的数量没有限制。 -
单次删除
instant
队列的请求最多可终止 1000 个实例。
删除 EC2 实例集并终止其实例(AWS CLI)
使用 delete-fleets 命令和 --terminate-instances
参数来删除指定的 EC2 实例集并终止其关联实例。
aws ec2 delete-fleets \ --fleet-ids
fleet-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE
\ --terminate-instances
输出示例
{
"UnsuccessfulFleetDeletions": [],
"SuccessfulFleetDeletions": [
{
"CurrentFleetState": "deleted_terminating",
"PreviousFleetState": "active",
"FleetId": "fleet-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE"
}
]
}
删除 EC2 实例集而不终止其实例(AWS CLI)
您可以使用 --no-terminate-instances
参数修改上一个命令,以删除指定的 EC2 实例集而不终止其关联实例。
注意
--no-terminate-instances
队列不支持 instant
。
aws ec2 delete-fleets \ --fleet-ids
fleet-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE
\ --no-terminate-instances
输出示例
{
"UnsuccessfulFleetDeletions": [],
"SuccessfulFleetDeletions": [
{
"CurrentFleetState": "deleted_running",
"PreviousFleetState": "active",
"FleetId": "fleet-4b8aaae8-dfb5-436d-a4c6-3dafa4c6b7dcEXAMPLE"
}
]
}
队列无法删除时进行故障排除
如果 EC2 队列 无法删除,则 UnsuccessfulFleetDeletions
将返回 EC2 队列 的 ID、错误代码和错误消息。
错误代码为:
-
ExceededInstantFleetNumForDeletion
-
fleetIdDoesNotExist
-
fleetIdMalformed
-
fleetNotInDeletableState
-
NoTerminateInstancesNotSupported
-
UnauthorizedOperation
-
unexpectedError
ExceededInstantFleetNumForDeletion
故障排除
如果您尝试在单个请求中删除超过 25 个 instant
队列,则会返回 ExceededInstantFleetNumForDeletion
错误。下面是此错误的示例输出。
{ "UnsuccessfulFleetDeletions": [ { "FleetId": " fleet-5d130460-0c26-bfd9-2c32-0100a098f625", "Error": { "Message": "Can’t delete more than 25 instant fleets in a single request.", "Code": "ExceededInstantFleetNumForDeletion" } }, { "FleetId": "fleet-9a941b23-0286-5bf4-2430-03a029a07e31", "Error": { "Message": "Can’t delete more than 25 instant fleets in a single request.", "Code": "ExceededInstantFleetNumForDeletion" } } . . . ], "SuccessfulFleetDeletions": [] }
NoTerminateInstancesNotSupported
问题排查
如果您指定在删除 instant
队列时不得终止该队列中的实例,则会返回 NoTerminateInstancesNotSupported
错误。--no-terminate-instances
队列不支持 instant
。下面是此错误的示例输出。
{ "UnsuccessfulFleetDeletions": [ { "FleetId": "fleet-5d130460-0c26-bfd9-2c32-0100a098f625", "Error": { "Message": "NoTerminateInstances option is not supported for instant fleet", "Code": "NoTerminateInstancesNotSupported" } } ], "SuccessfulFleetDeletions": []
UnauthorizedOperation
问题排查
如果您没有终止实例的权限,则在删除必须终止其实例的队列时会收到 UnauthorizedOperation
错误。下面是错误响应。
<Response><Errors><Error><Code>UnauthorizedOperation</Code><Message>You are not authorized to perform this operation. Encoded authorization failure message: VvuncIxj7Z_CPGNYXWqnuFV-YjByeAU66Q9752NtQ-I3-qnDLWs6JLFd KnSMMiq5s6cGqjjPtEDpsnGHzzyHasFHOaRYJpaDVravoW25azn6KNkUQQlFwhJyujt2dtNCdduJfrqcFYAjlEiRMkfDHt7N63SKlweKUl BHturzDK6A560Y2nDSUiMmAB1y9UNtqaZJ9SNe5sNxKMqZaqKtjRbk02RZu5V2vn9VMk6fm2aMVHbY9JhLvGypLcMUjtJ76H9ytg2zRlje VPiU5v2s-UgZ7h0p2yth6ysUdhlONg6dBYu8_y_HtEI54invCj4CoK0qawqzMNe6rcmCQHvtCxtXsbkgyaEbcwmrm2m01-EMhekLFZeJLr DtYOpYcEl4_nWFX1wtQDCnNNCmxnJZAoJvb3VMDYpDTsxjQv1PxODZuqWHs23YXWVywzgnLtHeRf2o4lUhGBw17mXsS07k7XAfdPMP_brO PT9vrHtQiILor5VVTsjSPWg7edj__1rsnXhwPSu8gI48ZLRGrPQqFq0RmKO_QIE8N8s6NWzCK4yoX-9gDcheurOGpkprPIC9YPGMLK9tug </Message></Error></Errors><RequestID>89b1215c-7814-40ae-a8db-41761f43f2b0</RequestID></Response>
为了解决错误,您必须将 ec2:TerminateInstances
操作添加到 IAM policy,如下例中所示。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DeleteFleetsAndTerminateInstances", "Effect": "Allow", "Action": [ "ec2:DeleteFleets" "ec2:TerminateInstances" ], "Resource": "*" } ] }