Lambda中使用SQSClient发消息报错:input必须为ArrayBuffer
AWS Lambda向SQS发送消息报错:TypeError: The "input" argument must be ArrayBuffer. Received type object
问题场景
使用Node.js 16 + TypeScript编写Lambda函数,本地运行代码可正常向AWS SQS发送消息,但部署到Lambda后触发以下错误:
TypeError: The "input" argument must be ArrayBuffer. Received type object ([object Object])
函数代码如下:
import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda'; import { SQSClient, SendMessageCommand } from "@aws-sdk/client-sqs"; export const lambdaHandler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => { let response: APIGatewayProxyResult; let messageBody: string; if (!event.body) { response = { statusCode: 500, body: JSON.stringify({ message: 'No Target Information Found', }), }; return response; } else { response = { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }; messageBody = event.body; } const client = new SQSClient({ region: "us-east-1" }); const params = { MessageBody: messageBody, QueueUrl: "https://sqs.us-east-1.amazonaws.com/41111111119/scheduled-userflows" } const command = new SendMessageCommand(params); try { await client.send(command); } catch (error) { response = { statusCode: 500, body: JSON.stringify({ message: 'Error: failed to schedule userflow test\n' + error, }), }; } finally { return response; } };
错误含义
这个错误表示AWS SDK在处理SQS请求的序列化过程中,期望接收ArrayBuffer类型的输入数据,但实际收到了普通JavaScript对象,说明请求数据的类型转换环节出现异常。
本地与Lambda环境差异原因
- 依赖打包方式不同:本地运行时直接使用完整的SDK依赖,部署Lambda时如果用Webpack、ESBuild等工具做了过度压缩或树摇,可能破坏SDK内部的类型处理逻辑,导致序列化失败。
- event.body编码差异:本地测试时
event.body通常是纯字符串,但Lambda中如果API Gateway开启了二进制支持,event.body会是Base64编码的字符串,直接赋值给MessageBody会让SDK无法正确解析。 - 运行时环境差异:Lambda的Node.js运行时与本地Node.js环境在底层API实现上有细微差别,尤其是二进制数据处理环节,可能触发SDK的类型校验错误。
解决办法
- 处理event.body编码问题:先判断body是否为Base64编码,解码后再使用:
messageBody = event.isBase64Encoded ? Buffer.from(event.body, 'base64').toString('utf-8') : event.body; - 调整打包配置:如果用ESBuild或Webpack,将AWS SDK设为外部依赖,让Lambda使用自带的SDK版本(需确保本地依赖版本与Lambda自带版本对齐)。比如ESBuild添加参数:
--external:@aws-sdk/*。 - 显式确保MessageBody为字符串类型:即使
messageBody看起来是字符串,也显式转换避免类型异常:const params = { MessageBody: String(messageBody), QueueUrl: "https://sqs.us-east-1.amazonaws.com/41111111119/scheduled-userflows" } - 对齐SDK版本:本地开发和Lambda部署使用相同版本的
@aws-sdk/client-sqs,避免版本差异导致的序列化逻辑不一致。
注:此需求用于实现云端单任务执行Puppeteer脚本,解决SQS发送问题后,后续需确保Lambda环境支持Puppeteer(比如使用包含Chromium的Layer或自定义镜像)。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

