背景

服务部署在aws,需要监控运行状态,检测异常,如cost 上升急速,EC2 CPU Utilization过高,DynamoDB Consumed Write Capacity Units高,IoT消息过多,诸如此类的异常,需要发送消息给关注的用户,用户中包括了管理员,运维以及开发人员,进行及时的处理响应。

HTTP终端解决方案

使用Cloud Watch建立警报,给服务设置指标阈值,当达到时触发警报,执行通知发送到终端,终端在发送到钉钉的运维群。以下是整个流程:

模块

Cloud Watch

Amazon CloudWatch 可实时监控您的 Amazon Web Services (AWS) 资源以及您在 AWS 中运行的应用程序。CloudWatch 警报可根据您定义的规则发送通知。警报只会调用操作进行持续的状态变更。CloudWatch 警报将不会调用操作,因为这些操作处于特定状态,该状态必须改变并在指定数量的时间段内一直保持。

创建警报

打开 Cloud Watch 控制台,在导航窗格中,依次选择AlarmsCreate Alarm,在定义警报tab内的操作部分增加通知,选择订阅的SNS主题,如图

SNS

Amazon Simple Notification Service (Amazon SNS) 是一项 Web 服务,用于协调和管理向订阅终端节点或客户交付或发送消息的过程。在 Amazon SNS 中有两种类型的客户端:发布者和订阅者,也称为生产者和消费者。发布者通过创建消息并将消息发送至主题与订阅者进行异步交流,主题是一个逻辑访问点和通信渠道。订阅者在其订阅主题后通过受支持协议中的一种使用或接收消息或通知。

主题是发送消息和订阅通知的信道。它为发布者和用户相互交流提供了一个接入点。一旦一条新的消息已经发布, Amazon SNS 将试图将消息发布至每个已经向主题订阅的终端节点。

创建 & 订阅主题

在 Amazon SNS 控制台中,单击 Create topic,设置主题的名称以及显示名称。

得到Topic Details(主题详细信息),复制ARN

要接收发布至主题的消息,您必须订阅一个端点到该主题。为终端节点订阅主题且确认订阅后,终端节点会接收向该主题发布的所有消息。

回到Amazon SNS 控制台中,单击Create subscription,设置终端节点,topic的ARN黏贴进来。

EC2 Web Service

基于Spring Boot开发的Web应用部署在EC2上,收听SNS的通知,发送消息到钉钉,需要实现SNS和钉钉的两套接口。

处理SNS发来的HTTP Request

当您订阅 HTTP 终端节点时,Amazon SNS 会向其发送一条订阅确认请求。创建订阅时,由于 Amazon SNS 会同时发送此项请求,因此,您的终端节点必须准备好接收和处理此项请求。在您确认订阅前,Amazon SNS 不会向终端节点发送通知。订阅确认后,在已订阅主题上执行发布操作时,Amazon SNS 会向终端节点发送通知。

读取 Amazon SNS 向您的终端节点发送的 HTTP POST 请求,查找标头字段x-amz-sns-message-type,此标头字段将显示Amazon SNS向您发送的消息类型。需要处理如下两种类型消息:SubscriptionConfirmation和Notification。仅当从主题中删除订阅时,方使用UnsubscribeConfirmation消息。

SubscriptionConfirmation

读取 SubscribeURL 值,访问此 URL。要确认订阅并通过此终端节点接收通知,必须访问 SubscribeURL URL(例如,向此 URL 发送 HTTP GET 请求)。访问 URL 时,您将获取与以下 XML 文档相似的响应。文档会在 ConfirmSubscriptionResult 元素内返回终端节点的订阅 ARN。

Notification

读取 Subject 和 Message 值,获取已向主题发布的通知信息。

确保您的终端节点已通过适当的状态代码对来自 Amazon SNS 的 HTTP POST 消息作出响应。此项连接将在 15 秒内超时。在连接超时前,如果您的终端节点返回的状态代码超出 200-4xx 范围,那么 Amazon SNS 会认定消息发送已失败。

确保您的代码能够处理 Amazon SNS 的消息发送重试。如果 Amazon SNS 未能接收到从终端节点发出的发送成功响应,它将会尝试再次发送消息。这适用于包括订阅确认消息在内的所有消息。默认情况下,如果消息初次发送失败,那么 Amazon SNS 会通过失败尝试期间设定为 20 秒的延时进行多达 3 次的尝试。注意 15 秒后消息请求超时。这表示如果因超时引起消息发送失败,那么 Amazon SNS 将在前一次发送尝试后 35 秒左右重新发送。如果您不喜欢默认设置的发送策略,那么您可以在终端节点上设置不同的发送策略。

Sample Code

钉钉

在机器人管理页面选择“自定义”机器人,输入机器人名字并选择要发送消息的群。如果需要的话,可以为机器人设置一个头像。点击“完成添加”。返回Web hook,点击“复制”按钮,即可获得这个机器人对应的Webhook地址,其格式如下

https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx

获取到Webhook地址后,用户可以使用任何方式向这个地址发起HTTP POST 请求,即可实现给该群组发送消息。注意,发起POST请求时,必须将字符集编码设置成UTF-8。

Sample Code

            CloseableHttpClient httpclient = HttpClients.createDefault();
            HttpPost post = new HttpPost("https://oapi.dingtalk.com/robot/send?access_token=xxx");
            StringEntity entity = new StringEntity(res, Charset.forName("UTF-8"));
            entity.setContentEncoding("UTF-8");
            post.addHeader("Content-Type", "application/json");

其中body部分的res变量格式可以设置为如下json格式:

{
    "msgtype": "text", 
    "text": {
        "content": "我就是我, 是不一样的烟火"
    }, 
    "at": {
        "atMobiles": [
            "156xxxx8827", 
            "189xxxx8325"
        ], 
        "isAtAll": false
    }
}

总结

各个模块设置完后,在钉钉的群组中,用户可以收到来自AWS的警报消息,根据消息内容,查找定位问题。

Reference

http://docs.amazonaws.cn/en\_us/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html

http://docs.amazonaws.cn/en\_us/sns/latest/dg/CreateTopic.html

http://docs.amazonaws.cn/en\_us/sns/latest/dg/SendMessageToHttp.html

https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.6RaZeo&treeId=257&articleId=105735&docType=1

results matching ""

    No results matching ""