SQS FIFO触发Lambda但Lambda接收空事件,请求排查原因
我向SQS FIFO队列发送消息触发Lambda,控制台显示消息已接收且Lambda已被触发,但Lambda函数读取到的event为空。
Lambda处理函数代码如下:
... export const handler = async (event, context) => { console.log("Received info:", event); ... };
以下是Lambda的IAM策略语句:
{ "Sid": "policyforlambda", "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:ReceiveMessage", "sqs:GetQueueAttributes" ], "Resource": "arn:aws:sqs:ap-south-1:ACCOUNT:SOME_SQS.fifo" }
SQS配置详情:
Visibility timeout: 30 sec Message retention: 4 hrs Delivery delay: 0 sec Receive message wait time: 20 sec Polling duration: 30 sec Max message count: 10
日志截图:
请问是上述设置导致消息在Lambda读取前消失,还是存在其他原因?
检查Lambda事件源映射配置
确认事件源映射是否正确关联目标FIFO队列,且Batch size设置合理(不能为0)。另外,查看是否添加了消息过滤规则,若过滤条件过于严格,会导致所有消息被过滤,触发Lambda但event为空。排查消息投递与重复处理问题
FIFO队列要求消息必须携带MessageGroupId,若发送消息时未设置该字段,消息无法正常投递;若重复发送了带有相同MessageDeduplicationId的消息,SQS会自动丢弃重复消息,导致Lambda触发无内容。验证消息是否被提前删除
查看SQS监控面板的NumberOfMessagesDeleted指标,确认是否存在异常删除操作(比如其他有权限的服务或Lambda旧实例提前删除了消息)。虽然你的IAM策略允许Lambda执行sqs:DeleteMessage,但需确保当前函数执行流程未在读取消息前误删。调整可见性超时与Lambda超时的匹配关系
AWS推荐SQS可见性超时设置为Lambda超时的6倍左右。当前你的可见性超时为30秒,若Lambda超时接近或超过该值,消息可能在函数处理完成前重新回到队列,被其他消费者获取,导致本次触发拿到空事件。建议调整可见性超时至Lambda超时的6倍(例如Lambda超时设为10秒,可见性超时设为60秒)。细化日志排查
修改Lambda代码,增加空事件判断逻辑,明确输出事件结构:export const handler = async (event, context) => { console.log("Event raw data:", JSON.stringify(event)); if (!event?.Records || event.Records.length === 0) { console.log("No records found in event"); } // 后续逻辑 };通过完整打印event的JSON结构,确认是否真的为空,还是存在日志截断或结构异常。
内容的提问来源于stack exchange,提问作者Waleed93

