本文介绍了如何在调用异步OpenAPI之后,通过EventBridge主动订阅ECS事件,并将其投递至轻量消息队列(原MNS)。同时提供了弹性网卡示例代码,以便在业务系统中集成,利用事件驱动架构方式获取异步OpenAPI操作结果。适用于对事件时延要求较高、事件量较大的场景。
前提条件
已开通事件总线EventBridge服务并完成授权,具体操作,请参见开通事件总线EventBridge并授权。
已开通轻量消息队列(原MNS)并授权,具体操作,请参见开通轻量消息队列(原 MNS)并授权。
背景信息
云服务器ECS提供了各种API接口,您可以通过API管理您的云上资源和开发自己的应用程序,直接与云服务进行交互,实现自动化管理、灵活性和定制化的开发。但其中一些API接口为异步接口,调用成功后,获得返回结果仅代表当前请求发送成功,需要通过其他方式获取资源操作是否成功,比如通过轮询查询类API,查询资源状态是否符合预期。
例如,附加弹性网卡AttachNetworkInterface为异步操作,要获取附加弹性网卡是否成功,可以通过轮询DescribeNetworkInterfaces查询网卡状态,如果网卡状态为InUse,则表示附加弹性网卡操作成功。但是,通过轮询的方式获取异步API操作结果存在以下缺点:
增加了API接口的无效调用。
频繁的轮询会导致API被限流。
获取异步API操作结果不及时。
通过事件驱动架构获取异步API操作结果,可以在异步API操作完成后,产生对应的操作完成事件,通过订阅对应的事件,可以避免轮询API存在的一些问题,更及时的获取异步API操作结果。
本文以附加弹性网卡AttachNetworkInterface为例,附加弹性网卡成功或者失败后,会产生网卡操作完成事件NetworkInterfaceOperateCompleted,通过订阅该事件,可以及时获取附加弹性网卡操作结果。
在极少数情况下,可能会出现资源操作完成但是没有对应事件。建议您把轮询API作为兜底策略,您可以调整轮询的频率。以附加弹性网卡为例,您可通过轮询DescribeNetworkInterfaces查询附加弹性网卡的结果。
操作步骤
步骤一:创建轻量消息队列
创建队列将产生少量队列占用费用,请及时删除不需要的队列。MNS计费说明,请参见计费说明。
在左侧导航栏,选择。
在顶部菜单栏,选择地域。
在队列列表页面,单击创建队列。
在创建队列面板配置以下参数,然后单击确定。
名称:队列名称。本示例中,自定义队列名称为eni-operate-completed-event,其他配置项保持默认配置。
消息最大长度:发送到队列的消息体的最大长度。
长轮询时间:当队列中没有消息时,该队列的ReceiveMessage请求的最大等待时长。
消息可见性超时时间:消息从队列中取出后从Active状态变成Inactive状态后的持续时间。
消息保存时长:消息在队列中的最长存活时间。从发送到队列开始经过此参数指定的时间后,不论消息是否被取出都将被删除。
消息定时时间:发送到队列的所有消息将延后此参数指定的时间后被消费。
启用日志功能:是否开启日志管理功能。
返回队列列表页面,查看目标队列已创建,记录队列名称和接入点Endpoint。
步骤二:选用云服务专用事件总线
- 登录事件总线EventBridge控制台,在左侧导航栏,单击事件总线。
- 在顶部菜单栏,选择地域。
在事件总线页面,单击default。
步骤三:创建ECS事件订阅规则
在事件总线页面,单击左侧导航栏的事件规则,然后单击创建规则。
在创建规则面板,完成以下操作。
在配置基本信息页签,在名称文本框输入规则名称,在描述文本框输入规则的描述,然后单击下一步。
在配置事件模式页签,完成以下配置,然后单击下一步。
单击阿里云官方事件源页签。
在事件源下拉列表中选择acs.ecs。
在事件类型下拉列表中选择需要订阅的事件类型。可同时选择订阅多个事件类型。
本文示例选择ecs:NetworkInterface:NetworkInterfaceOperateCompleted,更多异步OpenAPI对应的事件,请参见事件通知列表。
在事件模式调试中,可查看订阅的事件类型的示例。例如,事件类型选择ecs:NetworkInterface:NetworkInterfaceOperateCompleted时,对应的示例如下。
{ "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:NetworkInterface:NetworkInterfaceOperateCompleted", "aliyunaccountid": "123456789098****", "aliyunpublishtime": "2020-11-19T21:04:42Z", "aliyuneventbusname": "default", "aliyunregionid": "cn-hangzhou", "aliyunpublishaddr": "172.25.XX.XX", "data": { "eniStatus": "Available", "result": "success", "eniId": "eni-bp1j9eoibxxxxxxxxxx", "operation": "CreateNetworkInterface", "requestId": "8D152511-XXXX-18E2-XXXX-8A1219DAD64F.i-bp1ffahxxxxxxxxxx", "primaryPrivateIp": "192.168.1.1", "secondaryPrivateIps": [ "192.168.*.*", "192.168.*.*" ], "ipv4Prefixes": [ "192.168.10.0/24" ], "ipv6s": [ "ABCD:EF01:2345:6789:ABCD:EF01:****:****" ], "ipv6Prefixes": [ "2001:***::/32" ] } }
在配置事件目标页签,配置MNS消息通知。
服务类型:选择轻量消息队列(原MNS)。
队列:选择已创建的队列,如已创建队列eni-operate-completed-event。
消息内容:选择完整事件。
开启 Base64 解码:选择是。开启Base64 编码,会帮助您将数据编码后投递至目标轻量消息队列。
步骤四:通过示例代码订阅事件
NetworkInterfaceDemo.zip中展示了通过MNS消息获取弹性网卡事件的示例代码。
关键参数说明:
QueueName:步骤一:创建轻量消息队列中创建的MNS队列名称。本示例中,自定义队列名称为eni-operate-completed-event。
MnsEndPoint:步骤一:创建轻量消息队列中创建的MNS队列所属EndPoint。
AccessKey:阿里云账号的AccessKey。