Amazon Elastic Compute Cloud
Windows 实例用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

管理 EC2 队列

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

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

EC2 队列请求在过期或您删除它之前一直有效。在您删除队列时,可以指定删除队列是否会终止您该队列中的实例。

EC2 队列请求状态

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

  • submitted - 正在评估 EC2 队列请求,并且 Amazon EC2 正准备启动目标数量的实例,其中包括按需实例和/或 Spot 实例。

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

  • modifying – 正在修改 EC2 队列请求。请求会保持这一状态,直到修改全部完成或请求被删除。无法修改一次性 request,并且这一状态不适用于此类 请求。

  • deleted_running – EC2 队列请求已删除且不启动其他实例。现有实例将继续运行,直至被中断或终止。请求会保持此状态,直到所有实例都已中断或终止。

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

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

以下显示了 EC2 队列请求状态之间的转换。如果您超出队列限制,请求会立即被删除。

 EC2 队列请求状态

EC2 队列先决条件

要创建 EC2 队列,必须满足以下先决条件。

启动模板

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

用于 EC2 队列的服务相关角色

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

  • ec2:RequestSpotInstances – 请求 Spot 实例。

  • ec2:TerminateInstances – 终止 Spot 实例。

  • ec2:DescribeImages – 描述 Spot 实例的 Amazon Machine Images (AMI)。

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

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

  • ec2:CreateTags - 向 Spot 实例添加系统标签。

确保此角色存在,然后才使用 AWS CLI 或 API 来创建 EC2 队列。要创建该角色,请如下使用 IAM 控制台。

为 EC2 队列创建 IAM 角色

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在导航窗格中,选择 Roles

  3. 选择 Create role

  4. Select type of trusted entity (选择受信任实体的类型) 页面上,选择 EC2 – Fleet (EC2 – 机群),然后选择 Next: Permissions (下一步:权限)

  5. 在下一页上,选择 Next:Review(下一步:审核)

  6. Review (审核) 页面上,选择 Create role (创建角色)

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

EC2 队列和 IAM 用户

如果您的 IAM 用户将创建或管理 EC2 队列,请确保授予其所需的权限,如下所示。

向 IAM 用户授予 EC2 队列权限

  1. 通过以下网址打开 IAM 控制台:https://console.amazonaws.cn/iam/

  2. 在导航窗格中,选择 Policies

  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": "*" } ] }

    ec2:* 向 IAM 用户授予调用所有 Amazon EC2 API 操作的权限。要将用户限制到特定 Amazon EC2 API 操作,请改为指定这些操作。

    IAM 用户必须具有调用 iam:ListRoles 操作以枚举现有 IAM 角色、调用 iam:PassRole 操作以指定 EC2 队列角色以及调用 iam:ListInstanceProfiles 操作以枚举现有实例配置文件的权限。

    (可选) 要使 IAM 用户能够使用 IAM 控制台创建角色或实例配置文件,您必须向该策略添加以下操作:

    • iam:AddRoleToInstanceProfile

    • iam:AttachRolePolicy

    • iam:CreateInstanceProfile

    • iam:CreateRole

    • iam:GetRole

    • iam:ListPolicies

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

  6. 在导航窗格中,选择用户 (Users),然后选择相应用户。

  7. 权限选项卡中,请选择添加权限

  8. 选择直接附加现有策略。选择之前创建的策略,然后选择下一步:查看 (Next: Review)

  9. 选择 Add permissions

EC2 队列运行状况检查

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

您可以配置 EC2 队列以替换运行状况不佳的实例。在启用运行状况检查替换后,实例将在其运行状况报告为 unhealthy 后被替换。在替换运行状况不佳的实例时,队列的容量可能在几分钟内降至其目标容量之下。

要求

  • 仅保持目标容量的 EC2 队列 (而非一次性队列) 支持运行状况检查替换。

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

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

生成 EC2 队列 JSON 配置文件

要创建 EC2 队列,只需指定启动模板、目标容量以及默认购买模式是按需还是 Spot。如果不指定参数,队列将使用默认值。要查看队列配置参数的完整列表,可以按以下操作生成 JSON 文件。

