本文介绍如何通过EventBridge主动订阅ECS事件,将其投递至指定下游服务。
背景信息
事件总线(EventBridge)作为阿里云上的事件中枢,提供统一的事件中心,以标准化的CloudEvents 1.0协议连接云产品和应用、应用和应用,帮助云产品、SaaS产品以及您管理业务领域内产生的事件。EventBridge致力于保障上游云产品事件的质量,同时提供更好的事件订阅体验,提高数据订阅投递的可靠性,SLA数据可靠性99.99999999%,服务可用性99.95%。
相比调用ECS的API接口DescribeInstanceHistoryEvents
以定时轮询方式查询ECS服务是否有新的事件产生,EventBridge通过主动订阅的方式,有以下几个优点:
时效性更高:一旦订阅监听到指定的ECS事件产生,能够在毫秒级触发指定操作。
成本更低:不需要定时轮询检查事件是否产生,避免不必要的开销。
适用场景
订阅指定的ECS事件,触发钉钉、短信、邮箱通知等。
将指定的ECS事件,通过公网或者VPC网络推送到下游HTTP/HTTPS服务。
汇总多个云账号下的ECS事件。
指定的ECS事件发生时,通过函数计算触发特定动作。
当ECS事件时延较高、事件量较大时,将其投递至MNS来订阅事件。
前提条件
创建钉钉机器人,记录Webhook地址和密钥。更多信息,请参见钉钉官方文档。
创建消息服务MNS队列,更多信息,请参见开通消息服务MNS并授权和创建队列。
步骤一:选用云服务专用事件总线
云服务专用事件总线即default总线,是EventBridge默认创建的总线,阿里云上各个云产品会实时将产品内产生的事件,通过多种渠道实时投递到default总线,您可以在default总线上查找和订阅各个云产品的事件。
- 登录事件总线EventBridge控制台,在左侧导航栏,单击事件总线。
- 在顶部菜单栏,选择地域。
在事件总线页面,单击default。
步骤二:创建ECS事件订阅规则
在事件总线页面,单击左侧导航栏的事件规则,然后单击创建规则。
在创建规则面板,完成以下操作。
在配置基本信息页签,在名称文本框输入规则名称,在描述文本框输入规则的描述,然后单击下一步。
在配置事件模式页签,完成以下配置,然后单击下一步。
单击阿里云官方事件源页签。
在事件源下拉列表选择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" } }
在配置事件目标页签,选择不同的服务类型,设置推送场景。
场景一:推送至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事件发生时,触发某个更加个性化的动作,可以将服务类型设置为函数计算。把事件推送到指定的函数,在函数计算里通过代码编辑个性化的操作。
场景五:汇总多个云账号下的ECS事件
EventBridge支持将不同账号、不同地域下的ECS事件汇总到同一个地域的同一个账号下的事件总线,需要选择服务类型为EventBridge事件总线。
目标类型:
同账号总线:投递给当前账号的其他总线。
跨账号总线:投递给其他账号的总线。如需选择跨账号投递,需要进行账号授权,详细信息,请参见路由到事件总线EventBridge。
地域:支持中国内地跨地域投递和国外地域之间相互投递。
事件总线:要投递的目标总线名称。
事件:默认投递完整事件且不可更改。
在配置事件目标页签下方,您可以根据业务需要配置重试和死信策略。详情请参见重试和死信。
更多场景,请参见目标服务类型。
步骤三:触发事件
本文以ecs.Instance.StateChange 实例生命周期状态变化
事件类型为例,触发事件需要修改ECS实例的运行状态。
登录ECS管理控制台。
在左侧导航栏,选择 。
在顶部菜单栏,选择目标资源所在的地域。
在目标ECS实例右侧操作列,选择
,修改实例的运行状态。
步骤四:查看投递结果
查询ECS是否产生事件。
EventBridge支持根据时间范围、事件类型、订阅规则名称、事件ID(与ECS事件ID一致)来查询搜索产生的ECS事件。操作步骤,请参见查询事件。
查询ECS事件的订阅投递结果。
通过上一步查询到的事件ID,可以单击事件ID右侧操作列的事件轨迹查看事件推送轨迹,轨迹包含推送的目标、状态、次数、时间。
事件的监控报警
您可以在的EventBridge监控大盘中看到创建的ECS事件订阅任务的调用次数,推送成功率、推送延迟等。根据具体业务场景诉求配置报警策略。
登录云监控控制台。
在左侧导航栏,单击云产品监控。
在云产品监控页面,选择
。在页面上方选择地域,单击default总线右侧操作列的监控图表。
您可以在监控页面为EventBridge的资源设置报警规则。当资源符合报警规则时,云监控自动发送报警通知。操作步骤,请参见设置报警规则。
重试和死信
事件写入EventBus之后,EventBridge保障事件能被推送到下游至少一次。当下游事件接收端出现异常(如宕机、服务不可用、网络抖动等),导致接收端无法正常接收事件时,EventBridge支持多种方式处理这些异常,包括:重试策略、容错策略、死信队列。您可以在步骤二:创建ECS事件订阅规则中,配置重试和死信策略,保障事件会被正确投递。
重试策略
当下游接收端无法正常接收事件时,EventBridge推送给下游会发生异常,这种情况,您可以配置EventBridge重试推送下游接收端的策略,最大程度保障推送成功。
退避重试(重试3次,每次重试的时间间隔是10秒到20秒之间的随机值。)
指数衰减重试(重试176次,每次重试的间隔时间指数递增至512秒,总计重试时间为1天。每次重试的具体间隔为:1,2,4,8,...512秒。)
死信处理策略
当达到预设的重试策略的重试次数上限之后,如果事件依旧未成功投递,EventBridge默认会丢弃该事件。如果您希望保留该事件,可以配置将这些事件发送到死信队列。目前EventBridge支持的死信队列包括:云消息队列 RocketMQ 版、消息服务、云消息队列 Kafka 版、事件总线。
容错策略
如果您有事件顺序场景的诉求,当发生异常时,需要暂停任务,直到该事件成功推送,否则会出现事件乱序,此时需要选择禁止容错。如果是非顺序场景,建议优先选择允许容错,以提供最大并发推送能力。
允许容错(允许异常容错,当异常发生时不会阻塞执行,超过重试策略后会根据配置将消息投递至死信队列或直接丢弃。)
禁止容错(不允许容错,当异常发生并超过重试策略配置时会阻塞执行)。