AWS SQS触发双Lambda时消息丢失问题求助
过滤器规则与消息内容不匹配
你设置的第一个Lambda过滤器是{"body": {"ErpId": ["myErp1"]}},但发送的消息里ErpId是myErpId,拼写完全不一致,这会直接导致该Lambda的过滤器无法匹配消息,消息不会被这个Lambda处理。如果消息也不匹配另一个Lambda的过滤器,就会进入“无匹配”状态,后续处理逻辑可能导致消息看似“丢失”。
另外要确认消息body的格式:如果发送消息时body是JSON字符串(而非原生JSON对象),Lambda触发器不会自动解析为JSON结构,此时body.ErpId的过滤规则无法生效,需要调整过滤器适配字符串格式,比如使用{"body": {"$contains": "\"ErpId\":\"myErp1\""}}。消息字段类型不匹配
若消息中的ErpId字段是数字、布尔值等非字符串类型,而过滤器中使用字符串数组匹配,会导致匹配失败。比如消息里ErpId是数值类型,过滤器指定的是字符串"myErp1",两者无法匹配,消息不会被对应Lambda处理。Lambda执行角色日志权限缺失
如果Lambda的执行角色没有配置CloudWatch日志的写入权限(logs:CreateLogGroup、logs:CreateLogStream、logs:PutLogEvents),即使Lambda收到了消息,也无法生成日志,看起来像是消息没被处理。需要检查角色权限配置。SQS批量拉取的可见性超时延迟
SQS触发Lambda时会批量拉取消息,若某一批次中没有匹配Lambda过滤器的消息,该Lambda不会被调用,但消息会处于可见性超时状态,此时在SQS控制台无法看到这些消息。如果在可见性超时结束前检查队列,会误以为消息丢失,等超时后消息会重新回到队列。消息结构与过滤器层级不匹配
AWS Lambda的SQS过滤器对嵌套结构的匹配有严格要求,若消息body的层级结构与过滤器不一致(比如ErpId不是直接在body下,而是嵌套在其他字段里),也会导致匹配失败。需要确认消息的JSON结构完全符合过滤器的层级要求。
内容的提问来源于stack exchange,提问作者bit

