Amazon Elastic Compute Cloud
Windows 实例用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

竞价型队列请求

要使用竞价型队列,请创建一个竞价型队列请求,其中包括目标容量、实例的一个或多个启动说明以及您愿意支付的最高价。当出价发生更改时,Amazon EC2 将尝试维护您的竞价型队列的目标容量。有关更多信息,请参阅 竞价型队列工作原理

有两种类型的竞价型队列请求:requestmaintain。您可以创建竞价型队列,以针对所需容量提交一次性请求,或者要求其随着时间的推移保持目标容量。两种请求类型都可以使用竞价型队列的分配策略。

在发出一次性请求时,竞价型队列将提出所需的请求,但在容量减少时不会尝试补充竞价型实例。如果没有可用的容量,则竞价型队列不会在其他竞价池中提交请求。

为了保持目标容量,竞价型队列将提出请求以满足目标容量,并自动补充任何中断的实例。

提交一次性请求后,其目标容量则无法修改。要更改目标容量,请取消请求并重新提交新请求。

竞价型队列请求在过期或您取消它之前保持有效。取消竞价型队列请求时,您可以指定取消竞价型队列请求是否会终止您竞价型队列中的竞价型实例。

每个启动说明包括 Amazon EC2 启动实例所需的信息 – 如 AMI、实例类型、子网或可用区、一个或多个安全组。

竞价型队列请求状态

竞价型队列请求可以处于以下某种状态:

  • submitted – 正在评估竞价型队列请求,并且 Amazon EC2 正准备启动目标数量的竞价型实例。

  • active – 竞价型队列已经过验证,Amazon EC2 正尝试维持目标数量的正在运行的竞价型实例。请求会保持这一状态,直到其被修改或取消。

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

  • cancelled_running – 竞价型队列已取消且不会启动其他竞价型实例。其现有的竞价型实例将继续运行,直到其被中断或终止。请求会保持此状态,直到所有实例都已中断或终止。

  • cancelled_terminating – 竞价型队列已取消,且其 Spot 实例正在终止。请求会保持此状态,直到所有实例都已终止。

  • cancelled – 竞价型队列已取消,且没有正在运行的 Spot 实例。竞价型队列请求将在其实例终止两天后被删除。

以下显示了请求状态之间的转换。如果您超出竞价型队列限制,请求会立即取消。

 竞价型队列请求状态

竞价型队列先决条件

如果您使用 Amazon EC2 控制台创建竞价型队列,将创建一个名为 aws-ec2-spot-fleet-tagging-role 的角色,以便为竞价型队列授予代表您请求、启动、终止和标记实例的权限。创建竞价型队列请求时,选择此角色。如果您改用 AWS CLI 或 API,则必须确保此角色存在。您可以使用请求 Spot 实例向导 (角色在您前进到该向导的第二页时创建) 或使用 IAM 控制台,如下所示。

为竞价型队列创建 IAM 角色

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

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

  3. 选择 Create new role

  4. Select role type 页面上,选择 Amazon EC2 Spot Fleet Role 旁边的 Select

  5. Attach Policy 页面上,选择 AmazonEC2SpotFleetRole 策略,然后选择 Next Step

  6. Set role name and review 页面上,键入角色的名称 (例如,aws-ec2-spot-fleet-tagging-role),然后选择 Create role

  7. 要为竞价型队列授予自动标记其启动的实例的权限,请单击新角色所在的行,然后依次选择 Attach PolicyAmazonEC2SpotFleetTaggingRole 策略和 Attach Policy。选择 AmazonEC2SpotFleetRole 策略旁边的 Detach Policy

竞价型队列和 IAM 用户

如果您的 IAM 用户将创建或管理竞价型队列,请确保为它们授予所需的权限,如下所示。

