我尝试将 CloudWatch 警报通知给 Teams/Chatwork!

大家好!
我是来自Beyond Inc.大阪办公室的拉面大王Hide。
这是我的第四篇帖子。
在本文中,我将介绍我最近在一个项目中实现的一种方法,用于将 CloudWatch 警报通知给 Teams 和 Chatwork。
我在之前的博客文章中也写到了如何备考 AWS Certified SAA(解决方案架构师助理)认证,如果您感兴趣,请去看看!
配置图
配置图如上所示。
CloudWatch 会检索 EC2 指标,并在发生警报时通知 SNS。然后,SNS 将从 CloudWatch 接收到的各种值发送到 Lambda。
Lambda 函数随后会对这些值进行格式化,并将它们发送到各个通信工具。
这看起来可能很复杂,因为它用到了各种 AWS 资源,但实现起来其实很简单,让我们一起来吧!
施工步骤
① 创建 Lambda 函数
①-①:点击 Lambda > 函数 > 创建函数
①-②:指定以下信息,然后单击[创建函数]。
● 函数名称:请指定您选择的名称
● 运行时:请指定 Python 3。
①-③:粘贴每个通信工具的代码
*如果您不想直接在代码中写入 Webhook URL、身份验证令牌等,请设置环境变量。
● 团队代码
#!/usr/bin/python3.8 import boto3 import json from urllib.request import Request, urlopen # 分配 WebhookURL HOOK_URL = "https://xxxxxxxxxxxxxxxx" def lambda_handler(event, context): # 生产环境告警 #message = json.loads(event['Records'][0]['Sns']['Message']) #subject = event['Records'][0]['Sns']['Subject'] # 告警测试 message = {"AlarmName":"test-CPUUtilization","AWSAccountId":"xxxxxxxxxxx","NewStateValue":"ALARM","NewStateReason":"阈值已跨越:最近 1 个数据点中有 1 个 [1.8083480560463125 (xx/xx/xx xx:xx:xx)] 小于或等于阈值 (80.0)(最小值 1 OK -> ALARM 转换的数据点)。","StateChangeTime":"xxxx-xx-xxTxx:xx:xx.xxx+xxxx","Region":"亚太地区(东京)"} subject = "ALARM: test-CPUUtilization in Asia Pacific (Tokyo)" #Alarm information alarm_name = message["AlarmName"] new_state = message["NewStateValue"] reason = message["NewStateReason"] alarm_time = message["StateChangeTime"] account_id = message["AWSAccountId"] region = message["Region"] alert_url = "https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#alarmsV2:alarm/%s" %alarm_name alert_msg = { 'title': "%s" %subject, 'text': '<br>报警名称:%s' %alarm_name + '<br>状态:%s' %new_state + '<br>报警原因:%s' %reason + '<br><br>报警发生时间(UTC):%s' %alarm_time + '<br>账户 ID:%s' %account_id + '<br>区域:%s' %region + '<br><br>报警网址:<br> %s' %alert_url } # 将字典转换为字符串并生成 HTTP 请求 req = Request(HOOK_URL, json.dumps(alert_msg).encode('utf-8')) # 发送 urlopen(req)
● Chatwork 代码
#!/usr/bin/python3.8 import boto3 import json import urllib from urllib.request import Request, urlopen #指定房间 ID room_id = 'xxxxxxxxxxx' #指定令牌 tokun = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx' chatwork_URL = "https://api.chatwork.com/v2/rooms/%s/messages" %room_id def lambda_handler(event, context): #生产环境告警 #message = json.loads(event['Records'][0]['Sns']['Message']) #subject = event['Records'][0]['Sns']['Subject'] #告警测试 message = {"AlarmName":"test-CPUUtilization","AWSAccountId":"xxxxxxxxxxx","NewStateValue":"ALARM","NewStateReason":"Threshold Crossed: 1 out of the last 1 datapoints "> [1.8083480560463125 (xx/xx/xx xx:xx:xx)] 小于或等于阈值 (80.0)(OK -> ALARM 转换至少需要 1 个数据点)。“状态变更时间”:“xxxx-xx-xxTxx:xx:xx.xxx+xxxx”“区域”:“亚太地区(东京)”} subject = “警报:亚太地区(东京)的 CPU 利用率测试” # 警报信息 alarm_name = message["AlarmName"] new_state = message["NewStateValue"] reason = message["NewStateReason"] alarm_time = message["StateChangeTime"] account_id = message["AWSAccountId"] region = message["Region"] alert_url = "https://ap-northeast-1.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#alarmsV2:alarm/%s" %alarm_name alert_msg = { 'body': '[info][title]%s[/title]'%subject+ '告警名称:%s'%alarm_name +'\n'+ '状态:%s'%new_state +'\n'+ '告警原因:%s'%reason +'\n'+ '告警发生时间(UTC):%s'%alarm_time +'\n'+ '账户 ID:%s'%account_id +'\n'+ '区域:%s'%region +'\n\n'+ '告警 URL:%s'%alert_url + '[/info]' } headers = { 'X-ChatWorkToken': '%s' %tokun } #生成查询字符串 data = urllib.parse.urlencode(alert_msg) #转换字符编码 data = data.encode('utf-8') #生成 HTTP 请求 req = Request(chatwork_URL, data,headers) #发送 urlopen(req)
*注:每种通信工具的消息表示法
● 聊天工作
https://developer.chatwork.com/docs/message-notation
● AWS
https://aws.amazon.com/jp/premiumsupport/knowledge-center/sns-lambda-webhooks-chime-slack-teams
①-④:点击【部署】
①-⑤:点击【测试】
①-⑥:指定以下信息并单击[保存]。
● 事件名称:请指定您选择的名称
● 模板 - 选项:sns-notification
①-⑦:点击【测试】
①-⑧:检查测试报警是否已通知
● 团队

