手把手教程 | 实现Amazon CloudWatch持续报警
背景介绍
监控与报警系统对企业的生产环境来说是不可或缺的,完善的监控与及时的报警通知可以帮助企业快速定位并解决问题,从而减少经济损失。
Amazon CloudWatch是亚马逊云上的统一监控平台,实现对云上所有资源的监控。Amazon CloudWatch Alarm可以基于Amazon CloudWatch Metrics里面的指标,根据您自定义的规则触发警报。通过集成Amazon SNS和Amazon Lambda,您可以实现邮件、短信、企业微信、钉钉、飞书等多种方式的通知。
Amazon CloudWatch
https://aws.amazon.com/cloudwatch/
Amazon CloudWatch Alarm
https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html
Amazon SNS
https://aws.amazon.com/sns/
Amazon Lambda
https://aws.amazon.com/lambda/
但是,Amazon CloudWatch Alarm仅会在警报从【正常】状态转变为【告警】状态时触发一次警报。此后,即使警报仍然处于【告警】状态,也不会有新的通知产生。
本文将介绍,如何基于无服务器函数编排工具Amazon Step Functions,在警报被触发后轮询警报状态,实现持续报警的效果,以强调警报的存在,确保您系统中的问题可以得到足够的重视。
Amazon Step Functions
https://aws.amazon.com/step-functions/
???? 想要了解更多亚马逊云科技最新技术发布和实践创新,敬请关注在上海、北京、深圳三地举办的2021亚马逊云科技中国峰会!点击图片报名吧~上海站峰会已经圆满落幕,更多精彩内容,敬请期待北京、深圳分会吧!
架构图
本方案包含如下组件:
您可以根据您的需要,创建Amazon CloudWatch Alarm。
Amazon CloudWatch Alarm会通过Amazon EventBridge,触发Amazon Step Functions工作流
Amazon Step Functions工作流的具体内容见下文。工作流中会包含以下两个函数:
HandleAlarm:您自定义的警报处理函数,用来实现通知逻辑。
CheckAlarm:下文会指导您创建的警报状态检查函数,用来判断是否继续发出通知。
配置步骤
创建Lambda函数以检查警报状态
创建一个Lambda函数,命名为CheckAlarm,使用Amazon SDK检测警报状态。比如,如果使用Python 3.8作为runtime创建此函数,可以参考如下代码:
import boto3cloudwatch = boto3.client('cloudwatch')def lambda_handler(event, context):print(f'event={event}')try:# check alarm stateres = cloudwatch.describe_alarms(AlarmNames=[event['alarmName']])print(f'res={res}')if 'MetricAlarms' in res:return res['MetricAlarms'][0]['StateValue'] # 'OK'|'ALARM'|'INSUFFICIENT_DATA'elif 'CompositeAlarms' in res:return res['CompositeAlarms'][0]['StateValue'] # 'OK'|'ALARM'|'INSUFFICIENT_DATA'else:print('no alarms found')return 'ERROR'except Exception as e:print(e)return 'ERROR'
此函数需要调用
cloudwatch:DescribeAlarms API,所以需要为此函数所使用的IAM Role添加此权限。
此函数会自动从event 参数中解析出警报
的名称。最终返回值为OK/ALARM/INSUFFICIENT_DATA/ERROR中的一个。
创建Amazon Step Functions
使用如下内容创建Step Functions工作流:
{"Comment": "Handle Alarm Periodically","StartAt": "In Alarm?","States": {"In Alarm?": {"Type": "Choice","Choices": [{"Variable": "$.detail.state.value","StringEquals": "ALARM","Next": "HandleAlarm"}],"Default": "Pass"},"HandleAlarm": {"Type": "Task","Resource": "arn:aws:states:::lambda:invoke","OutputPath": "$.Payload","Parameters": {"FunctionName": "<AlarmHandler>","Payload.$": "$"},"Retry": [{"ErrorEquals": ["Lambda.ServiceException","Lambda.AWSLambdaException","Lambda.SdkClientException"],"IntervalSeconds": 2,"MaxAttempts": 6,"BackoffRate": 2}],"Next": "Wait","InputPath": "$$.Execution.Input"},"Wait": {"Type": "Wait","Seconds": 300,"Next": "CheckAlarm"},"CheckAlarm": {"Type": "Task","Resource": "arn:aws:states:::lambda:invoke","OutputPath": "$.Payload","Parameters": {"FunctionName": "<CheckAlarm>","Payload.$": "$"},"Retry": [{"ErrorEquals": ["Lambda.ServiceException","Lambda.AWSLambdaException","Lambda.SdkClientException"],"IntervalSeconds": 2,"MaxAttempts": 6,"BackoffRate": 2}],"Next": "Still In Alarm?","InputPath": "$$.Execution.Input.detail"},"Still In Alarm?": {"Type": "Choice","Choices": [{"Variable": "$","StringEquals": "ALARM","Next": "HandleAlarm"},{"Variable": "$","StringEquals": "OK","Next": "Pass"}],"Default": "Fail"},"Pass": {"Type": "Pass","End": true},"Fail": {"Type": "Fail"}}
}
您需要把上述文档中的如下内容进行替换:
<AlarmHandler>: 响应警报的Lambda函数的ARN。您需要自行创建此函数,并在里面实现您的通知/处理逻辑。
<CheckAlarm>: 刚才创建的CheckAlarm函数的ARN。
如果使用此文档创建Step Functions,那么轮询周期为5分钟(300秒)。您可以通过修改文档中的下述内容来修改轮询周期:
"Wait": {"Type": "Wait","Seconds": 300, // 修改这个值,单位为秒"Next": "CheckAlarm"
},
上述文档会创建如下图所示的状态机:
当警报状态改变,触发此状态机时,会顺序执行下述操作:
警报的状态是否是ALARM。如果不是,则跳转到Pass状态并结束状态机
调用HandleAlarm函数,根据您自定义的逻辑发出通知
进入Wait状态,等待一段时间
调用CheckAlarm函数,判断警报状态
如果函数返回OK,即警报已经恢复正常,则进入Pass 状态并结束状态机
如果函数返回ALARM,即警报仍然在告警,则回到步骤1
如果函数返回其他值,视为故障并进入Fail状态,结束状态机
此状态机的两个Lambda函数都在InputPath 中引用了$$.Execution.Input 变量,使它们即使被多次触发,或者在循环中被触发,也会有一致的输入值。
$$.Execution.Input
https://docs.aws.amazon.com/step-functions/latest/dg/input-output-contextobject.html
配置CloudWatch警报
根据您的需求,创建CloudWatch警报。此方案会使用EventBridge触发Step Functions,所以它在创建的时候不需要配置任何通知。删除所有的通知,并直接点击Next.
创建完毕后,复制EventBridge规则
创建EventBridge规则,目标为刚才创建的Step Functions状态机:
至此,每当警报状态发生改变的时候,状态机就会被触发。如果警报的状态为【报警中】,状态机就会发出持续通知。
结束语
综上所述,您只需要准备好您自定义的警报处理函数HandleAlarm ,并将其集成到上述系统中,即可实现CloudWatch持续报警,提升您的报警触达率,加速问题的解决。
本篇作者
王景辉
亚马逊云科技解决方案架构师
负责基于亚马逊云科技的云计算方案的咨询与架构设计,同时致力于亚马逊云服务知识体系的传播与普及。目前关注游戏行业。
听说,点完下面4个按钮
就不会碰到bug了!
手把手教程 | 实现Amazon CloudWatch持续报警相关推荐
- 转:海外购之Amazon亚马逊购物手把手教程
来源:http://www.smzdm.com/overseas-purchases-of-amazon-amazon-shopping-shoubashoujiao-process.html 本篇教 ...
- Amazon.com 美国亚马逊 直邮中国 手把手教程(转)
什么值得买已经发布2014最新版美亚直邮攻略 海淘攻略:美国亚马逊 直邮服务 手把手教程(2014最新版) ,调整幅度较大,值友们可以移步到新攻略中查看. 相比德国.英国亚马逊,美国亚马逊的大部分商品 ...
- Zadig 推出手把手教程,一起来尝试吧!
你是否也有这样的疑问? "我的业务可能有特殊性,是否可以接入一两个模块使用 Zadig 看看效果?" "我有明确的痛点,但是看文档摸索起来效率实在有点低,能否快速找 ...
- 配置JDK环境变量(最简单手把手教程)
目录 简介 JDK卸载 准备JDK 环境配置 校检配置 简介 本文博客只为自己记忆,就新手最简单手把手教程 JRE(Java Runtime Environment ) Java运行环境,用来运行JA ...
- [java手把手教程][第二季]java后端博客系统文章系统——No10
项目github地址:github.com/pc859107393- 实时项目同步的地址是国内的码云:git.oschina.net/859107393/m- 我的简书首页是:www.jianshu. ...
- 云监控介绍 - Amazon CloudWatch
云监控介绍 - Amazon CloudWatch 作者:张航东 本文主要用于个人学习.总结,欢迎转载,但请务必注明作者和出处,感谢! Amazon CloudWatch 是一项针对 AWS 云资源和 ...
- 图文手把手教程--ESP32 MQTT对接EMQX本地服务器(VSCODE+ESP-IDF)
本文内容 1)使用MQTT_TCP例程,ESP32通过MQTT协议与MQTT本地服务器(EMQX)进行通信. 2)如何搭建EMQX MQTT本地服务器. 3)如何使用MQTT.fx客户端调试工具或MQ ...
- Amazon CloudWatch 介绍/学习
1.应用场景 主要用于没有移动网络信号差, 又需要网络的情况. 2.学习/操作 背景 目前公司采用的服务 1.介绍 Amazon CloudWatch 是一种面向开发运营工程师.开发人员.站点可靠性工 ...
- 腾讯云服务器购买详细流程(手把手教程)
第一次购买腾讯云服务器很多同学不会选择,云服务吧写了一篇手把手教程,分享给大家: 腾讯云服务器购买流程 购买腾讯云服务器很简单,首先你需要注册一个腾讯云账号,使用微信或QQ注册即可,很简单.账号注册后 ...
最新文章
- ZOJ Monthly, June 2014 月赛BCDEFGH题题解
- 微型计算机存取速度,微型计算机中,存取速度由快到慢排序:
- spring入门(11)-spring与hibernate整合完成增删改查的操作(封装HibernateTemplate模版类对象)
- 海思芯片对比选型_海思芯片的选型及特征参考说明大全
- 如何通过Meta Learning实现域泛化(Domain Generalization)?
- python之路 mysql 博客园_Python之路(二十七):Mysql(下)
- 计算机休眠怎么唤醒,电脑休眠后,就无法唤醒了?怎么办?快速教你解决这个问题...
- shell if语句特殊用法(高级用法),工具安装判断
- 5_数据分析—数据可视化
- 人脸关键点:TCDCN-Facial Landmark Detection by Deep Multi-task Learning
- 大咖来信 | 张亚勤@2018:终日“闭关”读论文,思考终极算法
- jQuery基础--选择器
- SQL经典语句大全及应用示例汇总
- 拉卡拉前三季度净利润7.35亿元 继续保持高速增长态势
- idea在自动注入DiscoveryClient的时候报错
- 【STM32利用CuBe MX生成HID设备】2-给游戏控制器添加X\Y轴
- Java基础到Java进阶——Java小白的历练之路------从0到1,开卷!
- springCloud openFeign返回数据转型问题
- 最新ie图标变灰css,css+js整站变灰(兼容IE7+)
- 行驶证OCR识别应用领域有哪些?