授予 IAM 用户竞价型队列的权限

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

  2. 在导航窗格中选择 Policies,然后选择 Create policy

  3. Create Policy 页上,选择 Create Your Own Policy 旁的 Select

  4. Review Policy 页上,键入策略名称并将以下文本添加到 Policy Document

    { "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 操作以指定竞价型队列角色以及调用 iam:ListInstanceProfiles 操作以枚举现有实例配置文件的权限。

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

    • iam:AddRoleToInstanceProfile

    • iam:AttachRolePolicy

    • iam:CreateInstanceProfile

    • iam:CreateRole

    • iam:GetRole

    • iam:ListPolicies

  5. 选择 Create Policy

  6. 在导航窗格中,选择 Users,然后选择提交竞价型队列请求的用户。

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

  8. 选择直接附加现有策略。选择以上您创建的策略,选择 Next: Review,然后选择添加权限

竞价型队列运行状况检查

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

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

要求

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

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

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

计划竞价型队列请求

在创建竞价型队列请求前,请查看竞价最佳实践。使用这些最佳实践规划您的竞价型队列请求,以便以可能的最低价格预置需要的实例类型。还建议执行以下操作:

  • 确定您要创建的竞价型队列是针对所需目标容量提交一次性请求,还是随着时间推移维持目标容量。

  • 确定满足您的应用程序要求的实例类型。

  • 确定您的竞价型队列请求的目标容量。您可以采用实例或自定义单位设置目标容量。有关更多信息,请参阅 竞价型队列实例权重

  • 确定您的每单位价格 (如果使用实例权重)。要计算每单位价格,请将每实例小时价格除以该实例表示的单位数 (或权重)。(如果不使用实例权重,则默认每单位价格为每实例小时价格。)

  • 查看用于您的竞价型队列请求的可能选项。关于更多信息,请参阅 AWS CLI Command Reference 中的 request-spot-fleet 命令。有关其他示例,请参阅 竞价型队列示例配置

竞价型队列请求的服务相关角色

当您请求竞价型队列时,Amazon EC2 将创建一个服务相关角色。服务相关角色包含 Amazon EC2 代表您调用其他 AWS 服务所需的一切权限。有关更多信息,请参阅 IAM 用户指南 中的使用服务相关角色

Amazon EC2 使用名为 AWSServiceRoleForEC2SpotFleet 的服务相关角色完成以下操作:

  • ec2:RequestSpotInstances - 请求竞价型实例

  • ec2:TerminateInstances - 终止竞价型实例

  • ec2:DescribeImages - 描述竞价型实例的 Amazon 系统映像 (AMI)

  • ec2:DescribeInstanceStatus - 描述竞价型实例的状态

  • ec2:DescribeSubnets - 描述竞价型实例的子网

  • ec2:CreateTags - 向竞价型实例添加系统标签

当您请求竞价型队列时,Amazon EC2 还将创建 AWSServiceRoleForEC2Spot 角色。有关更多信息,请参阅 竞价型实例请求的服务相关角色

如果您在 2017 年 11 月前有一个活动的竞价型队列请求,当 Amazon EC2 开始支持此服务相关角色时,Amazon EC2 在您的 AWS 账户中创建了 AWSServiceRoleForEC2SpotFleet 角色。有关更多信息,请参阅 IAM 用户指南 中的我的账户中出现新角色

如果您不再需要使用竞价型队列,我们建议您删除 AWSServiceRoleForEC2SpotFleet 角色。当此角色从您的账户中删除后,如果您请求竞价型队列,Amazon EC2 将再次创建此角色。

创建竞价型队列请求

在创建竞价型队列请求时,您必须指定有关要启动的竞价型实例的信息,例如,实例类型以及您愿意支付的最高价。

使用控制台创建竞价型队列请求

  1. https://console.amazonaws.cn/ec2spot 处打开 Spot 控制台。

  2. 如果您是首次接触 Spot,则会看到一个欢迎页面;请选择 Get started。否则,请选择 Request Spot Instances

  3. 对于请求类型,请选择请求请求并保持

  4. 对于目标容量,请键入要请求的单位数。您可以选择实例或是对应用程序工作负载十分重要的性能特征 (如 vCPU、内存和存储)。如果请求类型是请求并保持,您可以指定目标容量 0 并以后添加容量。

  5. 对于要求,请执行以下操作:

    1. (可选) 对于启动模板,请选择一个启动模板。启动模板必须指定 Amazon 系统映像 (AMI),因为如果您指定启动模板,则不能使用 Spot 队列覆盖 AMI。

    2. 对于 AMI,选择由 AWS 提供的基础 Amazon 系统映像 (AMI) 之一,或者选择 Use custom AMI 以使用来自我们用户社区的 AMI、AWS Marketplace 或您自己的 AMI 之一。

    3. 对于 Instance type(s),选择 Select。选择具有您所需最低硬件规格的实例类型 (虚拟 CPU、内存和存储)。

    4. 对于 Network,您的账户可能支持 EC2-Classic 和 EC2-VPC 平台,或者仅支持 EC2-VPC 平台。要查明您的账户支持的平台,请参阅 支持的平台

      [现有 VPC] 选择 VPC。

      [新 VPC] 选择 Create new VPC 以前往 Amazon VPC 控制台。完成之后,请返回向导并刷新列表。

      [EC2-Classic] 选择 EC2-Classic

    5. (可选) 对于 Availability Zones,默认由 AWS 为您的竞价型实例选择可用区。如果希望,您可以指定特定可用区。

      [EC2-VPC] 选择一个或多个可用区。如果您在一个可用区中有多个子网,则请从 Subnet 中选择合适的子网。要添加子网,请选择 Create new subnet 以前往 Amazon VPC 控制台。完成之后,请返回向导并刷新列表。

      [EC2-Classic] 选择 Select specific zone/subnet,然后选择一个或多个可用区。

    6. (可选) 要添加存储,请根据实例类型指定实例存储卷或 EBS 卷。您还可以启用 EBS 优化。

    7. (可选) 默认情况下,已为您的实例启用基本监控。要启用详细监控,请选择 Enable CloudWatch detailed monitoring

    8. (可选) 要替换 Request and Maintain 竞价型队列中运行状况不佳的实例,请选择 Replace unhealthy instances

    9. (可选) 要运行专用竞价型实例,对于 Tenancy,请选择 Dedicated - run a dedicated instance

    10. (可选) 默认情况下,在竞价型实例中断时,竞价服务将终止这些实例。如果队列类型为 maintain,您可以指定在竞价型实例中断时竞价服务休眠或停止这些实例。为此,请从中断行为中选择相应的选项。

    11. 对于 Security groups,选择一个或多个安全组。

    12. [EC2-VPC] 如果需要连接到 VPC 中您的实例,请启用 Auto-assign IPv4 Public IP

    13. (可选) 如果您需要连接到您的实例,请使用 Key pair name 指定您的密钥对。

    14. (可选) 要使用 IAM 角色启动您的竞价型实例,请为 IAM instance profile 选择该角色。

    15. (可选) 要运行启动脚本,请将其复制到 User data

    16. (可选) 要添加标签,请选择 Add new tag,然后键入该标签的键和值。对每个标签重复此操作。

  6. 对于 Spot 请求完成,请执行以下操作:

    1. 对于 Allocation strategy,选择满足您的需求的策略。有关更多信息,请参阅 竞价型队列分配策略

    2. 对于最高价,您可以使用默认最高价 (按需价格),也可以指定您愿意支付的最高价。如果您的最高价低于选定的实例类型的现货价格,则不会启动您的竞价型实例。

    3. (可选) 要创建仅在特定时间段内有效的请求,请编辑请求有效起始时间请求有效截止时间

    4. (可选) 默认情况下,我们会在请求过期时终止您的竞价型实例。要维持实例在请求过期之后继续运行,请清除 Terminate instances at expiration

  7. (可选) 要在负载均衡器中注册您的竞价型实例,请选择 Receive traffic from one or more load balancers,然后选择一个或多个 传统负载均衡器 或目标组。

  8. (可选) 要下载一个启动配置副本以用于 AWS CLI,请选择 JSON 配置

  9. 选择 Launch

    请求类型为 fleet。执行请求后,系统会添加请求类型 instance,此时其状态为 activefulfilled

使用 AWS CLI 创建竞价型队列请求

aws ec2 request-spot-fleet --spot-fleet-request-config file://config.json

有关示例配置文件,请参阅竞价型队列示例配置

下面是示例输出:

{ "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE" }

监控竞价型队列

在您的最高价超过现货价格并具有可用的容量时,竞价型队列将启动竞价型实例。竞价型实例将一直运行,直到这些实例中断,或者您终止这些实例。

使用控制台监控您的竞价型队列

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中,请选择 Spot Requests

  3. 选择您的竞价型队列请求。配置详细信息在 Description 选项卡中提供。

  4. 要列出竞价型队列的竞价型实例,请选择 Instances 选项卡。

  5. 要查看竞价型队列的历史记录,请选择 History 选项卡。

使用 AWS CLI 监控您的竞价型队列

使用以下 describe-spot-fleet-requests 命令可描述竞价型队列请求:

aws ec2 describe-spot-fleet-requests

使用以下 describe-spot-fleet-instances 命令可描述指定竞价型队列的竞价型实例:

aws ec2 describe-spot-fleet-instances --spot-fleet-request-id sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE

使用以下 describe-spot-fleet-request-history 命令可描述指定竞价型队列请求的历史记录:

aws ec2 describe-spot-fleet-request-history --spot-fleet-request-id sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE --start-time 2015-05-18T00:00:00Z

修改竞价型队列请求

您可以修改活动的竞价型队列请求以完成以下任务:

  • 提升目标容量

  • 减少目标容量

注意

无法修改一次性竞价型队列请求。

当您提升目标容量时,竞价型队列会根据其竞价型队列请求的分配策略来启动额外的 Spot 实例。如果分配策略是 lowestPrice,则竞价型队列从竞价型队列请求中价格最低的竞价型实例池启动实例。如果分配策略是 diversified,则竞价型队列在竞价型队列请求中的池间分配实例。

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

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

使用控制台修改竞价型队列请求

  1. https://console.amazonaws.cn/ec2spot/home/fleet 处打开 Spot 控制台。

  2. 选择您的竞价型队列请求。

  3. 选择 Actions,然后选择 Modify target capacity

  4. Modify target capacity 中,执行以下操作:

    1. 输入新的目标容量。

    2. (可选) 如果您要减少目标容量,但是要使队列保持其当前大小,请取消选择 Terminate instances

    3. 选择 Submit

使用 AWS CLI 修改竞价型队列请求

使用以下 modify-spot-fleet-request 命令可更新指定竞价型队列请求的目标容量:

aws ec2 modify-spot-fleet-request --spot-fleet-request-id sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE --target-capacity 20

您可以按如下所示修改前面的命令,以减少指定竞价型队列的目标容量而不因此终止任何竞价型实例:

aws ec2 modify-spot-fleet-request --spot-fleet-request-id sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE --target-capacity 10 --excess-capacity-termination-policy NoTermination

取消竞价型队列请求

在使用完竞价型队列后,可以取消竞价型队列请求。这将取消与竞价型队列关联的所有竞价请求,从而不会为您的竞价型队列启动任何新的 Spot 实例。您必须指定竞价型队列是否应终止其竞价型实例。如果您终止实例,则竞价型队列请求将进入 cancelled_terminating 状态。否则,Spot 队列请求将进入 cancelled_running 状态,并且实例将继续运行直至它们中断或您手动终止它们。

使用控制台取消竞价型队列请求

  1. https://console.amazonaws.cn/ec2spot/home/fleet 处打开 Spot 控制台。

  2. 选择您的竞价型队列请求。

  3. 选择 Actions,然后选择 Cancel spot request

  4. Cancel spot request 中,确认是否要取消 Spot 队列。要使队列保持其当前大小,请取消选择 Terminate instances。如果准备就绪,请选择 Confirm

使用 AWS CLI 取消竞价型队列请求

使用以下 cancel-spot-fleet-requests 命令可取消指定 Spot 队列请求并终止实例:

aws ec2 cancel-spot-fleet-requests --spot-fleet-request-ids sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE --terminate-instances

下面是示例输出:

{ "SuccessfulFleetRequests": [ { "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", "CurrentSpotFleetRequestState": "cancelled_terminating", "PreviousSpotFleetRequestState": "active" } ], "UnsuccessfulFleetRequests": [] }

可以按如下所示修改前面的命令,以取消指定的竞价型队列请求而不终止实例:

aws ec2 cancel-spot-fleet-requests --spot-fleet-request-ids sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE --no-terminate-instances

下面是示例输出:

{ "SuccessfulFleetRequests": [ { "SpotFleetRequestId": "sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE", "CurrentSpotFleetRequestState": "cancelled_running", "PreviousSpotFleetRequestState": "active" } ], "UnsuccessfulFleetRequests": [] }