AWS CLI查询过滤CloudWatch SNS指标返回空结果问题排查
问题根因
你遇到的空返回问题由两个原因导致:
- Shell引号冲突:外层使用单引号包裹
--query参数,内部过滤逻辑Name=='TopicName'再次使用单引号,会被Shell识别为提前闭合外层参数,实际传给JMESPath的查询语句被截断,无法匹配到结果。 - 嵌套数组未处理:原接口返回的Dimensions是嵌套在每一条Metric下的数组,未做扁平化处理会导致结果被多余的数组层级包裹。
正确查询命令
使用反引号包裹JMESPath里的字符串字面量避免引号冲突,同时用管道符扁平化结果:
aws cloudwatch list-metrics \ --namespace 'AWS/SNS' \ --metric-name 'NumberOfMessagesPublished' \ --query 'Metrics[*].Dimensions[?Name==`TopicName`].Value | []' \ --output text
执行后会直接输出近6小时有发布活动的SNS主题名称纯文本列表,可直接写入文件做去重累计。
闲置SNS主题排查优化方案
你当前用cron累计活跃列表的方案可行,也可以参考以下更高效的方案:
- 先调用
aws sns list-topics拿到全量主题ARN,再批量调用CloudWatchGetMetricData接口查询过去30天内各主题的NumberOfMessagesPublished累计值,一次查询即可拿到全量活跃数据,无需定时累计,也不会遗漏间隔期的活动。 - 对于无订阅且长期无发布记录的主题,也可以直接通过SNS的
get-topic-attributes接口查看SubscriptionsConfirmed、CreatedTimestamp等属性做二次校验,避免误删临时闲置的合法主题。
内容的提问来源于stack exchange,提问作者Jack-of-some
相关产品推荐
相关产品推荐

