背景介绍

监控与报警系统对企业的生产环境来说是不可或缺的,完善的监控与及时的报警通知可以帮助企业快速定位并解决问题,从而减少经济损失。

Amazon CloudWatch是亚马逊云上的统一监控平台,实现对云上所有资源的监控。Amazon CloudWatch Alarm可以基于Amazon CloudWatch Metrics里面的指标,根据您自定义的规则触发警报。通过集成Amazon SNSAmazon 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"
},

上述文档会创建如下图所示的状态机:

当警报状态改变,触发此状态机时,会顺序执行下述操作:

  1. 警报的状态是否是ALARM。如果不是,则跳转到Pass状态并结束状态机

  2. 调用HandleAlarm函数,根据您自定义的逻辑发出通知

  3. 进入Wait状态,等待一段时间

  4. 调用CheckAlarm函数,判断警报状态

  5. 如果函数返回OK,即警报已经恢复正常,则进入Pass 状态并结束状态机

  6. 如果函数返回ALARM,即警报仍然在告警,则回到步骤1

  7. 如果函数返回其他值,视为故障并进入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持续报警相关推荐

  1. 转:海外购之Amazon亚马逊购物手把手教程

    来源:http://www.smzdm.com/overseas-purchases-of-amazon-amazon-shopping-shoubashoujiao-process.html 本篇教 ...

  2. Amazon.com 美国亚马逊 直邮中国 手把手教程(转)

    什么值得买已经发布2014最新版美亚直邮攻略 海淘攻略:美国亚马逊 直邮服务 手把手教程(2014最新版) ,调整幅度较大,值友们可以移步到新攻略中查看. 相比德国.英国亚马逊,美国亚马逊的大部分商品 ...

  3. Zadig 推出手把手教程,一起来尝试吧!

    ​  你是否也有这样的疑问? "我的业务可能有特殊性,是否可以接入一两个模块使用 Zadig 看看效果?" "我有明确的痛点,但是看文档摸索起来效率实在有点低,能否快速找 ...

  4. 配置JDK环境变量(最简单手把手教程)

    目录 简介 JDK卸载 准备JDK 环境配置 校检配置 简介 本文博客只为自己记忆,就新手最简单手把手教程 JRE(Java Runtime Environment ) Java运行环境,用来运行JA ...

  5. [java手把手教程][第二季]java后端博客系统文章系统——No10

    项目github地址:github.com/pc859107393- 实时项目同步的地址是国内的码云:git.oschina.net/859107393/m- 我的简书首页是:www.jianshu. ...

  6. 云监控介绍 - Amazon CloudWatch

    云监控介绍 - Amazon CloudWatch 作者:张航东 本文主要用于个人学习.总结,欢迎转载,但请务必注明作者和出处,感谢! Amazon CloudWatch 是一项针对 AWS 云资源和 ...

  7. 图文手把手教程--ESP32 MQTT对接EMQX本地服务器(VSCODE+ESP-IDF)

    本文内容 1)使用MQTT_TCP例程,ESP32通过MQTT协议与MQTT本地服务器(EMQX)进行通信. 2)如何搭建EMQX MQTT本地服务器. 3)如何使用MQTT.fx客户端调试工具或MQ ...

  8. Amazon CloudWatch 介绍/学习

    1.应用场景 主要用于没有移动网络信号差, 又需要网络的情况. 2.学习/操作 背景 目前公司采用的服务 1.介绍 Amazon CloudWatch 是一种面向开发运营工程师.开发人员.站点可靠性工 ...

  9. 腾讯云服务器购买详细流程(手把手教程)

    第一次购买腾讯云服务器很多同学不会选择,云服务吧写了一篇手把手教程,分享给大家: 腾讯云服务器购买流程 购买腾讯云服务器很简单,首先你需要注册一个腾讯云账号,使用微信或QQ注册即可,很简单.账号注册后 ...

最新文章

  1. ZOJ Monthly, June 2014 月赛BCDEFGH题题解
  2. 微型计算机存取速度,微型计算机中,存取速度由快到慢排序:
  3. spring入门(11)-spring与hibernate整合完成增删改查的操作(封装HibernateTemplate模版类对象)
  4. 海思芯片对比选型_海思芯片的选型及特征参考说明大全
  5. 如何通过Meta Learning实现域泛化(Domain Generalization)?
  6. python之路 mysql 博客园_Python之路(二十七):Mysql(下)
  7. 计算机休眠怎么唤醒,电脑休眠后,就无法唤醒了?怎么办?快速教你解决这个问题...
  8. shell if语句特殊用法(高级用法),工具安装判断
  9. 5_数据分析—数据可视化
  10. 人脸关键点:TCDCN-Facial Landmark Detection by Deep Multi-task Learning
  11. 大咖来信 | 张亚勤@2018:终日“闭关”读论文,思考终极算法
  12. jQuery基础--选择器
  13. SQL经典语句大全及应用示例汇总
  14. 拉卡拉前三季度净利润7.35亿元 继续保持高速增长态势
  15. idea在自动注入DiscoveryClient的时候报错
  16. 【STM32利用CuBe MX生成HID设备】2-给游戏控制器添加X\Y轴
  17. Java基础到Java进阶——Java小白的历练之路------从0到1,开卷!
  18. springCloud openFeign返回数据转型问题
  19. 最新ie图标变灰css,css+js整站变灰(兼容IE7+)
  20. 行驶证OCR识别应用领域有哪些?

热门文章

  1. ABAP Cross-client 和 Client-specific 的区别
  2. 解决网页在浏览器有反应 在手机端没反应问题
  3. 校招回顾,大疆校招可内推
  4. Java将List对象导入Excel文件
  5. Leetcode题解 二分查找
  6. ftp下载工具绿色版,网络上难找的绿色版ftp下载工具
  7. 新C# 操作Excel属性
  8. 润乾参数模板中的参数校验
  9. 六轴机械臂下位机(arduino)+上位机(ROS+Moveit)---(一)机械臂硬件
  10. 工业机器人技术全解析,值得收藏!