You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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读取前消失,还是存在其他原因?


排查方案与解决思路
  • 检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:42:42