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 实例的可用性也会因为未使用 EC2 实例的可用数量而差别巨大。此外,不论您的出价有多高,您的 Spot 实例仍有可能会中断。因此,必须确保应用程序针对 Spot 实例中断做好准备。我们强烈建议您不要为不能中断的应用程序使用 Spot 实例。

下面列出了 Amazon EC2 中断您的 Spot 实例的可能原因:

  • 价格 – 现货价格高于您的出价。

  • 容量 – 如果没有足够的未使用 EC2 实例来满足对 Spot 实例的需求,Amazon EC2 将从出价最低的实例开始中断 Spot 实例。如果多个 Spot 实例的出价相同,则随机确定实例的中断顺序。

  • 约束 — 如果您的请求包括约束,例如启动组或可用区组,当不再满足约束时,这些 Spot 实例将按照组来终止。

中断行为

您可以指定 Amazon EC2 在 Spot 实例中断时是应将其停止还是终止。默认情况下,在 Spot 实例中断时将其终止。您可以更改该行为,以便在满足以下要求时,Amazon EC2 在 Spot 实例中断时将其停止。

要求

  • 对于 Spot 实例请求,类型必须是 persistent,而不是 one-time。您不能在 Spot 实例请求中指定启动组。

  • 对于 Spot 队列请求,类型必须是 maintain,而不是 request

  • 根卷必须是 EBS 卷,而不是实例存储卷。

在竞价服务停止一个 Spot 实例后,该实例只能由竞价服务使用同一启动配置来重新启动。在匹配某个已停止 Spot 实例的可用区和实例类型的容量可用时,该 Spot 实例将启动。对于 Spot 队列,如果容量仅适用于其他可用区或实例类型,则 Spot 队列将使用具有可用容量的启动配置来启动一个新的 Spot 实例。

Spot 实例停止后,您可以修改其部分实例属性,但不能修改实例类型。如果您分离或删除一个 EBS 卷,则在 Spot 实例启动时不会挂载该卷。如果您分离根卷,并且竞价服务尝试启动 Spot 实例,则该实例将启动失败,并且竞价服务将终止已停止的实例。

当 Spot 实例停止后,您可以将其终止。如果您取消某个 Spot 请求或 Spot 队列,则竞价服务将终止任何已停止的关联 Spot 实例。

在 Spot 实例停止后,您只需为保留的 EBS 卷付费。对于 Spot 队列,如果您有许多已停止的实例,则可以超出您的账户的 EBS 卷数限制。

准备中断

下面提供了在您使用 Spot 实例时可以遵循的最佳实践:

  • 选择一个合理的出价。您的出价应该足够高,这样您的请求才有机会完成,但又不能高于您愿意支付的价格。这非常重要,因为在长时间供应不足的情况下,现货价格可能会在这段时间内居高不下,因为此时价格依据的是最高出价。我们强烈建议您的出价高于按需实例的价格。

  • 使用包含所需软件配置的 Amazon 系统映像 (AMI),确保您的实例在请求完成时随时可以启动。您还可以使用用户数据在启动时运行命令。

  • 在不会受 Spot 实例终止影响的位置定期存储重要数据。例如,您可以使用 Amazon S3、Amazon EBS 或 DynamoDB。

  • 将工作拆分为小的任务 (使用网格、Hadoop 或基于队列的架构) 或者使用检查点,以便您经常保存工作。

  • 使用 Spot 实例中断通知监控您的 Spot 实例的状态。

  • 虽然我们尽一切努力尽快提供此警告,但您的 Spot 实例可能会在我们提供此警告之前终止。测试您的应用程序,确保它很好地处理了意外的实例终止,即使您正在针对中断通知进行测试。您可以使用按需实例来运行应用程序,然后自行终止该按需实例来确认这一点。

Spot 实例中断通知

防止 Spot 实例中断的最佳方法是将应用程序设计为具有容错能力。此外,您还可以利用 Spot 实例中断通知,该通知可在 Amazon EC2 必须中断您的 Spot 实例时,提前两分钟发出警告。建议您每 5 秒检查一次这些警告。

此警告使用实例元数据中的项目,提供给在您的 Spot 实例上运行的应用程序。您应使用 instance-action 项目。为向后兼容而保留 termination-time 项目。

instance-action

如果 Spot 实例标记为由竞价服务停止或终止,则您的实例元数据中将显示 instance-action 项目。您可以按如下方式检索它。

Copy
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/spot/instance-action

instance-action 项目指定操作 (停止或终止) 和操作发生的大致时间 (用 UTC 表示)。以下示例指示将停止此实例的时间:

{"action": "stop", "time": "2017-09-18T08:22:00Z"}

以下示例指示将终止此实例的时间:

{"action": "terminate", "time": "2017-09-18T08:22:00Z"}

termination-time

如果 Spot 实例标记为由竞价服务终止,则您的实例元数据中将显示 termination-time 项目。为向后兼容而保留此项目。您可以按如下方式检索它。

Copy
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/spot/termination-time

termination-time 项目指定实例将收到关闭信号的大致时间 (用 UTC 表示)。例如:

2015-01-05T18:02:00Z

如果 Amazon EC2 未准备终止实例,或者,如果您自行终止了 Spot 实例,则 termination-time 项目要么不存在 (这样您会收到 HTTP 404 错误),要么包含并非时间值的值。

如果 Amazon EC2 未能终止实例,则竞价出价状态将设置为 fulfilled。请注意,termination-time 会将实例元数据保持原始大致时间 (现已成为过去时间)。