在对弹性网卡完成创建、绑定、解绑或删除操作时,系统会产生弹性网卡操作完成事件,您可以通过阿里云云监控与消息服务,实现对弹性网卡操作完成事件通知的业务自动化处理。本文以Java代码为例,介绍基于弹性网卡操作完成事件实现业务自动化处理的相关操作。
背景信息
阿里云云监控支持在设置事件通知时关联消息服务MNS。当您通过云监控关联了弹性网卡操作完成事件和消息服务MNS时,可以同步将事件通知发送至消息服务MNS,然后您可以通过消息服务MNS(例如队列)获取该事件相关的信息,并根据消息内容触发后续动作,实现业务自动化处理。本最佳实践主要分为以下几步:
- 在配置业务自动化处理之前,您需要分别创建队列以及云监控的报警规则,用于监控并收集弹性网卡操作完成事件。具体操作,请参见准备工作。
- 配置业务自动化处理。本文以Java代码为例,轮询队列中的每一条消息,并将消息中包含的弹性网卡操作完成事件打印输出。具体操作,请参见基于Java代码自动化处理弹性网卡操作完成事件。
说明 弹性网卡操作完成事件正在邀测中,如需使用,请提交工单。
准备工作
- 创建消息服务MNS队列。本文仅介绍最佳实践所必需的操作步骤,关于创建队列的更多信息,请参见创建队列。
- 登录消息服务MNS控制台。
- 在左侧导航栏,单击队列列表。
- 在顶部菜单栏,选择地域。队列所属地域需要和弹性网卡所属地域一致。例如,您需要监控的弹性网卡所属地域为华东1(杭州),则需要在华东1(杭州)地域创建队列。
- 单击创建队列。
- 在创建队列面板中,完成队列相关配置。本示例中,自定义队列名称为eni-operate-completed-event,其他配置项保持默认配置。
- 单击确定。成功创建的队列如下图所示。
- 创建云监控报警事件。本文仅介绍最佳实践所必需的操作步骤,关于创建事件报警的更多信息,请参见设置事件通知。
- 登录云监控管理控制台。
- 在左侧导航栏,选择事件监控 > 系统事件。
- 在系统事件页面,单击事件报警规则页签,然后单击创建报警规则。
- 在创建/修改事件报警页面,完成以下配置。
- 报警规则名称:自定义名称。本示例中,自定义事件通知名称为eni-event-test-rule。
- 产品类型:选择云服务器ECS。
- 事件类型:选择状态通知。
- 事件等级:选择信息。
- 事件名称:选择网卡操作完成。
- 资源范围:本示例保持默认配置。您可以根据需要自行设置。
- 报警方式:本示例仅选中消息服务队列,并根据已经创建好的队列信息,设置地域与队列。您可以根据需要自行设置多种报警方式。
- 单击确定。创建成功的报警规则如下图所示。
基于Java代码自动化处理弹性网卡操作完成事件
本文提供的Java代码示例均基于JDK 1.8完成测试,在实际处理过程中请基于您所使用的开发工具、编程语言等情况自行调整并测试。
消息服务MNS提供了关于队列操作的完整代码示例。更多信息,请参见Java SDK版本说明。
- 在本地主机当前的用户目录下,手动创建名为.aliyun-mns.properties的文件,并在文件内添加接入点和AccessKey信息。说明
- Linux系统用户目录为/home/<username>/;Windows系统用户目录为C:\Users\<username>。
- 文件名称必须为.aliyun-mns.properties,其中.properties是该文件的格式后缀。
变量说明如下:mns.accountendpoint=<队列的公网接入点URL> mns.accesskeyid=<yourAccessKeyId> mns.accesskeysecret=<yourAccessKeySecret>
- <队列公网接入点>:获取队列公网接入点的具体操作,请参见获取接入点。
- <yourAccessKeyId>:您的阿里云账号的AccessKey ID信息。获取AccessKey的具体操作,请参见创建AccessKey。
- <yourAccessKeySecret>:您的阿里云账号的AccessKey Secret信息。
- 基于Java开发工具创建Maven项目。在配置业务自动化处理前,请确保已通过开发工具(Eclipse、IntelliJ IDEA等)创建了一个Maven项目。
- 在pom.xml文件的
<dependencies></dependencies>
标记对中,添加阿里云SDK的Maven依赖。说明 如果您需要获取多种编程语言的新版SDK,请参见OpenAPI开发者门户SDK中心。依次添加以下阿里云SDK的Maven依赖:- SDK核心库
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.18</version> </dependency>
- 云服务器ECS SDK
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-ecs</artifactId> <version>4.23.10</version> </dependency>
- 消息服务MNS SDK
<dependency> <groupId>com.aliyun.mns</groupId> <artifactId>aliyun-sdk-mns</artifactId> <version>1.1.9</version> </dependency>
- fastjson依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency>
- SDK核心库
- 创建实体类,用于定义弹性网卡操作完成事件的结构体。本示例中实体类命名为
EniEventMessage
。关于弹性网卡操作完成事件通知结构体的说明,请参见弹性网卡事件通知。说明 本文示例代码中均忽略了package
信息,您在实际使用代码时注意自行添加package
信息。import java.util.Map; public class EniEventMessage { private String resourceId; private String product; private String ver; private String instanceName; private String regionId; private String eventTime; private String name; private String ruleName; private String id; private String status; private Map<String, String> content; public String getResourceId() { return resourceId; } public void setResourceId(String resourceId) { this.resourceId = resourceId; } public String getProduct() { return product; } public void setProduct(String product) { this.product = product; } public String getVer() { return ver; } public void setVer(String ver) { this.ver = ver; } public String getInstanceName() { return instanceName; } public void setInstanceName(String instanceName) { this.instanceName = instanceName; } public String getRegionId() { return regionId; } public void setRegionId(String regionId) { this.regionId = regionId; } public String getEventTime() { return eventTime; } public void setEventTime(String eventTime) { this.eventTime = eventTime; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRuleName() { return ruleName; } public void setRuleName(String ruleName) { this.ruleName = ruleName; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public Map<String, String> getContent() { return content; } public void setContent(Map<String, String> content) { this.content = content; } }
- 创建弹性网卡操作完成事件的业务自动化处理代码文件。本示例中,实现业务自动化处理的类名为
ComsumerDemo
,主要实现了获取消息服务MNS的队列消息,并输出事件通知的主要信息,最后清除已获取的队列消息。import com.aliyun.mns.client.CloudAccount; import com.aliyun.mns.client.CloudQueue; import com.aliyun.mns.client.MNSClient; import com.aliyun.mns.common.ClientException; import com.aliyun.mns.common.ServiceException; import com.aliyun.mns.common.utils.ServiceSettings; import com.aliyun.mns.model.Message; import java.util.Map; public class ComsumerDemo { public static void main(String[] args) { // 与MNS的队列建立连接。 CloudAccount account = new CloudAccount( ServiceSettings.getMNSAccessKeyId(), ServiceSettings.getMNSAccessKeySecret(), ServiceSettings.getMNSAccountEndpoint()); MNSClient client = account.getMNSClient(); try{ // 获取名为eni-operate-completed-event队列的消息。 CloudQueue queue = client.getQueueRef("eni-operate-completed-event"); // 模拟轮询队列中的消息,实现业务自动化处理。 for (int time = 0; time < 100; time++) { // 获取队列中的消息。 Message popMsg = queue.popMessage(); if (popMsg != null){ System.out.println("message handle: " + popMsg.getReceiptHandle()); System.out.println("message body: " + popMsg.getMessageBodyAsString()); System.out.println("message id: " + popMsg.getMessageId()); System.out.println("message dequeue count:" + popMsg.getDequeueCount()); // 反序列化队列中的消息主体。 EniEventMessage messageBody = com.alibaba.fastjson.JSON.parseObject(popMsg.getMessageBodyAsString(), EniEventMessage.class); // 获取消息主体中包含的弹性网卡操作完成事件的内容。 Map<String, String> messageContent = messageBody.getContent(); // 获取弹性网卡ID信息。 String eniId = messageContent.get("eniId"); // 获取弹性网卡状态信息。 String eniStatus = messageContent.get("eniStatus"); // 获取操作结果。 String result = messageContent.get("result"); // 获取操作名称。 String operation = messageContent.get("operation"); // 获取操作弹性网卡请求ID。 String requestId = messageContent.get("requestId"); // 输出相关信息。 System.out.println("ENI ID: " + eniId); System.out.println("ENI status: " + eniStatus); System.out.println("result: " + result); System.out.println("operation: " + operation); System.out.println("requestId: " + requestId); // 成功获取到弹性网卡事件内容后,清除队列中对应的消息。 queue.deleteMessage(popMsg.getReceiptHandle()); System.out.println("delete message successfully.\n"); } } } catch (ClientException ce) { System.out.println("Something wrong with the network connection between client and MNS service." + "Please check your network and DNS availablity."); ce.printStackTrace(); } catch (ServiceException se) { if (se.getErrorCode().equals("QueueNotExist")) { System.out.println("Queue is not exist.Please create queue before use"); } else if (se.getErrorCode().equals("TimeExpired")) { System.out.println("The request is time expired. Please check your local machine timeclock"); } se.printStackTrace(); } catch (Exception e) { System.out.println("Unknown exception happened!"); e.printStackTrace(); } client.close(); } }
后续步骤
通过运行
ComsumerDemo
中的main函数,您可以获取订阅队列中的弹性网卡操作完成事件的通知内容,并根据相应的弹性网卡信息实现业务自动化处理。运行代码后的返回结果示例如下图所示,表示成功完成删除弹性网卡的操作。