接收抢占式实例中断事件

抢占式实例具有被中断的风险,实例在完全中断的前5分钟会触发中断事件。如果您的业务对实例中断敏感,则需要注意及时接收抢占式实例的中断事件,并对实例进行处理。阿里云云监控提供强大的资源监控功能,您可以通过云监控实时监控抢占式实例的中断事件,并在发生事件报警时通过您指定的报警方式接收到抢占式实例中断事件。本文为您介绍基于轻量消息队列(原 MNS)MNS或函数计算接收中断事件的具体操作。

除本文提供的接收抢占式实例中断事件最佳实践外,您也可以通过阿里云OpenAPI接收抢占式实例的中断事件。具体操作,请参见查询抢占式实例中断事件

方式一:通过轻量消息队列(原 MNS)MNS接收中断事件

  1. 通过轻量消息队列(原 MNS)MNS创建一个队列。

    具体操作,请参见创建队列

  2. 通过云监控创建事件报警。

    具体操作,请参见管理系统事件报警规则(旧版)。本教程中,需要完成以下配置:

    • 报警规则名称:自定义名称。例如:抢占式实例中断事件报警。

    • 产品类型:选择云服务器ECS

    • 事件类型:选择状态通知

    • 事件等级:选择警告

    • 事件名称:选择抢占式实例中断通知

    • 资源范围:保持默认配置。

    • 报警方式:您需要根据实际情况,选择适用于您业务的报警方式。例如,选择轻量消息队列(原 MNS)队列并配置为步骤1创建的队列信息。

    成功创建后,您可以在事件监控页签下,单击右侧的旧版事件报警规则,然后在报警规则列表中查看已创建的规则。

  3. 在抢占式实例中断事件的报警规则的操作列,选择image.png > 调试

  4. 创建事件调试面板,修改JSON文件,然后单击确定

    您需要将JSON文件中资源相关的信息替换为待模拟中断事件的抢占式实例的信息。JSON文件内容如下所示。其中:

    • 阿里云账号UID变量需要替换为当前登录的阿里云账号UID。

    • <resource-id>以及i-2zeg014dfo4y892z***两个变量需要替换为抢占式实例的实例ID。

    • <地域ID>变量需要替换为抢占式实例所属的地域ID。

    {
        "product": "ECS",
        "resourceId": "acs:ecs:cn-shanghai:阿里云账号UID:instance/<resource-id>",
        "level": "WARN",
        "instanceName": "instanceName",
        "regionId": "<地域ID>",
        "groupId": "0",
        "name": "Instance:PreemptibleInstanceInterruption",
        "content": {
            "instanceId": "i-2zeg014dfo4y892z***",
            "action": "delete"
        },
        "status": "Normal"
    }

    成功发起调试后,系统将根据您设置的报警方式推送报警信息。

  5. 通过轻量消息队列(原 MNS)MNS接收中断事件。

    具体操作,请参见队列模型快速入门

    您也可以使用轻量消息队列(原 MNS)MNS SDK关联到实际的业务中。更多信息,请参见Java SDK版本说明

