Amazon Elastic Compute Cloud
用户指南(适用于 Linux 实例)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 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 型限制)的 Spot 实例 不会中断并且会在您选择的持续时间内连续运行。这使得此实例非常适合需在有限时间内完成的任务,如批处理、编码和渲染、建模和分析以及连续集成。

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

在您的 Spot 请求中指定持续时间时,每个 Spot 实例 实例的持续时间段将在该实例收到其实例 ID 后立即开始。Spot 实例将运行,直到您终止它或其持续时间段结束。在持续时间期间结束后,Amazon EC2 将 Spot 实例 标记为终止并提供一个 Spot 实例 终止通知,这将在实例终止前为其提供两分钟时间的警告。在极少数情况下,Spot 型限制会由于 Amazon EC2 的容量需求而中断。在这种情况下,我们将在终止实例前提供两分钟的警告,即使您使用了此已终止的实例,也无需为其支付费用。

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

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

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

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

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

检索具有指定持续时间的 Spot 实例 的费用 (AWS CLI)

使用 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 实例。

最新一代

  • 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 实例请求的服务相关角色

Amazon EC2 使用服务相关角色获取代表您调用其他 AWS 服务所需的权限。服务相关角色是一种独特类型的 IAM 角色,它与 AWS 服务直接相关。服务相关角色提供了一种将权限委托给 AWS 服务的安全方式,因为只有相关服务才能代入服务相关角色。有关更多信息,请参阅 IAM 用户指南 中的使用服务相关角色

Amazon EC2 使用名为 AWSServiceRoleForEC2Spot 的服务相关角色代表您启动和管理 Spot 实例。

AWSServiceRoleForEC2Spot 授予的权限

Amazon EC2 使用 AWSServiceRoleForEC2Spot 完成以下操作:

  • ec2:DescribeInstances – 描述 Spot 实例

  • ec2:StopInstances – 停止 Spot 实例

  • ec2:StartInstances – 启动 Spot 实例

创建服务相关角色

在大多数情况下,您无需手动创建服务相关角色。在首次使用控制台请求 Spot 实例时,Amazon EC2 创建 AWSServiceRoleForEC2Spot 服务相关角色。

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

在使用 AWS CLI 或 API 请求 Spot 实例之前,请确保该角色存在。要创建该角色,请如下使用 IAM 控制台。

手动创建 AWSServiceRoleForEC2Spot 服务相关角色

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

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

  3. 选择创建角色

  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 将再次创建该角色。

授予用于加密的 AMI 和 EBS 快照的 CMK 的访问权限

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

在提供权限时,授权是密钥策略的替代方法。有关更多信息,请参阅 AWS Key Management Service Developer Guide 中的使用授权在 AWS KMS 中使用密钥策略

为 AWSServiceRoleForEC2Spot 角色授予使用 CMK 的权限

  • 使用 create-grant 命令在 CMK 中添加授权,并指定授予权限的委托人(AWSServiceRoleForEC2Spot 服务相关角色)以执行授权允许的操作。CMK 是由 key-id 参数和 CMK 的 ARN 指定的。委托人是由 grantee-principal 参数和 AWSServiceRoleForEC2Spot 服务相关角色的 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/AWSServiceRoleForEC2Spot --operations "Decrypt" "Encrypt" "GenerateDataKey" "GenerateDataKeyWithoutPlaintext" "CreateGrant" "DescribeKey" "ReEncryptFrom" "ReEncryptTo"

创建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 实例,则会看到一个欢迎页面;请选择 Get started (开始使用)。否则,请选择 Request 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。选择具有您所需最低硬件规格的实例类型 (vCPU、内存和存储)。

    4. 对于 Network (网络),您可以选择现有 VPC 或新建一个。

      [现有 VPC] 选择 VPC。

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

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

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

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

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

    8. (可选)要运行专用 Spot 实例,请为 Tenancy (租期) 选择 Dedicated - run a dedicated instance (专用 - 运行专用实例)

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

    10. 要连接到您的实例,请启用 Auto-assign IPv4 Public IP (自动分配 IPv4 公有 IP)

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

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

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

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

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

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

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

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

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

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

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

  10. 选择 Launch

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

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

创建 Spot 实例 请求 (AWS CLI)

使用以下 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 (实例)

    注意

    Spot 实例请求不会立即被标记,过一段时间后,可能会与 Spot 队列请求 (SFR) 分开显示出来。

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

查找正在运行的 Spot 实例 (AWS CLI)

要枚举您的 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 实例 请求(控制台)

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

  2. 在导航窗格中,请选择 Spot Requests (Spot 请求),然后选择所需的 Spot 请求。

  3. 依次选择 Actions (操作)Cancel spot request (取消 Spot 请求)

  4. (可选) 如果不再使用关联的 Spot 实例,可以将其终止。在导航窗格中,请选择 Instances (实例) 并选择所需的实例,然后依次选择 Actions (操作)Instance State (实例状态)Terminate (终止)

取消 Spot 实例 请求 (AWS CLI)

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

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

终止 Spot 实例

如果您的 Spot 请求处于 active 状态,且关联的 Spot 实例 正在运行,那么取消请求不会终止该实例;您必须手动终止正在运行的 Spot 实例。如果您终止的运行中 Spot 实例 是由持久性 Spot 请求启动的,则 Spot 请求会返回 open 状态,这样就可以启动新的 Spot 实例。要取消持久性 Spot 请求并终止其 Spot 实例,您必须先取消 Spot 请求,然后终止 Spot 实例。否则,持久性 Spot 请求可以启动新实例。有关取消 Spot 实例 请求的更多信息,请参阅上一节。

手动终止 Spot 实例 (AWS CLI)

  • 使用以下 terminate-instances 命令可手动终止 Spot 实例:

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