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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:25:26