通过EventBridge快速订阅ECS事件

本文介绍如何通过EventBridge主动订阅ECS事件,将其投递至指定下游服务。

背景信息

事件总线(EventBridge)作为阿里云上的事件中枢,提供统一的事件中心,以标准化的CloudEvents 1.0协议连接云产品和应用、应用和应用,帮助云产品、SaaS产品以及您管理业务领域内产生的事件。EventBridge致力于保障上游云产品事件的质量,同时提供更好的事件订阅体验,提高数据订阅投递的可靠性,SLA数据可靠性99.99999999%,服务可用性99.95%。

相比调用ECS的API接口DescribeInstanceHistoryEvents以定时轮询方式查询ECS服务是否有新的事件产生,EventBridge通过主动订阅的方式,有以下几个优点:

  • 时效性更高:一旦订阅监听到指定的ECS事件产生,能够在毫秒级触发指定操作。

  • 成本更低:不需要定时轮询检查事件是否产生,避免不必要的开销。

订阅ECS.png

适用场景

  • 订阅指定的ECS事件,触发钉钉、短信、邮箱通知等。

  • 将指定的ECS事件,通过公网或者VPC网络推送到下游HTTP/HTTPS服务。

  • 汇总多个云账号下的ECS事件。

  • 指定的ECS事件发生时,通过函数计算触发特定动作。

  • 当ECS事件时延较高、事件量较大时,将其投递至轻量消息队列(原 MNS)来订阅事件。

前提条件

步骤一:选用云服务专用事件总线

云服务专用事件总线即default总线,是EventBridge默认创建的总线,阿里云上各个云产品会实时将产品内产生的事件,通过多种渠道实时投递到default总线,您可以在default总线上查找和订阅各个云产品的事件。

  1. 登录事件总线EventBridge控制台,在左侧导航栏,单击事件总线
  2. 在顶部菜单栏,选择地域。
  3. 事件总线页面,单击default

步骤二:创建ECS事件订阅规则

  1. 事件总线页面,单击左侧导航栏的事件规则,然后单击创建规则

  2. 创建规则面板,完成以下操作。

    1. 配置基本信息页签,在名称文本框输入规则名称,在描述文本框输入规则的描述,然后单击下一步

    2. 配置事件模式页签,完成以下配置,然后单击下一步

      • 单击阿里云官方事件源页签。

      • 事件源下拉列表选择acs.ecs

      • 事件类型下拉列表选择需要订阅的事件类型。可同时选择订阅多个事件类型。

      • 事件模式调试中,可查看订阅的事件类型的示例。例如,事件类型选择ecs.Instance.StateChange 实例生命周期状态变化时,对应的示例如下。

        {
          "id": "45ef4dewdwe1-7c35-447a-bd93-fab****",
          "source": "acs.ecs",
          "specversion": "1.0",
          "subject": "acs.ecs:cn-hangzhou:123456789098****:215672",
          "time": "2020-11-19T21:04:41Z",
          "type": "ecs:Instance:StateChange",
          "aliyunaccountid": "123456789098****",
          "aliyunpublishtime": "2020-11-19T21:04:42Z",
          "aliyuneventbusname": "default",
          "aliyunregionid": "cn-hangzhou",
          "aliyunpublishaddr": "172.25.XX.XX",
          "data": {
            "instanceName": "iZ0jl0kyquo46h****",
            "instanceType": "ecs.c6.large",
            "privateIpAddress": "172.21.XX.XX",
            "publicIpAddress": "8.37.XX.XX",
            "resourceId": "i-0jl0kyquo46****",
            "resourceType": "ALIYUN::ECS::Instance",
            "spotStrategy": "SpotWithPriceLimit",
            "state": "Running"
          }
        }
    3. 配置事件目标页签,选择不同的服务类型,设置推送场景。

      场景一:推送至轻量消息队列(原 MNS)

      使用轻量消息队列(原 MNS)来订阅事件适用于对事件时延要求较高、事件量较大的场景。轻量消息队列(原 MNS)费用详情请参见计费说明

      • 服务类型:选择轻量消息队列(原 MNS)

      • 队列:选择已创建的队列。

      • 消息体(body):选择完整事件。

      • 开启 Base64 解码:选择。开启Base64 编码,会帮助您将数据编码后投递至目标轻量消息队列(原 MNS)中的队列。

      服务类型为轻量消息队列(原 MNS)时,可通过NetworkInterfaceDemo.zip监听轻量消息队列(原 MNS)消息获取事件。

      场景二:推送至钉钉

      • 服务类型:选择钉钉

      • 地址:输入钉钉机器人的Webhook地址。

      • 密钥:输入钉钉机器人密钥。

      • 推送内容:您可以通过EventBridge的模板能力,将上面事件中的参数推送给钉钉机器人,例如,推送ECS实例的名称(instanceName)和运行状态(state),配置如下:

        • 变量:通过JsonPath指定需要获取的事件中的字段信息,并设置变量名称。

          {
            "instanceName":"$.data.instanceName",
            "state":"$.data.state"
          }
        • 模板:按照钉钉机器人需要的格式定义模板,并在模板中引入上面定义的变量。

          {
            "msgtype": "text",
            "text": {
                "content": "${instanceName} state is ${state}" 
            } 
          }

          更多配置请参见钉钉机器人参考文档

      场景三:推送至下游HTTP服务

      • 服务类型:选择HTTP或者HTTPS

      • URL:配置接收事件的URL地址。

      • Body:配置接收事件的内容格式。EventBridge支持将事件转换后,按需要的格式推送给HTTP目标端,目前支持四种转换格式:完整事件、部分事件、固定值、模板。更多信息,请参见事件内容转换

      • 网络类型

        • 公网:通过公网访问目标URL地址。

        • 专有网络:如果目标URL的地址未暴露公网,可以选择专有网络,需设置VPC ID、VSwitch ID和安全组ID。

      场景四:推送后触发动作

      如果希望在ECS事件发生时,触发某个更加个性化的动作,可以将服务类型设置为函数计算。把事件推送到指定的函数,在函数计算里通过代码编辑个性化的操作。

      • 服务类型:选择函数计算

      • 服务函数计算里创建的服务名称。

      • 函数函数计算里创建的函数名称。

      • 事件:配置接收事件的内容格式。EventBridge支持将事件转换后,按需要的格式推送给函数计算。目前支持四种转换模板:完整事件部分事件固定值模版。详细信息,请参见事件内容转换

      • 执行方式

        • 同步:函数计算接收到事件,并且函数成功处理完事件后则响应成功。

        • 异步:函数计算成功接收到事件后,则认为响应成功。

        更多信息,请参见路由到函数计算

      场景五:汇总多个云账号下的ECS事件

      EventBridge支持将不同账号、不同地域下的ECS事件汇总到同一个地域的同一个账号下的事件总线,需要选择服务类型为EventBridge事件总线

      • 目标类型

        • 同账号总线:投递给当前账号的其他总线。

        • 跨账号总线:投递给其他账号的总线。如需选择跨账号投递,需要进行账号授权,详细信息,请参见路由到事件总线EventBridge

      • 地域:支持中国内地跨地域投递和国外地域之间相互投递。

      • 事件总线:要投递的目标总线名称。

      • 事件:默认投递完整事件且不可更改。

      配置事件目标页签下方,您可以根据业务需要配置重试和死信策略。详情请参见重试和死信

      更多场景,请参见目标服务类型

