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

Spot 实例请求

要使用 Spot 实例,您需要创建 Spot 实例请求,其中包括实例数量、实例类型、可用区以及您愿意为每小时实例使用时间支付的最高价。如果具有可用的容量,并且您的最高价超过当前 Spot 价格,Amazon EC2 将立即完成您的请求。否则,Amazon EC2 将等待直至可以完成您的请求,或者直至您取消请求。

以下演示了 Spot 请求的运行方式。请注意,为Spot 实例中断执行的操作取决于请求类型 (一次性还是持久性) 和中断行为 (休眠、停止或终止)。如果请求是持久性请求,则在Spot 实例中断之后将重新打开请求。

 Spot 生命周期

Spot 实例请求状态

Spot 实例请求可以处于以下某种状态:

  • open – 请求正在等待执行。

  • active — 请求已执行并有关联的 Spot 实例。

  • failed – 请求的一个或多个参数错误。

  • closed – Spot 实例被中断或终止。

  • cancelled – 您取消了请求,或者请求已过期。

以下显示了请求状态之间的转换。请注意,转换取决于请求类型 (一次性还是持久性)。

  Spot 请求状态

一次性Spot 实例请求在 Amazon EC2 启动Spot 实例、请求过期前或者您取消请求前保持有效。如果 Spot 价格超过您的最高价或容量不可用,将终止您的Spot 实例并关闭Spot 实例请求。

持久性Spot 实例请求在过期或您取消它之前保持有效,即使该请求已完成也如此。如果 Spot 价格超过您的最高价或没有可用的容量,您的Spot 实例将会中断。在您的实例中断后,在最高价超过 Spot 价格或再次具有可用的容量时,将会启动Spot 实例 (如果已停止),恢复Spot 实例 (如果已休眠),或者再次打开Spot 实例请求,并且 Amazon EC2 启动新的Spot 实例 (如果已终止)。

您可以跟踪 Spot 实例请求的状态以及通过该状态启动的 Spot 实例的状态。有关更多信息,请参阅 Spot 请求状态

指定 Spot 实例的持续时间

当 Spot 价格发生更改时,Amazon EC2 不会终止带有指定持续时间的 Spot 实例 (也称为 Spot 限制)。这使得此实例非常适合需在有限时间内完成的任务,如批处理、编码和渲染、建模和分析以及连续集成。

您可将持续时间指定为 1、2、3、4、5 或 6 小时。您支付的价格取决于指定的持续时间。要查看 1 小时持续时间或 6 小时持续时间的当前价格,请参阅 Spot 实例 价格。您可使用这些价格来估计 2、3、4 和 5 小时持续时间的费用。在完成带持续时间的请求时,您的Spot 实例的价格是固定的,而且此价格在实例终止前保持有效。您需要按照此价格为实例运行的每个小时或不足一小时支付费用。未满 1 小时的实例小时,将按 1 小时计费。

在您的 Spot 请求中指定持续时间时,每个 Spot 实例的持续时间段将在该实例收到其实例 ID 后立即开始。Spot 实例将运行,直到您终止它或其持续时间段结束。在持续时间段结束后,Amazon EC2 将Spot 实例标记为终止并提供一个Spot 实例终止通知,这将在实例终止前为其提供两分钟时间的警告。

使用控制台启动具有指定持续时间的 Spot 实例

选择合适的请求类型。有关更多信息,请参阅 创建Spot 实例请求

使用 AWS CLI 启动具有指定持续时间的 Spot 实例

要为 Spot 实例指定持续时间,请在 request-spot-instances 命令中包含 --block-duration-minutes 选项。例如,下面的命令创建一个 Spot 请求,用于启动运行时间为两小时的 Spot 实例:

aws ec2 request-spot-instances --instance-count 5 --block-duration-minutes 120 --type "one-time" --launch-specification file://specification.json

使用 AWS CLI 检索带指定持续时间的 Spot 实例的费用

使用 describe-spot-instance-requests 命令可检索带指定持续时间的 Spot 实例的固定费用。该信息位于 actualBlockHourlyPrice 字段中。

指定 Spot 实例的租期

您可以在单租户硬件上运行Spot 实例。专用 Spot 实例与属于其他 AWS 账户的实例物理隔离。有关更多信息,请参阅专用实例Amazon EC2 专用实例产品页面。

要运行专用Spot 实例,请执行以下操作之一:

  • 在创建Spot 实例请求时,指定租赁 dedicated。有关更多信息,请参阅 创建Spot 实例请求

  • 请求 VPC 中实例租赁为 dedicated 的Spot 实例。有关更多信息,请参阅 创建有专用实例租期的 VPC。如果您在 VPC 中请求实例租赁为 dedicated 的Spot 实例,则无法请求租赁为 default 的Spot 实例。