方式二:通过函数计算接收中断事件

  1. 创建函数计算服务。

    具体操作,请参见创建服务

  2. 创建函数。

    具体操作,请参见创建函数

    本教程中,需要完成以下配置:

    • (可选)名称:自定义函数的名称。例如:testSpotInstance。

    • 请求处理程序类型:选择处理事件请求

    • 运行环境:选择Python 3.10

    • 内存规格:设置函数执行内存为512 MB

    当您成功创建函数后,页面会跳转至该函数详情页面的函数代码页签。

  3. 配置函数代码。

    1. 在IDE开发环境中,找到并单击默认存在的index.py文件。

    2. index.py文件内容替换为以下代码,然后单击部署代码

      代码中的变量说明如下:

      • 阿里云账号UID变量需要替换为当前登录的阿里云账号UID。

      • <resource-id>以及i-abcdef两个变量需要替换为抢占式实例的实例ID。

      • <地域ID>变量需要替换为抢占式实例所属的地域ID。地域ID信息,请参见地域和可用区

      # -*- coding: utf-8 -*-
      import logging
      import json, random, string, time
      LOGGER = logging.getLogger()
      clt = None
      def handler(event, context):
        '''
      {
          "product": "ECS",
          "resourceId": "acs:ecs:cn-shanghai:阿里云账号UID:instance/<resource-id>",
          "level": "WARN",
          "instanceName": "instanceName",
          "regionId": "<地域ID>",
          "groupId": "0",
          "name": "Instance:PreemptibleInstanceInterruption",
          "content": {
              "instanceId": "i-abcdef",
              "action": "delete"
          },
          "status": "Normal"
      }
        '''
        evt = json.loads(event);
        content = evt.get("content");
        regionId = evt.get("regionId");
        instanceId = content.get("instanceId");
        LOGGER.info( regionId + " " + instanceId + " termination ongoing");
    3. 单击测试函数右侧的下拉列表,然后单击配置测试参数

      配置测试参数

    4. 配置测试参数面板,完成以下配置并单击确定

      • 事件模板:保持默认配置。

      • 事件名称:自定义名称。例如:抢占式实例中断事件。

      • 文本框:将默认信息替换为以下代码,其中的变量信息需要与已配置的index.py文件内的变量信息保持一致。

        {
            "product": "ECS",
            "resourceId": "acs:ecs:cn-shanghai:阿里云账号UID:instance/<resource-id>",
            "level": "WARN",
            "instanceName": "instanceName",
            "regionId": "<地域ID>",
            "groupId": "0",
            "name": "Instance:PreemptibleInstanceInterruption",
            "content": {
                "instanceId": "i-abcdef",
                "action": "delete"
            },
            "status": "Normal"
        }
  4. 函数代码页签,单击测试函数

    您可以通过测试函数功能,查看函数代码的示例输出值。例如,本示例中,输出结果如下图所示,其中输出了触发中断事件的抢占式实例所属地域以及实例ID信息。日志输出

  5. 测试无问题后,通过云监控创建事件报警。

    具体操作,请参见管理系统事件报警规则(旧版)。本教程中,需要完成以下配置:

    • 报警规则名称:自定义名称。例如:抢占式实例中断事件报警。

    • 产品类型:选择云服务器ECS

    • 事件类型:选择状态通知

    • 事件等级:选择警告

    • 事件名称:选择抢占式实例中断通知

    • 资源范围:保持默认配置。

    • 报警方式:您需要根据实际情况,选择适用于您业务的报警方式。例如,选择函数计算并配置已创建的函数计算服务信息。

    成功创建后,您可以在事件监控页签下,单击右侧的旧版事件报警规则,然后在报警规则列表中查看已创建的规则。

  6. 在抢占式实例中断事件的报警规则的操作列,选择image.png > 调试

  7. 创建事件调试面板,修改JSON文件,然后单击确定

    您需要将JSON文件中资源相关的信息替换为待模拟中断事件的抢占式实例的信息。JSON文件内容如下所示。其中:

    • 阿里云账号UID变量需要替换为当前登录的阿里云账号UID。

    • <resource-id>以及i-2zeg014dfo4y892z***两个变量需要替换为抢占式实例的实例ID。

    • <地域ID>变量需要替换为抢占式实例所属的地域ID。

    {
        "product": "ECS",
        "resourceId": "acs:ecs:cn-shanghai:阿里云账号UID:instance/<resource-id>",
        "level": "WARN",
        "instanceName": "instanceName",
        "regionId": "<地域ID>",
        "groupId": "0",
        "name": "Instance:PreemptibleInstanceInterruption",
        "content": {
            "instanceId": "i-2zeg014dfo4y892z***",
            "action": "delete"
        },
        "status": "Normal"
    }

    成功发起调试后,系统将根据您设置的报警方式推送报警信息。

相关文档

如果您的抢占式实例上保存了重要数据或配置,建议您了解抢占式实例数据恢复的方法,并提前做好相关的配置,避免数据丢失。更多信息,请参见概述