通过命令行使用所有可能的 EC2 队列参数生成 JSON 文件

  • 使用 create-fleet (AWS CLI) 命令和 --generate-cli-skeleton 参数生成 EC2 队列 JSON 文件:

    aws ec2 create-fleet --generate-cli-skeleton

    可用 EC2 队列参数如下:

    { "DryRun": true, "ClientToken": "", "SpotOptions": { "AllocationStrategy": "lowestPrice", "InstanceInterruptionBehavior": "hibernate", "InstancePoolsToUseCount": 0 }, "OnDemandOptions": { "AllocationStrategy": "prioritized" }, "ExcessCapacityTerminationPolicy": "termination", "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "LaunchTemplateId": "", "LaunchTemplateName": "", "Version": "" }, "Overrides": [ { "InstanceType": "t2.micro", "MaxPrice": "", "SubnetId": "", "AvailabilityZone": "", "WeightedCapacity": null, "Priority": null } ] } ], "TargetCapacitySpecification": { "TotalTargetCapacity": 0, "OnDemandTargetCapacity": 0, "SpotTargetCapacity": 0, "DefaultTargetCapacityType": "spot" }, "TerminateInstancesWithExpiration": true, "Type": "maintain", "ValidFrom": "1970-01-01T00:00:00", "ValidUntil": "1970-01-01T00:00:00", "ReplaceUnhealthyInstances": true, "TagSpecifications": [ { "ResourceType": "fleet", "Tags": [ { "Key": "", "Value": "" } ] } ] }

EC2 队列 JSON 配置文件参考

注意

请对所有参数值使用小写形式;否则,当 Amazon EC2 使用 JSON 文件启动 EC2 队列时您会收到错误消息。

AllocationStrategy(适用于 SpotOptions)

(可选) 指示如何跨您在 EC2 队列中指定的 Spot 实例池分配 Spot 实例目标容量。有效值为 lowestPricediversified。默认为 lowestPrice。请指定满足您的需求的分配策略。有关更多信息,请参阅 Spot 实例分配策略

InstanceInterruptionBehavior

(可选) Spot 实例中断时的行为。有效值包括 hibernatestopterminate。默认情况下,在 Spot 实例中断时,Spot 服务终止这些实例。如果队列类型为 maintain,则可以指定在 Spot 实例中断时 Spot 服务休眠或停止这些实例。

InstancePoolsToUseCount

在其中分配您的目标 Spot 容量的 Spot 池数量。仅当 Spot AllocationStrategy 设置为 lowestPrice 时有效。EC2 队列 选择成本最低的池并在您指定数量的 Spot 池之间均匀分配目标 Spot 容量。

AllocationStrategy(适用于 OnDemandOptions)

在满足按需容量时使用的启动模板覆盖的顺序。如果您指定 lowestPrice,EC2 队列 使用价格来确定顺序,价格最低的首先启动。如果您指定优先级,EC2 队列 使用您分配到各个启动模板覆盖的优先级,最高优先级的首先启动。如果您不指定值,EC2 队列 默认为 lowestPrice

ExcessCapacityTerminationPolicy

(可选) 指示当 EC2 队列的总目标容量降到 EC2 队列的当前大小以下时,是否应终止正在运行的实例。有效值为 no-terminationtermination

LaunchTemplateId

要使用的启动模板的 ID。您必须指定启动模板 ID 或启动模板名称。启动模板必须指定 Amazon 系统映像 (AMI)。有关创建启动模板的更多信息,请参阅通过启动模板启动实例

LaunchTemplateName

要使用的启动模板的名称。您必须指定启动模板 ID 或启动模板名称。启动模板必须指定 Amazon 系统映像 (AMI)。有关更多信息,请参阅 通过启动模板启动实例

版本

启动模板的版本号。

InstanceType

(可选) 实例类型。如果输入,此值将覆盖启动模板。实例类型必须具有您所需的最低硬件规格 (vCPU、内存或存储)。

MaxPrice

(可选) 您愿意为 Spot 实例支付的每单位小时的最高价。如果输入,此值将覆盖启动模板。您可以使用默认最高价 (按需价格),也可以指定您愿意支付的最高价。如果最高价低于指定的实例类型的 Spot 价格,则不会启动 Spot 实例。

SubnetId

(可选) 要在其中启动实例的子网的 ID。如果输入,此值将覆盖启动模板。您的账户可支持 EC2-Classic 和 EC2-VPC 平台,或者仅支持 EC2-VPC 平台。要查明您的账户支持的平台,请参阅 支持的平台

[新 VPC] 要创建新 VPC,请前往 Amazon VPC 控制台。完成操作后,请返回 JSON 文件并输入新子网 ID。

可用区

(可选) 要在其中启动实例的可用区。默认为由 AWS 为您的实例选择可用区。如果愿意,您可以指定特定可用区。如果输入,此值将覆盖启动模板。

[EC2-VPC] 指定一个或多个可用区。如果您在一个可用区中有多个子网,请指定合适的子网。要添加子网,请转至 Amazon VPC 控制台。完成操作后,请返回 JSON 文件并输入新子网 ID。

WeightedCapacity

(可选) 指定实例类型提供的单位数量。如果输入,此值将覆盖启动模板。

Priority

启动模板覆盖的优先级。如果 AllocationStrategy 设置为 prioritized,EC2 队列 使用优先级来确定首先使用哪个启动模板覆盖来满足按需容量。优先级最高的首先启动。有效值为从 0 开始的整数。数字越小,优先级越高。如果未设置数字,覆盖具有最低的优先级。

TotalTargetCapacity

要启动的实例数量。您可以选择实例或是对应用程序工作负载十分重要的性能特征 (如 vCPU、内存或存储)。如果请求类型为 maintain,您可以指定目标容量 0 并以后添加容量。

OnDemandTargetCapacity

(可选) 要启动的按需实例的数量。此数字必须小于 TotalTargetCapacity

SpotTargetCapacity

(可选) 要启动的 Spot 实例的数量。此数字必须小于 TotalTargetCapacity

DefaultTargetCapacityType

如果 TotalTargetCapacity 的值高于 OnDemandTargetCapacitySpotTargetCapacity 的组合值,则以此处指定的实例购买模式启动差值。有效值为 on-demandspot

TerminateInstancesWithExpiration

(可选) 默认情况下,Amazon EC2 会在 EC2 队列请求过期时终止您的实例。默认值为 true。要保持这些实例在请求过期后继续运行,请不要为此参数输入值。

类型

(可选) 指示 EC2 队列是只请求目标容量还是也尝试保留它。有效值为 maintainrequest。默认值为 maintain。如果值为 request,EC2 队列将提出所需的请求。在容量减少时不会尝试补充实例,在容量不可用时也不会在其他容量池中提交请求。如果值为 maintain,队列会提出请求以满足目标容量要求。它还会自动补充任何中断的 Spot 实例。

ValidFrom

(可选) 要创建仅在特定时段内有效的请求,请输入开始日期。

ValidUntil

(可选) 要创建仅在特定时段内有效的请求,请输入结束日期。

ReplaceUnhealthyInstances

(可选) 要替换配置为 maintain 的 EC2 队列中运行状况不佳的实例,请输入 true。否则,请将此参数留空。

TagSpecifications

(可选) 创建时标记 EC2 队列 请求的键-值对。ResourceType 的值必须为 fleet,否则队列请求失败。要在启动时标记实例,请在启动模板中指定标记。有关启动后标记的信息,请参阅 标记您的成员资源

创建 EC2 队列

在创建 EC2 队列时,您必须指定启动模板,其中包含要启动的实例的有关信息,例如,实例类型、可用区以及您愿意支付的最高价。

您可以创建一个 EC2 队列,其中包含多个覆盖启动模板的启动说明。启动说明可以有不同的实例类型、可用区、子网和最高价,并且可以包含不同的权重容量。

在创建 EC2 队列时,可以使用 JSON 文件指定要启动的实例的有关信息。有关更多信息,请参阅 EC2 队列 JSON 配置文件参考

使用 AWS CLI 创建 EC2 队列

  • 使用下面的 create-fleet (AWS CLI) 命令可创建 EC2 队列:

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

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

下面是示例输出:

{ "FleetId": "fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE" }

标记 EC2 队列

要对您的 EC2 队列 请求进行分类和管理,您可使用自定义元数据为它们做标记。有关更多信息,请参阅 标记您的 Amazon EC2 资源

您可以在创建 EC2 队列 请求时或之后为其分配标签。分配给队列请求的标签未分配给队列启动的实例。

要标记新的 EC2 队列请求

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

要标记 EC2 队列 启动的实例

要在通过队列启动实例时标记实例,请在 EC2 队列 请求中引用的启动模板中指定标记。

要使用 AWS CLI 标记现有 EC2 队列 请求和实例

使用以下 create-tags 命令标记现有资源:

aws ec2 create-tags --resources fleet-12a34b55-67cd-8ef9-ba9b-9208dEXAMPLE i-1234567890abcdef0 --tags Key=purpose,Value=test

监控 EC2 队列

EC2 队列在有可用容量时启动按需实例,在最高价超过 Spot 价格并且有可用容量时启动 Spot 实例。按需实例持续运行至将其终止,Spot 实例持续运行至遇到中断或将其终止。

正在运行的实例的返回列表将定期刷新,或可能过时。

使用 AWS CLI 监控 EC2 队列

使用下面的 describe-fleets 命令可描述 EC2 队列:

aws ec2 describe-fleets

下面是示例输出:

{ "Fleets": [ { "Type": "maintain", "FulfilledCapacity": 2.0, "LaunchTemplateConfigs": [ { "LaunchTemplateSpecification": { "Version": "2", "LaunchTemplateId": "lt-07b3bc7625cdab851" } } ], "TerminateInstancesWithExpiration": false, "TargetCapacitySpecification": { "OnDemandTargetCapacity": 0, "SpotTargetCapacity": 2, "TotalTargetCapacity": 2, "DefaultTargetCapacityType": "spot" }, "FulfilledOnDemandCapacity": 0.0, "ActivityStatus": "fulfilled", "FleetId": "fleet-76e13e99-01ef-4bd6-ba9b-9208de883e7f", "ReplaceUnhealthyInstances": false, "SpotOptions": { "InstanceInterruptionBehavior": "terminate", "InstancePoolsToUseCount": 1, "AllocationStrategy": "lowestPrice" }, "FleetState": "active", "ExcessCapacityTerminationPolicy": "termination", "CreateTime": "2018-04-10T16:46:03.000Z" } ] }

使用下面的 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-request-id fleet-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE --start-time 2018-04-10T00:00:00Z
{ "HistoryRecords": [], "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 状态。

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

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

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

注意

您只能修改 Type=maintain 的 EC2 队列。

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

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

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

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

使用 AWS CLI 修改 EC2 队列

使用下面的 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 状态,并且实例会继续运行,直到遇到中断或您手动将其终止。

使用 AWS CLI 删除 EC2 队列

使用 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" } ] }

可以使用 --no-terminate-instances 参数修改上面的命令以删除指定的 EC2 队列而不终止实例:

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" } ] }