aws 支持邮件和短信的报警通知,为了使用钉钉机器人的告警,需要使用Lambda+SNS,利用Lambda接受SNS的警告信息,然后通过Lambda python函数发送到钉钉机器人上去。
1,创建钉钉机器人, 可以先建一个内部钉钉群,群里都是需要接收告警的用户,参考网址: https://ding-doc.dingtalk.com/doc#/serverapi3/pghqkk
2,创建SNS主题,不需要创建订阅,后期lambda创建触发器选择创建的sns主题,会自动订阅
3,进入lambda服务-->选择函数-->创建函数
4,在创建函数页面,填入[函数名称] --- 选择运行语言[python3.8] -- 执行角色[创建具有基本 Lambda 权限的新角色] -- 点击创建函数
5,在函数面板-->Designer分类下-->点击[触发器]--选择sns,并关联第二步创建的主题
6,在函数面板-->函数代码-->almbda_function.py 文件输入下面代码,token,secret,在钉钉机器人设置中获取
#_*_coding:utf-8_*_
# Author: liaojunhua
# python 3.8
# Creation time: 2020/6/5 14:37
import time
import hmac
import hashlib
import base64
import urllib.parse
import json
import os
import requests
def lambda_handler(event, context):
headers = { 'Content-Type': 'application/json;charset=utf-8' }
token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
timestamp = str(round(time.time() * 1000))
secret = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
#get url
api_url = "https://oapi.dingtalk.com/robot/send?access_token={}×tamp={}&sign={}".format(token, timestamp, sign)
#msg setting
message = event['Records'][0]['Sns']
Timestamp = message['Timestamp']
Subject = message['Subject']
#sns_message = message['Message']
sns_message = json.loads(message['Message'])
if "ALARM" in Subject:
title = 'AWS: 告警!! 告警!!'
elif "OK" in Subject:
title = 'AWS: 故障恢复'
else:
title = 'AWS'
content = "### {title}".format(title=title) + \
"\n> #### 时间: " + Timestamp + \
"\n> #### 主题: " + Subject + \
"\n> #### 状态: " + sns_message['OldStateValue'] + " => " + sns_message['NewStateValue'] + \
"\n> #### 名称: " + sns_message['AlarmName'] + \
"\n> #### 地区: " + sns_message['Region'] + \
"\n> #### 产品: " + sns_message['Trigger']['Namespace'] + \
"\n> #### 服务: " + sns_message['Trigger']['MetricName'] + \
"\n> #### 详情: " + sns_message['AlarmDescription']
msg = {
"msgtype": "markdown",
"markdown": {
"title": title,
"text": content
},
"at": {
"isAtAll": "true"
}
}
#request
request = requests.post(url=api_url, data=json.dumps(msg), headers=headers).content.decode("utf8")
return request
7,在函数面板-->点击[保存]-->配置[测试事件]-->点击测试,发现会出现错误,aws 不支持requests模块导入
8,在本地centos 环境中创建目录,需要python pip环境支持
#---创建项目目录,并创建lambda_function.py文件,把上述第五步骤的代码copy到lambda_function.py中
#mkdir dingdingrobot
#cd dingdingrobot
#vim lambda_function.py
#---在文件目录中执行
#pip install requests -t .
#---把文件压缩打包,并导出保存
#zip -r9 function.zip .
9,在函数面板-->函数代码-->代码输入种类-->选择上传.zip文件,并点击右上角保存
10,点击测试,钉钉群里里面就能收到消息了,如收不到, 可以查看测试后的报错信息,也可以在aws CloudWatch --> 日志组查看日志