Lambda异步调用遇RequestEntityTooLargeException问题求助
解决Lambda异步调用大Payload的问题
为什么InvocationType: 'Event'有Payload大小限制?
这是因为Lambda异步调用和同步调用的底层处理逻辑完全不同:
- 用
InvocationType: 'RequestResponse'(默认同步调用)时,请求是通过直接的API通道传递,Payload上限可达6MB,所以你的179KB数据能正常传输。 - 而
InvocationType: 'Event'(异步调用)时,Lambda会把请求放到内部SQS队列实现异步调度,这个内部队列的单条消息大小限制就是128KB——这就是你触发RequestEntityTooLargeException的原因。至于已弃用的invokeAsync,它本质是早期的异步调用实现,底层依赖的还是同一个内部队列,所以会遇到同样的限制。
如何在不等待第二个Lambda完成的情况下传递大Payload?
最稳妥的方案是借助中间存储服务中转大数据,这里推荐用S3,具体步骤如下:
- 第一个Lambda:将大对象上传到S3
先把myBigObject序列化(比如转成JSON字符串),上传到指定S3桶,再把S3的对象位置信息作为小Payload传给第二个Lambda:
const AWS = require('aws-sdk'); const s3 = new AWS.S3(); const lambda = new AWS.Lambda(); // 序列化大对象并上传到S3 const serializedPayload = JSON.stringify(myBigObject); const s3Params = { Bucket: 'your-s3-bucket-name', Key: `lambda-payloads/${Date.now()}-payload.json`, // 用唯一键避免覆盖 Body: serializedPayload }; s3.putObject(s3Params, (err, data) => { if (err) { callback(err); return; } // 用Event类型调用第二个Lambda,仅传递S3位置信息 lambda.invoke({ FunctionName: 'MyOtherLambda', InvocationType: 'Event', Payload: JSON.stringify({ s3Bucket: s3Params.Bucket, s3Key: s3Params.Key }) }, callback); });
- 第二个Lambda:从S3读取并处理数据
在第二个Lambda中,接收S3位置参数,下载并反序列化数据后再处理业务逻辑:
const AWS = require('aws-sdk'); const s3 = new AWS.S3(); exports.handler = async (event) => { const { s3Bucket, s3Key } = event; // 从S3获取大对象 const s3Params = { Bucket: s3Bucket, Key: s3Key }; const s3Response = await s3.getObject(s3Params).promise(); const myBigObject = JSON.parse(s3Response.Body.toString()); // 这里编写你的业务处理逻辑 console.log('Received big object:', myBigObject); };
备选方案:用SQS队列中转
如果你的Payload大小接近但不超过256KB,也可以用SQS标准队列中转:
- 第一个Lambda把大消息发送到SQS队列(无需等待执行结果)
- 给第二个Lambda配置SQS队列作为触发器,队列有消息时会自动触发Lambda执行
这种方式也是完全异步的,但如果未来Payload继续增大,还是S3方案更灵活通用。
内容的提问来源于stack exchange,提问作者EtienneG
相关产品推荐
相关产品推荐