步骤三:触发事件

本文以ecs.Instance.StateChange 实例生命周期状态变化事件类型为例,触发事件需要修改ECS实例的运行状态。

  1. 登录ECS管理控制台

  2. 在左侧导航栏,选择实例与镜像 > 实例

  3. 在顶部菜单栏,选择目标资源所在的地域。

  4. 在目标ECS实例右侧操作列,选择image.png > 实例状态,修改实例的运行状态。

步骤四:查看投递结果

  1. 查询ECS是否产生事件。

    EventBridge支持根据时间范围、事件类型、订阅规则名称、事件ID(与ECS事件ID一致)来查询搜索产生的ECS事件。操作步骤,请参见查询事件

  2. 查询ECS事件的订阅投递结果。

    通过上一步查询到的事件ID,可以单击事件ID右侧操作列的事件轨迹查看事件推送轨迹,轨迹包含推送的目标、状态、次数、时间。image.png

事件的监控报警

您可以在的EventBridge监控大盘中看到创建的ECS事件订阅任务的调用次数,推送成功率、推送延迟等。根据具体业务场景诉求配置报警策略。

  1. 登录云监控控制台

  2. 在左侧导航栏,选择云资源监控 > 云产品监控

  3. 云产品监控页面的左侧导航栏单击中间件,然后将鼠标移至中间件区域的事件总线并单击事件总线 - EventBus

    Kd6bGuRq7F

  4. 事件总线 - EventBus页面上方选择地域,然后单击default总线操作列的监控图表,即可查看default总线的监控详情。

    jyijb9Sx6M

您可以在监控页面为EventBridge的资源设置报警规则。当资源符合报警规则时,云监控自动发送报警通知。操作步骤,请参见设置报警规则

重试和死信

事件写入EventBus之后,EventBridge保障事件能被推送到下游至少一次。当下游事件接收端出现异常(如宕机、服务不可用、网络抖动等),导致接收端无法正常接收事件时,EventBridge支持多种方式处理这些异常,包括:重试策略、容错策略、死信队列。您可以在步骤二:创建ECS事件订阅规则中,配置重试和死信策略,保障事件会被正确投递。

  • 重试策略

    当下游接收端无法正常接收事件时,EventBridge推送给下游会发生异常,这种情况,您可以配置EventBridge重试推送下游接收端的策略,最大程度保证推送成功。

    • 退避重试(重试3次,每次重试的时间间隔是10秒到20秒之间的随机值。)

    • 指数衰减重试(重试176次,每次重试的间隔时间指数递增至512秒,总计重试时间为1天。每次重试的具体间隔为:1,2,4,8,...512秒。)

  • 死信处理策略

    当达到预设的重试策略的重试次数上限之后,如果事件依旧未成功投递,EventBridge默认会丢弃该事件。如果您希望保留该事件,可以配置将这些事件发送到死信队列。目前EventBridge支持的死信队列包括:云消息队列 RocketMQ 版轻量消息队列(原 MNS)云消息队列 Kafka 版事件总线

  • 容错策略

    如果您有事件顺序场景的诉求,当发生异常时,需要暂停任务,直到该事件成功推送,否则会出现事件乱序,此时需要选择禁止容错。如果是非顺序场景,建议优先选择允许容错,以提供最大并发推送能力。

    • 允许容错(允许异常容错,当异常发生时不会阻塞执行,超过重试策略后会根据配置将消息投递至死信队列或直接丢弃。)

    • 禁止容错(不允许容错,当异常发生并超过重试策略配置时会阻塞执行)。