● 聊天工作
①-⑨:按如下方式编辑生产环境报警通知的变量:
#生产环境告警消息 = json.loads(event['Records'][0]['Sns']['Message']) subject = event['Records'][0]['Sns']['Subject'] #告警测试 #message = {"AlarmName":"test-CPUUtilization","AlarmDescription":"null","AWSAccountId":"xxxxxxxxxxx","AlarmConfigurationUpdatedTimestamp":"xxxx-xx-xxTxx:xx:xx.xxx+xxxx","NewStateValue":"ALARM","NewStateReason":"阈值已跨越:最近 1 个数据点中有 1 个 [1.8083480560463125 (xx/xx/xx xx:xx:xx)] 小于或等于阈值 (80.0)(OK -> ALARM 至少需要 1 个数据点)转换).","StateChangeTime":"xxxx-xx-xxTxx:xx:xx.xxx+xxxx","Region":"亚太地区(东京)","AlarmArn":"arn:aws:cloudwatch:ap-northeast-1:xxxx:alarm:test-CPUUtilization","OldStateValue":"OK","OKActions":[]AlarmActions":["arn:aws:sns:ap-northeast-1:xxxxxxxx:test"]InsufficientDataActions":[]Trigger":{"MetricName":"CPUUtilization","Namespace":"AWS/EC2","StatisticType":"Statist ic","统计信息":"平均值","单位":"null","维度":[{"值":"i-07876365e6af5774f","名称":"实例 ID"}],"周期":300,"评估周期":1,"要发出警报的数据点":1比较运算符":"小于或等于阈值","阈值":80.0处理缺失数据"缺失","评估低样本计数百分位数"}} #subject = "警报:亚太地区(东京)的 CPU 利用率测试"
② 创建社交网站
②-①:点击 SNS > 话题 > 创建话题
②-②:填写以下信息,然后点击【创建主题】
● 类型:标准
● 名称: 请输入您喜欢的名字
②-③:点击【创建订阅】
②-④:填写以下信息,然后点击【创建订阅】
* Lambda ARN 信息位置
函数 ARN 位于已创建函数 > 函数摘要的最右侧,请从那里复制它。
②-⑤:检查状态

③ 创建 CloudWatch
我们将假设 EC2 已创建。
③-①:CloudWatch > 警报 > 点击 [创建警报]
③-②:选择您偏好的指标
③-③:选择报警条件
③-④:通知设置
③-⑤:指定报警名称
③-⑥:点击【创建闹钟】
④ 报警通知测试
④-①:检查报警是否开启。
④-②:查看报警是否已通知
● 团队
● ChatWork
*注:
如需查看所有 CloudWatch 告警信息,可通过编辑 alert_msg 变量的内容进行查看,如下所示。
■ 团队
alert_msg ={ "text":"%s" %message }
■ 聊天工作
alert_msg = { 'body': '%s' %message }
[输出结果]
{"AlarmName":"test-CPUUtilization","AlarmDescription":"null","AWSAccountId":"xxxxxxxxxxx","AlarmConfigurationUpdatedTimestamp":"xxxx-xx-xxTxx:xx:xx.xxx+xxxx","NewStateValue":"ALARM","NewStateReason":"阈值已跨越:最近 1 个数据点中有 1 个 [1.8083480560463125 (xx/xx/xx xx:xx:xx)] 小于或等于阈值 (80.0)(OK -> ALARM 转换至少需要 1 个数据点)。","StateChangeTime":"xxxx-xx-xxTxx:xx:xx.xxx+xxxx","Region":"亚太地区" (东京)","AlarmArn":"arn:aws:cloudwatch:ap-northeast-1:xxxx:alarm:test-CPUUtilization","OldStateValue":"OK","OKActions":[],"AlarmActions":["arn:aws:sns:ap-northeast-1:xxxxxxxx:test"],"InsufficientDataActions":[],"Trigger":{"MetricName":"CPUUtilization","Namespace":"AWS/EC2","StatisticType":"Statistic","Statistic":"AVERAGE","Unit":"null","Dimensions":[{"value":"i-xxxxxxxxxxxxxx","name":"InstanceId"}],"Period":300,"EvaluationPeriods":1,"Datapoi ntsToAlarm:1,比较运算符:小于或等于阈值,阈值:80.0,处理缺失数据:缺失,评估低样本计数百分位数:""}}
概括
感谢您的辛勤工作!
这次,我们介绍了如何将警报内容通知到各个通信工具!
Slack 可以通过 AWS Chatbot 轻松发出警报通知,但 CloudWatch 和 SNS 没有向 Teams 和 Chatwork 发送警报的功能,因此这是您发出警报的方法,尽管这很困难。
您还可以编辑代码,根据处理情况发送消息。发送警报通知时,请充分利用此功能!
4



















