使用 EC2 队列 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 EC2 队列

要开始使用 EC2 队列,请创建一个请求,其中包括总目标容量、按需容量、Spot 容量、实例的一个或多个启动规范以及您愿意支付的最高价。队列请求必须包括队列启动实例所需信息 (例如 AMI、实例类型、子网或可用区、一个或多个安全组) 的启动模板。您可以为您愿意支付的实例类型、子网、可用区以及您愿意支付的最高价指定启动规范覆盖,而且,您可以为每个启动规范覆盖分配权重容量。

EC2 实例集在有可用容量时启动按需型实例,在最高价超过 Spot 价格并且有可用容量时启动竞价型实例。

如果队列包括竞价型实例,Amazon EC2 将尝试在 Spot 价格变化时保持队列的目标容量。

类型 maintainrequest 的 EC2 队列 请求在过期或您删除它之前一直有效。在删除类型 maintainrequest 的队列时,您可以指定删除操作是否会终止该队列中的实例。否则,按需型实例持续运行至您将其终止,竞价型实例持续运行至遇到中断或您将其终止。

EC2 队列请求状态

EC2 队列请求可以处于以下某种状态:

submitted

EC2 队列 正在接受评估,并且 Amazon EC2 正准备启动目标数量的实例。请求可包括 按需型实例、竞价型实例 或两者。如果请求超出实例集限制,则会被立即删除。

active

EC2 队列 请求已验证,并且 Amazon EC2 正在尝试使正在运行的实例保持目标数量。请求会保持这一状态,直到其被修改或删除。

modifying

正在修改 EC2 队列 请求。请求会保持这一状态,直到修改全部完成或请求被删除。只能修改 maintain 队列类型。此状态不适用于其他请求类型。

deleted_running

EC2 队列 请求已删除,且不启动其他实例。其现有实例将继续运行,直至中断或被手动终止。请求会保持此状态,直到所有实例都已中断或终止。删除 EC2 队列 请求后,只有类型 maintainrequest 的 EC2 队列 才能有正在运行的实例。不支持包含正在运行实例的已删除 instant 队列。此状态不适用于 instant 队列。

deleted_terminating

EC2 队列 请求已删除,正在终止其实例。请求会保持此状态,直到所有实例都已终止。

deleted

EC2 队列 已删除,没有正在运行的实例。请求将在其实例终止两天后被删除。

EC2 队列先决条件

启动模板

启动模板包含要启动的实例的有关信息,例如,实例类型、可用区以及您愿意支付的最高价。有关更多信息,请参阅通过启动模板启动实例

EC2 队列的服务相关角色

AWSServiceRoleForEC2Fleet 角色授予 EC2 实例集权限以代表您请求、启动、终止和标记实例。Amazon EC2 使用此服务相关角色来完成以下操作:

  • ec2:RunInstances – 启动实例。

  • ec2:RequestSpotInstances – 请求 Spot 实例。

  • ec2:TerminateInstances – 终止实例。

  • ec2:DescribeImages – 描述竞价型实例的亚马逊机器映像(AMI)。

  • ec2:DescribeInstanceStatus – 描述 Spot 实例的状态。

  • ec2:DescribeSubnets – 描述 Spot 实例的子网。

  • ec2:CreateTags – 将标签添加到 EC2 队列、实例和卷中。

确保此角色存在,然后才使用 Amazon CLI 或 API 来创建 EC2 实例集。

注意

instant EC2 队列不需要此角色。

要创建该角色,请如下使用 IAM 控制台。

为 EC2 队列创建 AWSServiceRoleForEC2Fleet 角色
  1. 通过 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

  2. 在导航窗格中,选择角色,然后选择创建角色

  3. 选择受信任的实体类型页面上,请执行以下操作:

    1. 可信实体类型中选择 Amazon 服务

    2. 使用案例下,对于服务或使用案例,选择 EC2 - 实例集

      提示

      请务必选择 EC2 - 实例集。如果您选择 EC2,则 EC2 - 实例集使用案例不会出现在使用案例列表中。EC2 - 实例集使用案例将自动创建具有所需 IAM 权限的策略,并建议将 AWSServiceRoleForEC2Fleet 作为角色名称。

    3. 选择下一步

  4. 添加权限页面上,选择下一步

  5. 命名、检查并创建页面上,选择创建角色

如果您不再需要使用 EC2 队列,我们建议您删除 AWSServiceRoleForEC2Fleet 角色。当此角色从您的账户中删除后,如果您创建其他队列,可再次创建此角色。

有关更多信息,请参阅 IAM 用户指南 中的使用服务相关角色

授予对用于加密的 AMI 和 EBS 快照的客户托管密钥的访问权限

如果在 EC2 实例集中指定加密的 AMI 或加密的 Amazon EBS 快照,并且您使用 Amazon KMS 密钥进行加密,则必须授予 AWSServiceRoleForEC2Fleet 角色使用客户托管式密钥的权限,以便 Amazon EC2 可以代表您启动实例。为此,您必须在客户托管密钥中添加授权,如以下过程中所示。

在提供权限时,授权是密钥策略的替代方法。有关更多信息,请参阅 Amazon Key Management Service 开发人员指南中的使用授权在 Amazon 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 实例集创建策略
  1. 打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择策略

  3. 选择 Create policy

  4. 创建策略页面上,选择 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

  5. 查看策略页面上,输入策略名称和描述,然后选择创建策略

  6. 要提供访问权限,请为您的用户、组或角色添加权限:

EC2 队列运行状况检查

EC2 队列每 2 分钟检查一次队列中实例的运行状况。实例的运行状况为 healthyunhealthy