以下实例类型支持专用 Spot 实例。

最新一代

  • c4.8xlarge

  • d2.8xlarge

  • i3.16xlarge

  • m4.10xlarge

  • m4.16xlarge

  • p2.16xlarge

  • r4.16xlarge

  • x1.32xlarge

上一代

  • c3.8xlarge

  • cc2.8xlarge

  • cr1.8xlarge

  • g2.8xlarge

  • i2.8xlarge

  • r3.8xlarge

Spot 实例请求的服务相关角色

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

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

  • ec2:DescribeInstances - 描述 Spot 实例

  • ec2:StopInstances - 停止 Spot 实例

  • ec2:StartInstances - 启动 Spot 实例

如果为 Spot 实例指定加密 EBS 快照,并使用客户托管的 CMK 进行加密,则必须为 AWSServiceRoleForEC2Spot 角色授予对这些 CMK 的访问权限,以便让 Amazon EC2 代表您启动 Spot 实例。委托人是 AWSServiceRoleForEC2Spot 角色的 Amazon 资源名称 (ARN)。有关更多信息,请参阅在 AWS KMS 中使用密钥策略

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

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

创建 IAM 角色

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

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

  3. 选择 Create role

  4. Select type of trusted entity (选择可信实体的类型) 页面上,依次选择 EC2EC2 - Spot Instances (EC2 - Spot 实例)Next: Permissions (下一步:权限)

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

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

如果不再需要使用 Spot 实例,建议删除 AWSServiceRoleForEC2Spot 角色。从账户中删除该角色后,如果请求 Spot 实例,Amazon EC2 将再次创建该角色。

创建Spot 实例请求

请求Spot 实例的过程与启动个按需实例的过程相似。在提交 Spot 请求后,您无法更改请求的参数,包括您的最高价。

如果一次请求多个 Spot 实例,Amazon EC2 将创建单独的 Spot 实例请求,这样可以分别跟踪各个请求的状态。有关跟踪 Spot 请求的更多信息,请参阅Spot 请求状态

先决条件

在开始之前,请确定最高价、所需的 Spot 实例数以及要使用的实例类型。要查看 Spot 价格趋势,请参阅 Spot 实例定价历史记录

使用控制台创建Spot 实例请求

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

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

  3. 如果是首次接触 Spot 实例,会看到一个欢迎页面;请选择试用。否则,请选择请求 Spot 实例

  4. 对于 Request type,默认值为 Request,它指定使用Spot 队列创建的一次性 Spot 请求。要使用 Spot 限制,请选择预留持续时间,然后选择完成工作所需的小时数。

    如果您更喜欢使用 Request and Maintain,请参阅创建Spot 队列请求

  5. 对于 Target capacity,输入要请求的单位数量。您可以选择实例或是对应用程序工作负载十分重要的性能特征 (如 vCPU、内存和存储)。

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

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

    2. 对于 AMI,选择 AWS 提供的基本 AMI 之一,或者选择 Use custom AMI 以指定您自己的 AMI。

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

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

      [现有 VPC] 选择 VPC。

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

      [EC2-Classic] 选择 EC2-Classic

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

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

      [EC2-Classic] 选择 Select specific zone/subnet (选择特定区域/子网),然后选择一个或多个可用区。

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

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

    8. (可选) 要运行专用 Spot 实例,对于租赁,请选择专用 - 运行专用实例

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

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

    11. (可选) 要连接到您的实例,请为密钥对名称指定您的密钥对。

    12. (可选) 要使用 IAM 角色启动 Spot 实例,对于 IAM 实例配置文件,请指定该角色。

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

    14. [Spot 队列] 要添加标签,请选择 Add new tag,然后键入该标签的键和值。对每个标签重复此操作。

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

    1. [Spot 队列] 对于 Allocation strategy,选择满足您的需求的策略。有关更多信息,请参阅 Spot 实例分配策略

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

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

    4. [Spot 队列] 默认情况下,我们会在请求过期时终止 Spot 实例。要维持实例在请求过期之后继续运行,请清除 Terminate instances at expiration

  8. (可选) 要向负载均衡器注册Spot 实例,请选择从一个或多个负载均衡器接收流量,然后选择一个或多个 Classic Load Balancer 或目标组。

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

  10. 选择 Launch

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

    [Spot 型限制] 请求类型为 block,且初始状态为 open。执行请求后,状态为 activefulfilled

使用 AWS CLI 创建Spot 实例请求

使用以下 request-spot-instances 命令可创建一次性请求:

