如何为AWS CloudWatch Alarm发送的SNS通知添加自定义消息属性?
CloudWatch告警SNS消息添加自定义标识的可行方案
原方案可行性说明
直接通过CloudWatch Alarm配置为SNS消息添加自定义属性不可行,因为CloudWatch Alarm向SNS推送消息时,不支持配置自定义消息属性,所有消息属性由AWS自动生成,无法手动添加。
可行替代方案
1. 在自定义告警消息中嵌入标识
利用CloudWatch Alarm的「自定义告警消息」功能,在消息内容中嵌入自定义标识(比如JSON格式的字段),Lambda收到SNS消息后解析Message字段提取标识:
- 配置步骤:编辑CloudWatch Alarm,在「通知」>「自定义通知内容」中添加包含标识的内容,例如:
{ "alarm_name": "$ALARM_NAME", "state": "$STATE_VALUE", "group_id": "unified_process_group" } - Lambda处理:解析SNS消息的
Message字段,提取group_id作为处理逻辑的判断依据。
2. 通过EventBridge中转添加自定义属性
将CloudWatch Alarm的触发目标改为EventBridge规则,利用EventBridge的输入转换功能为事件添加自定义属性,再转发至SNS或直接触发Lambda:
- 配置步骤:
- 创建EventBridge规则,事件模式选择匹配CloudWatch Alarm的状态变更事件(事件源为
aws.cloudwatch,事件类型为AlarmStateChange)。 - 配置目标为SNS主题或Lambda函数,在「输入转换器」中添加自定义字段,例如:
输入路径:{"alarmName": "$.detail.alarmName", "state": "$.detail.state.value"}
输入模板:{"alarm_name": <alarmName>, "state": <state>, "custom_group": "group_a"}
- 创建EventBridge规则,事件模式选择匹配CloudWatch Alarm的状态变更事件(事件源为
- 优势:无需修改告警消息内容,直接在事件流转过程中注入属性,更灵活。
3. 通过告警标签传递标识(需API调用)
如果使用基础设施即代码(IaC)管理告警,可为告警添加自定义标签(比如process_group: unified),Lambda收到SNS消息后,调用CloudWatch的DescribeAlarms API根据告警名称获取标签:
- 注意事项:需要为Lambda配置
cloudwatch:DescribeAlarms的IAM权限,且存在API调用开销,适合告警数量不多的场景。
与「按组创建SNS主题」方案的对比
你提到的按组创建SNS主题的方案是可行的,但存在以下局限:
- 分组越多,需要维护的SNS主题数量越多,管理成本上升;
- 若后续调整分组逻辑,需要修改大量告警的触发目标配置。
而上述方案1或2可复用同一个SNS主题,仅通过消息内容或事件属性区分分组,管理更简洁,扩展性更好。
内容的提问来源于stack exchange,提问作者younes elmorabit
相关产品推荐
相关产品推荐

