竞价型实例中断通知 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

竞价型实例中断通知

竞价型实例中断通知是在 Amazon EC2 停止或终止竞价型实例之前的两分钟发出的警告。如果您将休眠指定为中断行为,则会收到中断通知,但由于休眠过程立即开始,因此您不会提前两分钟收到警告。

正常处理竞价型实例中断的最佳方法是,设计应用程序以提供容错能力。为此,您可以利用竞价型实例中断通知。我们建议您每 5 秒检查一次这些中断通知。

中断通知是作为 EventBridge 事件以及竞价型实例上的实例元数据中的项目提供的。将尽最大努力发出中断通知。

EC2 Spot Instance interruption notice

当 Amazon EC2 将要中断竞价型实例时,它在实际中断之前的两分钟发出一个事件(休眠除外,此时会收到中断通知,但不会提前两分钟,因为休眠是立即开始的)。Amazon EventBridge 可以检测该事件。有关 EventBridge 事件的更多信息,请参阅《Amazon EventBridge 用户指南》https://docs.amazonaws.cn/eventbridge/latest/userguide/。有关指导您如何创建和使用事件规则的详细示例,请参阅利用 Amazon EC2 Spot 实例中断通知

以下是竞价型实例中断事件的示例。instance-action 的可能值为 hibernatestopterminate

{ "version": "0", "id": "12345678-1234-1234-1234-123456789012", "detail-type": "EC2 Spot Instance Interruption Warning", "source": "aws.ec2", "account": "123456789012", "time": "yyyy-mm-ddThh:mm:ssZ", "region": "us-east-2", "resources": ["arn:aws:ec2:us-east-2a:instance/i-1234567890abcdef0"], "detail": { "instance-id": "i-1234567890abcdef0", "instance-action": "action" } }
注意

竞价型实例中断事件的 ARN 格式为 arn:aws:ec2:availability-zone:instance/instance-id。此格式不同于 EC2 资源的 ARN 格式

instance-action

如果竞价型实例标记为由 Amazon EC2 停止或终止,将在您的实例元数据中包含 instance-action 项。如果没有,则不显示。可以使用实例元数据服务版本 2(IMDSv2)检索 instance-action,如下所示。

[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" 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"}

如果 Amazon EC2 没有准备停止或终止该实例,或者如果您自己终止了该实例,则实例元数据中不存在 instance-action,并且在尝试检索它时出现 HTTP 404 错误。

termination-time

为向后兼容而保留此项目;您应改为使用 instance-action

如果您的竞价型实例被 Amazon EC2 标记为终止(由于中断行为设置为 terminate 的竞价型实例中断,或由于永久竞价型实例请求取消),则 termination-time 项目将出现在您的实例元数据中。如果没有,则不显示。可以使用 IMDSv2 检索 termination-time,如下所示。

[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` [ec2-user ~]$ if curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/spot/termination-time | grep -q .*T.*Z; then echo termination_scheduled; fi

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

2015-01-05T18:02:00Z

如果 Amazon EC2 未准备终止实例(因为没有竞价型实例中断,或因为您的中断行为设置为 stophibernate),或者如果您自己终止了竞价型实例,则 termination-time 项目或者不存在于实例元数据中(这样您会收到 HTTP 404 错误),或者包含并非时间值的值。

如果 Amazon EC2 无法终止实例,请求状态将设置为 fulfilledtermination-time 值会将实例元数据保持原始大致时间(现已成为过去时间)。