Serverless告警
日期: 2022-11-04

无服务器告警推送器(Serverless Alert Notifier) 是一键部署的告警推送解决方案,帮助客户将亚马逊云科技的资源告警信息推送到客户指定的通知平台。目前方案支持微信,下一步将支持钉钉和其他常用的统一告警平台。
此解决方案的 Amazon CloudFormation 模板会自动部署一套无服务器架构,包含 Amazon EventBridge、Amazon Simple Notification Service、 Amazon Lambda 等服务,以及用Amazon Secrets Manager 来存储第三方平台需要的凭证。您只需要从第三方平台获取凭证信息,安全存储到Amazon Secrets Manager,方案就会自动配置好告警推送功能。

 

使用场景

此解决方案适用于对亚马逊云科技资源的监控场景,例如

  • 当亚马逊云科技服务中断、API不可用等事件发生时进行告警
  • 当Amazon EC2 实例状态改变(新实例启动、有实例停止工作)时进行告警
  • 当Amazon Simple Storage Service (S3)中有文件被删除时进行告警
  • 当Amazon Elasticsearch 服务的JVM内存或容量达到80%时进行告警
  • 当任何用户,或特定用户登录亚马逊云科技控制台时进行告警
  • 当Amazon Security Hub发现安全风险和合规问题时进行告警
  • 当Amazon EventBridge支持的SaaS合作伙伴,如Auth0、MongoDB等,产生告警消息时进行推送
  • 客户自定义的业务指标在特定情况下发出告警

 

架构图与组件介绍

 

 

Amazon EventBridge

  • Amazon EventBridge 事件总线:使用默认的事件总线
  • Amazon EventBridge 规则:创建两个默认规则,分别匹配EC2状态变化事件和亚马逊云科技健康事件,作为样例,这样您会在EC2实例状态发生变化(启动、停止、终止等)和亚马逊云科技健康事件发生时收到通知。您也可以自己创建其他自定义事件,来匹配您需要的规则。

 

Amazon Simple Notification Service

  • Amazon SNS 主题:创建一个SNS主题,用于接受来自EventBridge的事件,并触发Lambda进行告警推送。

 

Amazon Lambda

  • 告警推送函数:用于推送告警信息,以SNS主题作为触发器。

 

Amazon Secrets Manager

  • Secrets:存储第三方平台的凭证,让Lambda等服务可以安全地访问这些数据。

 

前期准备

 

1. 登录企业微信

访问 企业微信网站 。选择您的已有企业(如果还没有企业,可以在企业微信APP中创建一个, 不需要进行认证),进入管理页面。

 

 

2. 获取企业微信ID

在企业微信中,点击【我的企业】,在企业信息中找到【企业ID】进行复制。

 

 

将获取到的企业ID存储在Secrets Manager中。然后打开亚马逊云科技管理控制台,搜索【Secrets Manager】服务,进入服务页面后点击【Store a New Secret】进行创建。

 

 

密钥类型选择【Other type of secrets】,下方存储类别选择【Plaintext】,将复制的企业ID填入下方的空白输入框中,点击【Next】。

 

 

在下一步的【Secret Name】中设置密钥的名字(如CORPID),然后一直点击【Next】直到创建成功。记录下Secret ARN留作之后使用。

 

 

3. 创建告警应用

回到 企业微信管理页面,点击【应用管理】,在【自建】一栏中点击【创建应用】。

 

 

填写应用名称并上传应用Logo,在【可见范围】中选择要获得通知的人员名单,之后点击【创建应用】完成创建。

 

 

4. 获取应用ID

在创建的应用中复制 AgentId 的值,回到亚马逊云平台控制台,参照之前步骤创建另一个Secrets Manager的密钥(如名为AGENTID),并记录它的Secret ARN留作之后使用。

 

 

5. 获取应用Secret

同样在刚才打开的企业微信应用页面,点击Secret后面的【查看】,会提示您发送到企业微信中查看。在企业微信APP中复制收到的Secret,参照之前步骤创建一个Secrets Manager的密钥(如名为AGENTSECRET),并记录它的Secret ARN留作之后使用。

 

6. 微信关注您的企业

回到 企业微信管理页面,在【我的企业】中找到【微信插件】功能,会看到【邀请关注】部分有一个二维码。用您的微信扫描这个二维码,关注企业公众号,之后就可以从微信中收到推送信息了。

 

 

启动 CloudFormation 堆栈

 

登陆亚马逊云科技管理控制台,选择以下链接进行部署。默认情况下,此模板在您之前使用过的区域部署,您同时可以使用控制台右上方的区域选择链接,以在其他区域部署该方案。

  • 全球区域部署
  • 中国区域部署

 

 

指定堆栈详细信息

点击【下一步】,进入参数设置页面,如下图所示。

 

 

分别填入之前创建的Secrets Manager密钥的Secret ARN值。

 

 

填写参数后,点击 【下一步】。

 

配置堆栈选项

保持默认值,点击【下一步】。

 

 

审核堆栈

保持默认值,请勾选 “ 我确认,CloudFormation 可能创建具有自定义名称的 IAM 资源。”的单选框,点击 【创建堆栈】。

 

 

等待大概 2-3分钟,直至堆栈状态为Complete,创建完成。

 

推送测试

部署完成后,您可以通过从SNS发送测试消息,来测试微信是否可以成功接收到告警信息。

在CloudFormation堆栈中,切换到【资源】标签页,点击 NotifierTopic 对应的链接,跳转到SNS主题页面。

 

 

在SNS主题页面,点击右上方的【发布消息】。

 

 

填写主题和消息正文,点击右下方的【发布消息】,就可以将消息发布到SNS主题,自动触发Lambda将消息发送给微信平台。如果之前获取的凭证无误,此时您的微信会提醒您收到一条新消息。

 

 

告警配置

SNS告警推送测试成功后,您可以启动或停止一台EC2实例,此时应该会收到微信消息,里面的内容是一长串Json格式的文字。您可以在EventBridge中进行简单配置,将这些文字转化为有序的通知信息。

打开亚马逊云科技控制台,选中之前创建的CloudFormation堆栈中,切换到【资源】标签页,点击EC2StateRule对应的链接,跳转到对应的EventBridge服务页面。

 

 

点击右上方的【编辑】按钮,进入规则编辑页面。

 

 

在【选择目标】部分,展开【配置输入】,修改输入方式为【输入转换器】,并在下方的文本框中分别填入以下内容,然后点击【更新】即可。
输入路径:

{“instance-id”:”$.detail.instance
id”,”region”:”$.region”,”state”:”$.detail.state”,”time”:”$.time”}

 

输入模板:

“EC2状态变化告警: \n时间: <time> \n区域: <region> \n实例id:
<instance-id> \n状态: <state>”

 

 

之后再有EC2实例状态变化的时候,您收到的就是格式化的告警信息了。