AWS 使用Lambda实现钉钉机器人报警
前言
aws 支持邮件和短信的报警通知,考虑时效性问题和结合公司的使用情况,需要接入钉钉机器人的告警提醒,为了使用钉钉机器人的告警,我们利用Lambda+SNS,利用Lambda接受SNS的警告信息,然后通过python发送到钉钉机器人上去。
Lambda的配置
- 进入lambda服务,路径:服务->搜索,通过lambda关键字可以查找到
进入后,点击函数->创建函数,构建一个新的Lambda,选择从头开始创作,给函数制定一个名称,语言选择python 3.6
选填好之后,需要注意,需要设置一个权限,否则无法创建函数。 - 配置触发器
创建完成后会进入函数详情页面,里面需要配置触发器,我们配置为SNS触发,然后选择我们设置好的主题,见下图: - 配置脚本,我们设置完出发器后,添加处理脚步,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.
- 验证,脚本配置好后,我们需要验证一下是否生效,可以通过Lambda的测试功能来实现,见下图:
我们在红框处点击下拉箭头,点击配置测试事件,进入配置测试事件页面,我们可以选择事件模版,这里我们选择SNS的通知模版,给事件命名,完成事件配置
事件配置完成后,我们可以点击测试进行验证,通过红框处的日志信息,我们可以看到测试的结果是否成功,同时可以查看自己的钉钉,看机器人是否收到了告警信息。 - 错误的处理
错误的处理,如果钉钉无法收到告警信息,我们可以通过日志进行排查,路径:CloudWatch->日志->见解,选择日志组,然后运行查询,就可以查询当前日志组的日志信息了,可以根据日志信息详情来进行问题分析排查。
通过SNS手动触发日志
服务警告信息实际上是通过SNS发送给Lambda的,我们这里手动模拟触发一下Lambda,看是否可以有效触发钉钉告警。首先进入SNS服务,选择要发送的主题,点击发送消息,进入消息编辑页面,主题设置为:ALARM Hello from Amazon SNS!,消息内容根据需要填写,这里填写为:warning!!!,其他可以不用配置,点击发布消息发送消息出去。我们通过钉钉机器人看到已经收到了告警信息。
如果钉钉的告警未收到,可以根据上一节的方法,查找日志,排查问题。