阿里云云监控提供强大的资源监控功能,您可以通过云监控实时监控抢占式实例的中断事件,并在发生事件报警时通过您指定的报警方式接收到抢占式实例中断事件。

背景信息

抢占式实例具有被中断的风险,实例在完全中断的前5分钟会触发中断事件。如果您的业务对实例中断敏感,则需要注意及时接收抢占式实例的中断事件,并对实例进行处理。本文主要提供了基于消息服务MNS或函数计算接收中断事件的最佳实践。

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

方式一:通过消息服务MNS接收中断事件

  1. 通过消息服务MNS创建一个队列。
    具体操作,请参见创建队列
  2. 通过云监控创建事件报警。
    具体操作,请参见创建系统事件报警规则。本教程中,需要完成以下配置:
    • 报警规则名称:自定义名称。例如:抢占式实例中断事件报警。
    • 事件类型:选择系统事件
    • 产品类型:选择云服务器ECS
    • 事件类型:选择状态通知
    • 事件等级:选择警告
    • 事件名称:选择抢占式实例中断通知
    • 资源范围:保持默认配置。
    • 报警方式:您需要根据实际情况,选择适用于您业务的报警方式。例如,选择消息服务队列并配置已创建的队列信息。
    成功创建后,您可以在报警规则页签,查看已创建的规则。
  3. 在抢占式实例中断事件的报警规则的操作列,单击调试
  4. 创建事件调试界面,修改JSON文件,然后单击确定
    您需要将JSON文件中资源相关的信息替换为待模拟中断事件的抢占式实例的信息。JSON文件内容如下所示。其中:
    • 阿里云账号UID变量需要替换为当前登录的阿里云账号UID。
    • <resource-id>以及i-abcdef两个变量需要替换为抢占式实例的实例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-abcdef",
            "action": "delete"
        },
        "status": "Normal"
    }
    成功发起调试后,系统将根据您设置的报警方式推送报警信息。
  5. 通过消息服务MNS接收中断事件。
    具体操作,请参见接收消息

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

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

  1. 创建函数计算服务。
    1. 登录函数计算控制台
    2. 在左侧导航栏单击服务及函数
    3. 在顶部菜单栏,选择地域。
    4. 服务列表页面,单击创建服务
      create_service_new
    5. 创建服务页面,填写服务名称和描述,然后单击确定
      您也可以在创建服务页面,设置是否启用阿里云日志服务和是否启用阿里云链路追踪功能。详细信息,请参见管理服务
    当您成功创建服务后,页面会跳转至该服务页面的管理函数页面。
  2. 创建函数。
    1. 管理函数页面,单击创建函数
    2. 创建函数页面,选择从零开始创建
    3. 基本设置区域,设置相关参数,然后单击创建
      参数配置说明如下:
      • 可选:名称:自定义函数的名称。例如:testSpotInstance。
      • 运行环境:选择Python 2.7
      • 函数触发方式:选择通过事件触发
      • 实例类型:选择弹性实例
      • 内存规格:设置函数执行内存为512 MB
      当您成功创建函数后,页面会跳转至该函数详情页面的函数代码页签。
  3. 配置函数代码。
    1. 在IDE开发环境中,找到并单击默认存在的index.py文件。
    2. index.py文件内容替换为以下代码,然后单击部署代码
      代码中的变量说明如下:
      • 阿里云账号UID变量需要替换为当前登录的阿里云账号UID。
      • <resource-id>以及i-abcdef两个变量需要替换为抢占式实例的实例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. 在抢占式实例中断事件的报警规则的操作列,单击调试
  7. 创建事件调试界面,修改JSON文件,然后单击确定
    您需要将JSON文件中资源相关的信息替换为待模拟中断事件的抢占式实例的信息。JSON文件内容如下所示。其中:
    • 阿里云账号UID变量需要替换为当前登录的阿里云账号UID。
    • <resource-id>以及i-abcdef两个变量需要替换为抢占式实例的实例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-abcdef",
            "action": "delete"
        },
        "status": "Normal"
    }
    成功发起调试后,系统将根据您设置的报警方式推送报警信息。