Amazon Elastic Compute Cloud
Windows 实例用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

Spot 队列请求

要使用 Spot 队列,请创建一个 Spot 队列请求,该请求包括目标容量、实例的一个或多个启动说明以及您愿意支付的出价。当现货价格发生更改时,Amazon EC2 将尝试维护您的 Spot 队列的目标容量。有关更多信息,请参阅 Spot 队列的工作方式

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

当您发出一次性请求时, Spot 队列会根据需要出价,但在容量减少时,不会尝试补充 Spot 实例。如果容量不可用, Spot 队列不会在其他竞价池中提交出价。

为保持目标容量, Spot 队列将根据需要提交出价以满足目标容量,并自动补充任何中断的实例。

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

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

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

Spot 队列请求状态

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

  • submitted - Spot 队列请求正在评估中,Amazon EC2 正准备启动目标数量的 Spot 实例。

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

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

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

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

  • cancelled - Spot 队列已取消并且没有正在运行的 Spot 实例。 Spot 队列请求将在其实例终止两天后删除。

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

  Spot 队列请求状态

Spot 队列先决条件

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

为 Spot 队列创建 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. 要向 Spot 队列授予自动标记其启动的实例的权限,请单击新角色所在的行,然后依次选择 Attach PolicyAmazonEC2SpotFleetTaggingRole 策略和 Attach Policy。选择 AmazonEC2SpotFleetRole 策略旁边的 Detach Policy

Spot 队列和 IAM 用户

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

为 IAM 用户授予 Spot 队列的权限

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

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

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

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

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

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

    • iam:AddRoleToInstanceProfile

    • iam:AttachRolePolicy

    • iam:CreateInstanceProfile

    • iam:CreateRole

    • iam:GetRole

    • iam:ListPolicies

  5. 选择 Create Policy

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

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

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

Spot 队列运行状况检查

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

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

要求

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

  • 仅当您创建 Spot 队列时才能将它配置为替换运行状况不佳的实例。

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

规划 Spot 队列请求

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

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

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

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

  • 确定每实例小时出价。出价较低能够进一步降低成本,而出价较高则可以降低中断发生的可能性。

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

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

Spot 队列请求的服务相关角色

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

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

  • ec2:RequestSpotInstances - 请求 Spot 实例

  • ec2:TerminateInstances - 终止 Spot 实例

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

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

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

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

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

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

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

创建 Spot 队列请求

创建 Spot 队列请求时,您必须指定有关要启动的 Spot 实例的信息 (如实例类型和现货价格)。

使用控制台创建 Spot 队列请求

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

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

  3. Find instance types 页面中,执行以下操作:

    1. 对于 Request type,选择 RequestRequest and Maintain

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

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

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

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

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

      [现有 VPC] 选择 VPC。

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

      [EC2-Classic] 选择 EC2-Classic

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

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

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

    8. 对于 Maximum price,您可以使用自动出价,也可以指定一个出价。如果您的出价低于所选实例类型的现货价格,则您的 Spot 实例不会启动。

    9. 选择 Next

  4. Configure (配置实例详细信息) 页面中,执行以下操作:

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

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

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

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

    5. (可选) 默认情况下,Amazon EC2 将在 Spot 实例中断时将其终止。如果队列类型为 maintain,您可以指定 Spot 实例在中断时停止。为此,请为 Interruption behavior 选择 Stop

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

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

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

    9. (可选) 要启动具有 IAM 角色的 Spot 实例,请使用 IAM instance profile 指定实例。

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

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

    12. (可选) 要创建仅在特定时段内有效的请求,请编辑 Request valid fromRequest valid to

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

    14. 选择 Review

  5. Review 页面上,确认启动配置。要进行更改,请选择 Previous。要下载启动配置的副本以便与 AWS CLI 结合使用,请选择 JSON config。如果准备就绪,请选择 Launch

  6. 在确认页面上,请选择 OK。请求类型为 fleet。执行请求后,系统会添加请求类型 instance,此时其状态为 activefulfilled

使用 AWS CLI 创建 Spot 队列请求

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

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

下面是示例输出:

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

监控您的 Spot 队列

当现货价格低于您的出价时, Spot 队列将启动 Spot 实例。 Spot 实例将一直运行到出价不再高于现货价格或您自行终止了它们。

使用控制台监控您的 Spot 队列

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

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

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

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

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

使用 AWS CLI 监控您的 Spot 队列

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

Copy
aws ec2 describe-spot-fleet-requests

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

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

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

Copy
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 队列请求

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

  • 提升目标容量

  • 减少目标容量

注意

无法修改一次性 Spot 队列请求。

当您增加目标容量时, Spot 队列将根据其 Spot 队列请求的分配策略来启动额外的 Spot 实例。如果分配策略为 lowestPrice,则 Spot 队列将从 Spot 队列请求中价格最低的 Spot 实例池启动实例。如果分配策略为 diversified,则 Spot 队列将在 Spot 队列请求中跨池分配实例。

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

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

使用控制台修改 Spot 队列请求

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

  2. 选择您的 Spot 队列请求。

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

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

    1. 输入新的目标容量。

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

    3. 选择 Submit

使用 AWS CLI 修改 Spot 队列请求

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

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

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

Copy
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 队列请求

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

使用控制台取消 Spot 队列请求

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

  2. 选择您的 Spot 队列请求。

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

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

使用 AWS CLI 取消 Spot 队列请求

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

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

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

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