EC2 队列 将使用 Amazon EC2 提供的状态检查来确定实例的运行状况。如果在连续三次运行状况检查中,实例状态检查或系统状态检查的状态有任一项为 unhealthy,则确定该实例的运行状况为 impaired。有关更多信息,请参阅实例的状态检查

您可以配置您的队列以替换运行状况不佳的竞价型实例。将 ReplaceUnhealthyInstances 设置为 true 以后,若竞价型实例报告为 unhealthy 则将其替换。在替换运行状况不佳的竞价型实例时,队列可能在几分钟内降至其目标容量之下。

要求
  • 仅对保持目标容量的 EC2 队列(类型 maintain 的队列)支持运行状况检查替换,不支持类型为 requestinstant 的队列。

  • 仅对竞价型实例支持运行状况检查替换。对于 按需型实例 不支持此功能。

  • 您可以将 EC2 队列配置为仅在您创建它时替换运行状况不佳的实例。

  • 用户仅在其有权调用 ec2:DescribeInstanceStatus 操作时才能使用运行状况检查替换。

配置 EC2 实例集 以替换运行状况不佳的竞价型实例
  1. 按创建 EC2 队列 的步骤操作。有关更多信息,请参阅创建 EC2 队列

  2. 要将队列配置为替换运行状况不佳的 Spot 实例,请在 JSON 文件中,对于 ReplaceUnhealthyInstances 输入 true

生成 EC2 队列 JSON 配置文件

要查看 EC2 机群配置参数的完整列表,可以生成 JSON 文件。有关每个参数的说明,请参阅 Amazon CLI 命令参考中的 create-fleet

通过命令行使用所有可能的 EC2 队列参数生成 JSON 文件
  • 使用 create-fleet (Amazon 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 机群,您只需指定以下参数:

  • LaunchTemplateIdLaunchTemplateName – 指定要使用的启动模板(其中包含要启动的实例的参数,例如,实例类型、可用区以及您愿意支付的最高价)

  • TotalTargetCapacity – 指定机群的总目标容量

  • DefaultTargetCapacityType – 指定默认购买选项是按需型还是竞价型

您可以指定多个覆盖启动模板的启动规范。启动规范可以有不同的实例类型、可用区、子网和最高价,并且可以包含不同的权重容量。

如果不指定参数,机群将使用参数的默认值。

在 JSON 文件中指定机群参数。有关更多信息,请参阅生成 EC2 队列 JSON 配置文件

目前没有控制台支持创建 EC2 Fleet。

创建 EC2 实例集(Amazon CLI)
  • 使用 create-fleet (Amazon CLI) 命令创建 EC2 机群并指定包含机群配置参数的 JSON 文件。

aws ec2 create-fleet --cli-input-json file://file_name.json

有关示例配置文件,请参阅EC2 队列 示例配置

以下是 requestmaintain 类型的队列的示例输出。

{ "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 实例的卷。对于 requestmaintain 队列类型,您只能标记附加到按需实例的卷。

有关标签的工作原理的更多信息,请参阅标记 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/*" }

要提供访问权限,请为您的用户、组或角色添加权限:

标记新的 EC2 队列 请求

要在创建时标记 EC2 队列请求,请在用于创建该队列的 JSON 文件中指定键值对。ResourceType 的值必须为 fleet。如果指定其他值,队列请求失败。

标记 EC2 队列启动的实例和卷

要在队列启动实例和卷时标记它们,请在 EC2 队列请求中引用的启动模板中指定标签。

注意

您无法标记附加到 requestmaintain 队列类型启动的 Spot 实例的卷。

标记现有的 EC2 实例集请求、实例和卷(Amazon 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 机群 (Amazon 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 队列

您可以修改处于 submittedactive 状态的 EC2 队列。当您修改队列时,它会进入 modifying 状态。

您只能修改类型为 maintain 的EC2 队列。您不能修改类型为 requestinstant 的 EC2 队列。

您可以修改 EC2 队列的以下参数:

  • target-capacity-specification – 增加或减少 TotalTargetCapacityOnDemandTargetCapacitySpotTargetCapacity 的目标容量。

  • excess-capacity-termination-policy – 当 EC2 队列的总目标容量降到队列的当前大小以下时是否应终止正在运行的实例。有效值为 no-terminationtermination

如果提升目标容量,EC2 队列会根据为 DefaultTargetCapacityType 指定的实例购买选项(按需实例或 Spot 实例)启动额外的实例。

如果 DefaultTargetCapacityTypespot,EC2 队列会根据其分配策略启动额外的 Spot 实例。如果分配策略为 lowest-price,实例集将从请求中价格最低的 Spot 容量池启动实例。如果分配策略为 diversified,队列将在请求中的池间分配实例。

在减少目标容量时,EC2 队列会删除超过新目标容量的任何打开的请求。您可以请求 队列终止 实例,直到队列的大小达到新目标容量。如果分配策略是 lowest-price,则 队列会终止每单位价格最高的实例。如果分配策略是 diversified,则 队列会在池间终止实例。或者,您可以请求 EC2 实例集保持队列当前的队列大小,而不替换已中断的竞价型实例或者您手动终止的任何实例。

当 EC2 实例集因目标容量下降而终止某个竞价型实例时,该实例将收到一条竞价型实例中断通知。

修改 EC2 实例集(Amazon 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 队列,并会返回错误。对于类型为 maintainrequest 的队列,在单个请求中可删除的数量没有限制。

  • 单次删除 instant 队列的请求最多可终止 1000 个实例。

删除 EC2 实例集并终止其实例(Amazon 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 实例集而不终止其实例(Amazon 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": "*" } ] }