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

* 拉面新(大阪府茨木市)

大家好!
我是来自Beyond Inc.大阪办公室的拉面大王Hide。
这是我的第四篇帖子。

在本文中,我将介绍我最近在一个项目中实现的一种方法,用于将 CloudWatch 警报通知给 Teams 和 Chatwork。

我在之前的博客文章中也写到了如何备考 AWS Certified SAA(解决方案架构师助理)认证,如果您感兴趣,请去看看!

【考生必看】教你如何学习AWS认证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)

*注:每种通信工具的消息表示法

● Teams
https://docs.microsoft.com/ja-jp/microsoftteams/platform/webhooks-and-connectors/how-to/connectors-using?tabs=cURL

● 聊天工作
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
● 端点:*见下文

* 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
加载中...
4 票,平均:1.00 / 14
7,469
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

隐藏@基础设施工程师

这一切都始于一次非常有趣的采访。
大阪系统解决方案部门的一名职业中期员工。我的
工作是构建和运营服务器和云!
我拥有 LPIC1、AWS SAA 和 OCI 架构师助理资格。

其实我很喜欢拉面,
已经调查过大阪100多家店了(。-∀-)我要努力成为Nibi Beyond

我也在Twitter,所以请关注我(´∇`)
点击右上角的Twitter标记! !