AWS SNS基于负载的过滤策略拦截所有通知问题求助
解决AWS SNS负载过滤策略拦截所有AWS Config通知的问题
1. 验证过滤策略的JSON语法正确性
先确认过滤策略的JSON格式完全合法,避免低级语法错误:
- 所有键和值必须用双引号(禁止单引号)
- 数组、对象的括号需正确闭合
- 逗号分隔符无多写、漏写或使用中文标点
错误示例:
{ "messageType": ["ConfigurationItemChangeNotification"], // 中文逗号错误 "configurationItem.resourceType": ["AWS::EC2::Instance"] }
正确示例:
{ "messageType": ["ConfigurationItemChangeNotification"], "configurationItem.resourceType": ["AWS::EC2::Instance"] }
2. 确认过滤属性与实际消息负载完全匹配
AWS SNS负载过滤依赖精确的属性路径与键名,需对照你收到的AWS Config通知示例逐一核对:
- 键名大小写严格一致:比如
messageType不能写成Messagetype,configurationItem不能写成ConfigurationItem - 属性层级正确:嵌套属性用
.分隔,比如配置项的资源类型路径是configurationItem.resourceType,而非直接写resourceType - 值无多余空格:实际消息中
resourceType的值是AWS::EC2::Instance,过滤策略里不能带前后空格
3. 检查过滤运算符的使用逻辑
根据需求选择匹配逻辑:
- 精确匹配单个值:使用
["目标值"](默认等于匹配) - 匹配多个可选值:使用
["值1", "值2"](逻辑或) - 仅验证属性存在:使用
[{"exists": true}]
针对EC2实例发现通知的正确过滤策略示例:
{ "messageType": ["ConfigurationItemChangeNotification"], "configurationItem.resourceType": ["AWS::EC2::Instance"], "awsAccountId": ["123456789012"] }
4. 区分“负载过滤”与“消息属性过滤”
确保你配置的是基于负载的过滤策略,而非消息属性过滤:
- 消息属性过滤:针对SNS消息的顶层元数据(如
Subject) - 负载过滤:针对消息的Payload内容(即AWS Config的JSON通知体)
若误将负载字段当成消息属性配置,必然会拦截所有消息。
5. 用测试消息验证过滤逻辑
手动构造符合AWS Config格式的测试消息,通过SNS CLI发送验证:
aws sns publish \ --topic-arn "arn:aws:sns:us-east-1:123456789012:your-topic" \ --message '{ "messageType": "ConfigurationItemChangeNotification", "awsAccountId": "123456789012", "configurationItem": { "resourceType": "AWS::EC2::Instance", "resourceId": "i-1234567890abcdef0" } }'
如果测试消息能通过过滤,说明原AWS Config消息存在未注意到的字段差异;若仍被拦截,说明过滤策略本身存在问题。
6. 查看CloudWatch过滤详情
在CloudWatch控制台找到SNS主题对应的日志组,搜索包含FilteredOut的日志条目,查看filteringDecision和matchingExplanation字段,明确拦截原因(如属性不存在、值不匹配等)。
内容的提问来源于stack exchange,提问作者Benz Chua
相关产品推荐
相关产品推荐

