aws cloudwatch 默认只支持邮件告警,时效性比较低。本方案是使用 cloudwatch 如何集成第三方如微信、钉钉、等支持api操作的即时聊天软件,以下以微信告警为例。
在这篇文章中,我将会介绍如何通过 amazon sns 和 aws lambda 来实现将 aws cloudwatch 告警信息发送到微信。
aws-cloudwatch-wechat
本方案中 cloudwatch 接收 ec2 运行指标并进行监控。当 ec2 指标超出设定阈值后,cloudwatch 触发告警事件,并将事件消息通过 sns 发送到 lambda 函数。lambda函数执行用户自定义的代码,包括:解析告警消息并发送到企业微信、钉钉机器人、或者 prometheus 等平台。
架构中 aws 服务简介:
amazon cloudwatch 可以用来收集 aws 包括 ec2 、 rds 、 eks 等各种服务运行日志也可以收集用户应用程序日志,可以作为 aws 上日志数据集散地。同时在 cloudwatch 上可以设置基于指标的告警、基于时间和事件的规则,它可以与 amazon sns 和 lambda 等其他aws服务进行使用。
aws lambda 是无服务器的函数计算服务。通过 aws lambda ,无需预置或管理服务器即可运行代码。借助 lambda ,您几乎可以为任何类型的应用程序或后端服务运行代码,而且完全无需管理。您可以将您的代码设置为自动从其他 aws 服务如: cloudwatch 、 sns 等触发,或者直接从任何 web 或移动应用程序调用。
amazon sns 是一项用于应用与应用之间以及应用与人之间通信的完全托管型消息收发服务。
注册企业微信账号
在企业微信中创建应用
创建完成后记录应用 secret
企业微信告警流程
获取 access_token ,参考微信官方说明文档
示例代码:
缓存和刷新 access_token,然后调用具体的业务接口,示例代码:
这里我创建两种订阅,一种基于邮件(发送邮箱链接确认),一种基于lambda。
(1)基于邮件
邮箱链接确认:
(2)基于lambda
创建aws lambda 函数
配置 lambda 环境变量(可选)
新建 corpid 和 corpsecret 环境变量,根据从企业微信获取的值填充(可选)
创建 lambda 协议的订阅
本例中使用 python requests 库发送 post 请求,目前有两种办法实现:
直接使用 vendored 中的 requests ,但该方法2021年1月30日以后将不能使用。故不做推荐。
独立安装 requests 库,需要将包和 lambda 代码一起上传到 aws lambda 执行环境。以使用虚拟环境来安装函数依赖为例。
具体步骤如下:
关于虚拟环境使用和基本操作,详见:
底层虚拟环境 virtualenv
linux中多版本python与virtualenv的结合使用
virtualenvwrapper 操作虚拟环境
选择要监控的 ec2 监控选项卡,创建警报。(下图是中国区控制台界面, aws global 控制台界面略有不同)
选择前面步骤创建的 sns 主题,并选择合适的监控告警指标
测试告警接收
如上图所示, cpu 利用率已经超过设定阈值, cloudwatch 发出告警。
在 cloudwatch 日志组中查看 lambda 日志
收到告警邮件
收到微信报警
企业微信、钉钉接收 amazon cloudwatch 告警
aws 使用lambda实现企业微信报警