作者:霞慧水灵灵_973 | 来源:互联网 | 2023-08-27 13:12
(1)AWS添加sns,略过(2)添加自定义webhook钉钉机器人,略过。(3)编写lambda函数脚本,利用cloudwatch触发告警。#-*-coding:utf-8-*-
(1)AWS添加sns,略过
(2)添加自定义webhook钉钉机器人,略过。
(3)编写lambda函数脚本,利用cloudwatch触发告警。
# -*- coding: utf-8 -*-
import json
import os
import re
import datetime
from botocore.vendored import requests
def time_format(str_time):
‘‘‘ 时间的时区转换为东8区 ‘‘‘
Ymd = str_time.split(‘T‘)[0]
HMS = str_time.split(‘T‘)[1].split(‘.‘)[0]
str_time = ‘%s %s‘ % (Ymd, HMS)
time = datetime.datetime.strptime(str_time, "%Y-%m-%d %H:%M:%S")
format_time = time + datetime.timedelta(hours=8)
return format_time
def size_b_to_other(size):
"""用于转换容量单位"""
units = [‘B‘, ‘KB‘, ‘MB‘, ‘GB‘, ‘TB‘]
# 处理异常
if size <1024:
return size
# 遍历单位的位置并用取整除赋值
for unit in units:
if size >= 1024:
size //= 1024
else:
size_h = ‘{} {}‘.format(size, unit)
return size_h
size_h = ‘{} {}‘.format(size, unit)
return size_h
def lambda_handler(event, context):
#钉钉机器人url
url = "xxxxxxxx"
# 解析要使用的字段
Sns = event[‘Records‘][0][‘Sns‘]
Subject = Sns[‘Subject‘]
if "ALARM" in Subject:
title = "AWS 报警触发"
tag_word = " 连续"
elif "OK" in Subject:
title = "AWS 报警恢复"
tag_word = " 未连续"
elif "INSUFFICIENT_DATA" in Subject:
title = "AWS 报警异常(数据不足)"
tag_word = " , Insufficient Data 未连续"
Timestamp = Sns[‘Timestamp‘]
Message = Sns[‘Message‘]
Message = json.loads(Message)
try:
Region = Message[‘Region‘]
AlarmName = Message[‘AlarmName‘]
service_key = Message[‘Trigger‘][‘Dimensions‘][0][‘name‘]
service_value = Message[‘Trigger‘][‘Dimensions‘][0][‘value‘]
MetricName = Message[‘Trigger‘][‘MetricName‘]
Namespace = Message[‘Trigger‘][‘Namespace‘]
Period = Message[‘Trigger‘][‘Period‘]
EvaluationPeriods = Message[‘Trigger‘][‘EvaluationPeriods‘]
Threshold = Message[‘Trigger‘][‘Threshold‘]
StateChangeTime = Message[‘StateChangeTime‘]
NewStateReason = Message[‘NewStateReason‘]
AlarmDescription = Message[‘AlarmDescription‘]
if "INSUFFICIENT_DATA" not in Subject:
# 转换cloudwatch单位为友好单位
lastpoint = re.findall(r‘[[](.*?)[)]‘, NewStateReason)
lastpoint_data = size_b_to_other(float(‘%.2f‘ % float(lastpoint[0].split(‘ (‘)[0])))
lastpoint_time = datetime.datetime.strptime(lastpoint[0].split(‘ (‘)[1],"%d/%m/%y %H:%M:%S")
lastpoint_time = lastpoint_time + datetime.timedelta(hours=8)
else:
lastpoint_data = ‘null‘
lastpoint_time = time_format(StateChangeTime)
except:
Message = json.dumps(Message, sort_keys=True, indent=2)
content = title + "\n\n>报警主题:" + Subject + "\n\n>详细信息:" + Message + "\n\n>备注信息:消息解析异常"
pagrem = {
"msgtype":"markdown",
"markdown": {
"title": "AWS告警" + "...." ,
"text":"报警主题 :" + title +
"\n\n>监控指标:" + AlarmName +
"\n\n>报警时间:" + str(lastpoint_time) +
"\n\n>报警资源:" + str(service_key) + " : " + str(service_value) +
"\n\n>报警信息:" + "当前值=" + str(lastpoint_data) + tag_word + str(EvaluationPeriods) + "次达到 " + "阀值=" + str(size_b_to_other(Threshold)) +
"\n\n>业务备注:" + str(AlarmDescription)
},
"at":{
"atMobiles":[
"15527453712"
]
},
"isAtAll": "False"
}
headers={
‘Content-Type‘:‘application/json‘
}
requests.post(url, data=json.dumps(pagrem), headers=headers)
效果图: