如何基于MessageAttributes在CloudWatch中按服务分区监控SNS?
解决方案:基于SNS MessageAttributes在CloudWatch分区监控消息量
核心结论
可以实现按MessageAttributes中的服务标识分区监控,且无需创建额外过滤订阅(避免成本浪费),推荐通过CloudWatch日志投递+Metric Filter的方案实现。
具体实现步骤
开启SNS主题日志投递
进入SNS主题配置页面,找到「日志」设置,关联一个CloudWatch Logs日志组,确保日志输出包含MessageAttributes字段(默认开启后会包含完整消息元数据)。这一步仅产生CloudWatch日志存储和 ingestion 的低成本,不会增加SNS订阅相关费用。创建CloudWatch Metric Filter
- 进入关联的CloudWatch Logs日志组,点击「创建指标过滤器」;
- 编写过滤模式匹配
MessageAttributes中的服务标识字段(假设你的服务标识key为service_id,过滤模式示例:{$.MessageAttributes.service_id.StringValue = "*"}); - 配置自定义指标:设置指标命名空间(如
SNS/ServiceMetrics)、指标名称(如MessagePublishCount),并将提取到的service_id值设为指标维度(如维度名ServiceId); - 保存后,CloudWatch会自动按服务标识分区统计消息发布量。
关于过滤策略的成本担忧
你担心的成本问题确实存在:如果为每个服务创建带过滤策略的SNS订阅,即使没有实际消费端点,符合过滤条件的消息仍会被投递到订阅端点(如SQS),产生额外的消息交付费用。而上述日志+Metric Filter的方案完全复用现有单订阅架构,不会产生额外SNS投递成本,仅需承担少量CloudWatch日志和自定义指标费用,成本可控。
替代方案(需修改后端代码)
如果不想依赖日志投递,也可以让每个后端服务在发布SNS消息的同时,调用CloudWatch的PutMetricData接口,主动上报自身的消息计数指标,并携带ServiceId维度。这种方案无需日志,但需要修改所有后端服务的代码逻辑。
内容的提问来源于stack exchange,提问作者Yaakov Bressler
相关产品推荐
相关产品推荐

