为什么传统告警系统不再适用
我数不清有多少次看到告警系统无缘无故地轰炸我的收件箱,一个小小的流量峰值或轻微延迟就会引发混乱。但当真正出现故障时,却收不到任何通知。大多数这些系统都是多年前为静态服务器和可预测负载设计的,不适合我们今天处理的动态云环境。
为什么选择EventBridge + Lambda?
EventBridge和Lambda共同使得构建事件驱动的告警系统变得简单,既实时又易于维护。
- EventBridge 作为智能事件总线,接收原生AWS事件或自定义事件,通过JSON规则过滤,失败时重试,并将事件路由到正确目标
- Lambda 运行路由、丰富和修复代码,可自动扩展以处理每秒数千个事件
架构概述
基本告警流程
事件源
- 原生AWS事件(如S3对象创建、ECS任务停止、Step Functions失败)
- CloudWatch告警状态变更
- 通过PutEvents或API目的地发送的自定义应用事件
处理流程
Lambda首先检查事件结构,然后添加相关标签(如关联ID、租户和严重性)。如果已看到事件ID或域键,则跳过处理。
分发操作
- 分页:针对Sev 1或Sev 2事件,触发SNS通知或在事件管理工具中创建工单
- 聊天:在Slack或Teams中发送快速消息
- 可观测性:将指标发送到CloudWatch,原始事件存储到S3
构建简单告警管道
步骤1:创建EventBridge规则
为S3 ObjectCreated事件创建EventBridge规则,过滤incoming/前缀:
|
|
步骤2:编写Lambda函数
以下是使用Python编写的最小化、幂等的Lambda路由器:
|
|
步骤3:将告警路由到正确渠道
每个渠道都有其用途:
- 电子邮件:适用于每日摘要或低优先级提醒
- 聊天:适用于实时分类
- 分页:仅用于严重事件
步骤4:持久化指标和事件用于可观测性
CloudWatch指标(EMF)
使用嵌入式指标格式直接从Lambda记录结构化指标。
将原始事件流式传输到S3
使用Firehose以Parquet格式将原始事件持久化到S3,分区如:dt=YYYY-MM-DD/tenant=acme/
SLA心跳检查器(DynamoDB + Scheduler)
EventBridge调度程序每隔几分钟运行一次,触发检查逾期作业的Lambda。
步骤5:测试、演练和部署
在部署前:
- 发送一些模拟S3事件并跟踪correlationId
- 故意终止目标,确保EventBridge和Lambda DLQ都能捕获未通过的事件
- 通过CI/CD推送部署
- 为DLQ增长或错误指标添加告警
- 定期运行"消防演练"
扩展方案
基础设置就绪后,可以添加:
- 异常检测
- 工作流遥测
- 跨账户设置
- 多租户扩展
- 成本控制
经验教训
有效的方法
- 三层设计(指标、原始事件、心跳)能早期捕获大多数问题
- 将缺失数据视为告警条件
- 将告警合并到线程或事件中
无效的方法
- 仅依赖电子邮件告警
- 过度分页会产生持续噪音
- 忽略DLQ运行状况
安全和合规说明
- 在EventBridge、Lambda、SNS和其他服务上实施最小权限IAM
- 使用KMS进行加密
- 将聊天和工单集成的令牌存储在AWS Secrets Manager中
- 避免将PII发送到聊天或日志
结论
使用EventBridge和Lambda,您可以构建一个快速响应、必要时扩展且大部分时间保持安静的告警设置。从小规模开始,随着增长逐步添加仪表板、异常检测和跨账户路由。