在对弹性网卡完成创建、绑定、解绑或删除操作时,系统会产生弹性网卡操作完成事件,您可以通过阿里云云监控与消息服务,实现对弹性网卡操作完成事件通知的业务自动化处理。本文以Java代码为例,介绍基于弹性网卡操作完成事件实现业务自动化处理的相关操作。

背景信息

阿里云云监控支持在设置事件通知时关联消息服务MNS。当您通过云监控关联了弹性网卡操作完成事件和消息服务MNS时,可以同步将事件通知发送至消息服务MNS,然后您可以通过消息服务MNS(例如队列)获取该事件相关的信息,并根据消息内容触发后续动作,实现业务自动化处理。本最佳实践主要分为以下几步:
  1. 在配置业务自动化处理之前,您需要分别创建队列以及云监控的报警规则,用于监控并收集弹性网卡操作完成事件。具体操作,请参见准备工作
  2. 配置业务自动化处理。本文以Java代码为例,轮询队列中的每一条消息,并将消息中包含的弹性网卡操作完成事件打印输出。具体操作,请参见基于Java代码自动化处理弹性网卡操作完成事件
说明 弹性网卡操作完成事件正在邀测中,如需使用,请提交工单

准备工作

  1. 创建消息服务MNS队列。
    本文仅介绍最佳实践所必需的操作步骤,关于创建队列的更多信息,请参见创建队列
    1. 登录消息服务MNS控制台
    2. 在左侧导航栏,单击队列列表
    3. 在顶部菜单栏,选择地域。
      队列所属地域需要和弹性网卡所属地域一致。例如,您需要监控的弹性网卡所属地域为华东1(杭州),则需要在华东1(杭州)地域创建队列。
    4. 单击创建队列
    5. 创建队列面板中,完成队列相关配置。
      本示例中,自定义队列名称为eni-operate-completed-event,其他配置项保持默认配置。
    6. 单击确定
      成功创建的队列如下图所示。队列信息
  2. 创建云监控报警事件。
    本文仅介绍最佳实践所必需的操作步骤,关于创建事件报警的更多信息,请参见设置事件通知
    1. 登录云监控管理控制台
    2. 在左侧导航栏,单击事件监控
    3. 事件监控页面,单击报警规则页签,然后单击创建事件报警
    4. 创建/修改事件报警页面,完成以下配置。
      • 报警规则名称:自定义名称。本示例中,自定义事件通知名称为eni-event-test-rule。
      • 事件类型:选择系统事件
      • 产品类型:选择云服务器ECS
      • 事件类型:选择状态通知
      • 事件等级:选择信息
      • 事件名称:选择网卡操作完成
      • 资源范围:本示例保持默认配置。您可以根据需要自行设置。
      • 报警方式:本示例仅选中消息服务队列,并根据已经创建好的队列信息,设置地域队列。您可以根据需要自行设置多种报警方式。
    5. 单击确定
      创建成功的报警规则如下图所示。报警规则

基于Java代码自动化处理弹性网卡操作完成事件

本文提供的Java代码示例均基于JDK 1.8完成测试,在实际处理过程中请基于您所使用的开发工具、编程语言等情况自行调整并测试。

消息服务MNS提供了关于队列操作的完整代码示例。更多信息,请参见Java SDK版本说明

  1. 在本地主机当前的用户目录下,手动创建名为.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信息。
  2. 基于Java开发工具创建Maven项目。
    在配置业务自动化处理前,请确保已通过开发工具(Eclipse、IntelliJ IDEA等)创建了一个Maven项目。
  3. 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.73</version>
      </dependency>
  4. 创建实体类,用于定义弹性网卡操作完成事件的结构体。
    本示例中实体类命名为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;
        }
    }
  5. 创建弹性网卡操作完成事件的业务自动化处理代码文件。
    本示例中,实现业务自动化处理的类名为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函数,您可以获取订阅队列中的弹性网卡操作完成事件的通知内容,并根据相应的弹性网卡信息实现业务自动化处理。运行代码后的返回结果示例如下图所示,表示成功完成删除弹性网卡的操作。删除网卡事件通知