AWS 使用Lambda实现钉钉机器人报警

前言

aws 支持邮件和短信的报警通知,考虑时效性问题和结合公司的使用情况,需要接入钉钉机器人的告警提醒,为了使用钉钉机器人的告警,我们利用Lambda+SNS,利用Lambda接受SNS的警告信息,然后通过python发送到钉钉机器人上去。

Lambda的配置

  1. 进入lambda服务,路径:服务->搜索,通过lambda关键字可以查找到
    进入后,点击函数->创建函数,构建一个新的Lambda,选择从头开始创作,给函数制定一个名称,语言选择python 3.6
    选填好之后,需要注意,需要设置一个权限,否则无法创建函数。
  2. 配置触发器
    创建完成后会进入函数详情页面,里面需要配置触发器,我们配置为SNS触发,然后选择我们设置好的主题,见下图:
  3. 配置脚本,我们设置完出发器后,添加处理脚步,Lambda可以就订阅制定的SNS主题,有告警发生时,会接收到告警消息,然后可以通过自己的处理脚步处理警告信息。我们在这个页面,添加我们的处理脚本:
# -*- coding: utf-8 -*-
import json
import os
from botocore.vendored import requests


def lambda_handler(event, context):
    url = "https://oapi.dingtalk.com/robot/send?access_token=xxx"
    message = event['Records'][0]['Sns']
    msg = message['Message']
    Timestamp=message['Timestamp']
    Subject=message['Subject']
    if "ALARM" in Subject:
        title="警报!!警报!!"
    elif "OK" in Subject:
        title="故障恢复"
    pagrem={
    "msgtype":"markdown",
        "markdown": {"title":"AWS"+title,
             "text":"## "+title+"\n ### 时间:"+Timestamp+" \n ### 报警主题:"+Subject+" \n ### 内容:"+msg+" \n"
        },
        "at":{
            "atMobiles":[
                "185xxxxxxxx"
            ]
    },
        "isAtAll": "true"
    }
    headers={
        'Content-Type':'application/json'
    }
    request = requests.post(url,data=json.dumps(pagrem),headers=headers)
    
    return request.
  1. 验证,脚本配置好后,我们需要验证一下是否生效,可以通过Lambda的测试功能来实现,见下图:
    我们在红框处点击下拉箭头,点击配置测试事件,进入配置测试事件页面,我们可以选择事件模版,这里我们选择SNS的通知模版,给事件命名,完成事件配置
    事件配置完成后,我们可以点击测试进行验证,通过红框处的日志信息,我们可以看到测试的结果是否成功,同时可以查看自己的钉钉,看机器人是否收到了告警信息。
  2. 错误的处理
    错误的处理,如果钉钉无法收到告警信息,我们可以通过日志进行排查,路径:CloudWatch->日志->见解,选择日志组,然后运行查询,就可以查询当前日志组的日志信息了,可以根据日志信息详情来进行问题分析排查。

通过SNS手动触发日志

服务警告信息实际上是通过SNS发送给Lambda的,我们这里手动模拟触发一下Lambda,看是否可以有效触发钉钉告警。首先进入SNS服务,选择要发送的主题,点击发送消息,进入消息编辑页面,主题设置为:ALARM Hello from Amazon SNS!,消息内容根据需要填写,这里填写为:warning!!!,其他可以不用配置,点击发布消息发送消息出去。我们通过钉钉机器人看到已经收到了告警信息。

用python读取钉钉机器人发送的消息 钉钉机器人抓取消息_发送消息

如果钉钉的告警未收到,可以根据上一节的方法,查找日志,排查问题。