架构图
创建飞书告警机器人
飞书机器人的创建方法此处不表,企业微信方案与此相同
记录机器人webhook地址
创建Lambda
https://us-east-1.console.aws.amazon.com/lambda/home?region=us-east-1#/discover
创建函数
-
命名函数名称
-
选择运行时,脚本语言
-
选择架构
编辑函数内容
代码:lambda_funcation.py
import requests
import json
import os
from datetime import datetime
import pytz
def lambda_handler(event,context):
message = event['Records'][0]['Sns']
date_time_str = message['Timestamp']
Subject = message['Subject']
sns_message = json.loads(message['Message'])
region = message['TopicArn'].split(':')[-3]
new_state_reason = sns_message['NewStateReason']
# 事件中获取到UTC美国东部时区的时间,因此做时间转换
date_time_format = '%Y-%m-%dT%H:%M:%S.%fZ'
us_dt = datetime.strptime(date_time_str, date_time_format).replace(tzinfo=pytz.utc)
cn_timezone = pytz.timezone('Asia/Shanghai')
cn_dt = us_dt.astimezone(cn_timezone)
cn_dt_str = cn_dt.strftime('%Y-%m-%d %H:%M:%S.%f %Z%z')
if "ALARM" in Subject:
title = '[AWS CDN] 警报!!'
elif "OK" in Subject:
title = '[AWS CDN] 故障恢复!'
else:
title = '[AWS CDN] 警报状态异常'
content = "**【详情信息】**\n" \
+ "**时间**: " + cn_dt_str + "\n" \
+ "**内容**: " + Subject + "\n" \
+ "**状态**: <font color=\"comment\">{old}</font> => <font color=\"warning\">{new}</font>".format(old=sns_message['OldStateValue'],
new=sns_message['NewStateValue']) + "\n" \
+ "\n" \
+ "**AWS区域**: " + sns_message['Region'] + "\n" \
+ "**监控资源对象**: " + sns_message['Trigger']['Namespace'] + "\n" \
+ "**监控指标**: " + sns_message['Trigger']['MetricName'] + "\n" \
+ "\n" \
+ "**报警名称**: " + sns_message['AlarmName'] + "\n" \
+ "**报警创建方式**: " + sns_message['AlarmDescription'] + "\n" \
+ "**报警细节**: " + new_state_reason + "\n" \
+ "\n" \
+ "详情请点击:[Alarm](https://{region}.console.aws.amazon.com/cloudwatch/home?region={region}#s=Alarms&alarm={alarm})".format(region=region, alarm=sns_message['AlarmName'])
data_alert = {
"msg_type": 'interactive',
"card": {
"config": {
"wide_screen_mode": True
},
"header": {
"template": "red",
"title": {
"tag": "plain_text",
"content": title
}
},
"elements": [
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": content
}
},
]
}
}
data_recover = {
"msg_type": 'interactive',
"card": {
"config": {
"wide_screen_mode": True
},
"header": {
"template": "green",
"title": {
"tag": "plain_text",
"content": title
}
},
"elements": [
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": content
}
},
]
}
}
WEBHOOK_KEY = os.getenv('WEBHOOK_KEY')
try:
if "OK" in Subject:
response = requests.post(
WEBHOOK_KEY,
json=data_recover)
else:
response = requests.post(
WEBHOOK_KEY,
json=data_alert)
print(response)
print(response.json())
except Exception as e:
print("err=" + str(e))
return {"error": e}
配置环境变量
脚本引用变量WEBHOOK_KEY,在脚本配置中添加
根据代码中引用的模块添加层
如何创建层文件
参考链接:https://repost.aws/zh-Hans/knowledge-center/lambda-import-module-error-python
# 本地服务器打包
mkdir python
pip3 install --target ./python requests
zip -r requests.zip python
上传后在lanbda中添加层
创建SNS
效果如下,主题将信息发送到多个订阅
创建主题
选择"标准"类型,填写主体名称即可
创建订阅
可以选择多种协议,比如AWS Lambda、电子邮件
选择上一节创建的lambda
创建告警CloudWatch
查询指标创建告警
条件配置
通知配置
选择上一节创建的SNS主题,仅配置“确定”和“告警中”两种状态。