aws ec2 request-spot-instances --instance-count 5 --type "one-time" --launch-specification file://specification.json

使用以下 request-spot-instances 命令可创建持久性请求:

aws ec2 request-spot-instances --instance-count 5 --type "persistent" --launch-specification file://specification.json

有关要用于这些命令的启动规范文件的示例,请参阅Spot 请求示例启动说明。如果您从控制台下载启动说明文件,必须改为使用 request-spot-fleet 命令 (控制台使用Spot 队列指定 Spot 请求)。

在最高价超过 Spot 价格并具有可用的容量时,Amazon EC2 将启动您的Spot 实例。Spot 实例将一直运行,直到该实例中断,或者您自行终止该实例。使用以下 describe-spot-instance-requests 命令可监控您的Spot 实例请求:

aws ec2 describe-spot-instance-requests --spot-instance-request-ids sir-08b93456

查找正在运行的 Spot 实例

在最高价超过 Spot 价格并具有可用的容量时,Amazon EC2 将启动Spot 实例。Spot 实例将一直运行,直到该实例中断,或者您自行终止该实例。如果您的最高价与 Spot 价格完全相同,根据需求情况,您的Spot 实例可能会保持运行状态。

使用控制台查找正在运行的 Spot 实例

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

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

    您可以看到Spot 实例请求和Spot 队列请求。如果Spot 实例请求已执行,那么 Capacity 就是Spot 实例的 ID。对于Spot 队列,Capacity 表示已执行的请求容量。要查看Spot 队列中的实例的 ID,请选择扩展箭头,或者选择队列,然后选择 Instances 选项卡。

  3. 或者,在导航窗格中,选择 Instances。在右上角,选择 Show/Hide 图标,然后选择 Lifecycle。对于每个实例,Lifecyclenormalspotscheduled

使用 AWS CLI 查找正在运行的 Spot 实例

要枚举 Spot 实例,请在 describe-spot-instance-requests 命令中使用 --query 选项,如下所示:

aws ec2 describe-spot-instance-requests --query SpotInstanceRequests[*].{ID:InstanceId}

下面是示例输出:

[ { "ID": "i-1234567890abcdef0" }, { "ID": "i-0598c7d356eba48d7" } ]

或者,在 describe-instances 命令中使用 --filters 选项来枚举 Spot 实例,如下所示:

aws ec2 describe-instances --filters "Name=instance-lifecycle,Values=spot"

标记Spot 实例请求

要对您的Spot 实例请求进行分类和管理,您使用您选择的元数据为它们做标记。有关更多信息,请参阅 标记您的 Amazon EC2 资源

您可以在创建Spot 实例请求之后为其分配标签。您为Spot 实例请求创建的标签只适用于该请求。这些标签不会自动添加到 Spot 服务为完成请求所启动的Spot 实例中。在 Spot 实例 启动后,您必须自己将标签添加到 Spot 实例。

使用 AWS CLI 向您的Spot 实例请求或Spot 实例添加标签

使用以下 create-tags 命令标记您的资源:

aws ec2 create-tags --resources sir-08b93456 i-1234567890abcdef0 --tags Key=purpose,Value=test

取消Spot 实例请求

如果您不再需要 Spot 请求,您可以将其取消。您只能取消 openactive 的 Spot 实例请求。当您的请求未执行,且实例没有启动时,您的 Spot 请求处于 open 状态。请求完成因而 Spot 实例已启动时,Spot 请求处于 active 状态。如果您的 Spot 请求 active 并且具有关联的运行中Spot 实例,则取消此请求不会自动终止该实例;您必须手动终止该运行的Spot 实例。

如果 Spot 请求是持久性 Spot 请求,则会返回 open 状态,这样就可以启动新的Spot 实例。要取消持久性 Spot 请求并终止其 Spot 实例,必须先取消 Spot 请求,然后终止 Spot 实例。否则,Spot 请求可以启动新实例。

使用控制台取消Spot 实例请求

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

  2. 在导航窗格中,请选择 Spot Requests,然后选择 Spot 请求。

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

  4. (可选) 如果不再使用关联的 Spot 实例,可以将其终止。在导航窗格中,请选择 Instances 并选择实例,然后依次选择 ActionsInstance StateTerminate

使用 AWS CLI 取消Spot 实例请求

使用以下 cancel-spot-instance-requests 命令可取消指定的 Spot 请求:

aws ec2 cancel-spot-instance-requests --spot-instance-request-ids sir-08b93456

如果不再使用关联的 Spot 实例,可使用以下 terminate-instances 命令手动将其终止:

aws ec2 terminate-instances --instance-ids i-1234567890abcdef0 i-0598c7d356eba48d7