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

如何在aws-sdk v3中通过JavaScript/TypeScript调用Lambda函数

AWS SDK v3 调用Lambda函数问题修复

问题根因

你贴出的CloudWatch报错直接对应代码的两处核心错误:

  1. Payload类型错误:你通过as unknown as Uint8Array的强制类型转换仅绕过了TypeScript编译校验,运行时Payload字段实际还是普通JS对象,完全不符合AWS SDK要求的Uint8Array类型,导致方法直接抛出异常,因此代码永远执行不到打印result的行。
  2. 调用方式错误:lambda.invoke是AWS SDK v2的调用写法,v3采用命令模式,需要构造对应的InvokeCommand实例后通过client.send()方法发起请求。

修正后的实现代码

import { InvokeCommand, InvokeCommandInput, LambdaClient } from "@aws-sdk/client-lambda";

// 初始化Lambda客户端,替换为你的实际区域
const lambda = new LambdaClient({ region: "cn-north-1" });

const input = {
    name: 'fake-name',
    serial: 'fake-serial',
    userId: 'fake-user-id'
};

const params: InvokeCommandInput = {
    FunctionName: 'my-lambda-func-name',
    InvocationType: 'RequestResponse',
    LogType: 'Tail',
    // 正确序列化:先转JSON字符串,再转Uint8Array
    // 浏览器/通用JS环境可替换为 new TextEncoder().encode(JSON.stringify(input))
    Payload: Buffer.from(JSON.stringify(input)),
};

try {
    const command = new InvokeCommand(params);
    const result = await lambda.send(command);
    
    // 反序列化Lambda返回结果
    const responsePayload = JSON.parse(Buffer.from(result.Payload as Uint8Array).toString());
    console.log('Lambda返回结果:', responsePayload);
    
    // 如需查看调用日志,解码LogResult字段
    const invokeLog = Buffer.from(result.LogResult as string, 'base64').toString();
    console.log('Lambda调用日志:', invokeLog);
} catch (err) {
    console.error('调用Lambda失败:', err);
}

优化建议

  • 封装通用的Lambda调用工具函数,统一处理Payload序列化、反序列化、异常捕获逻辑,避免重复编码
  • 调用前增加入参校验,提前拦截非法输入
  • 针对不同调用类型做差异化处理:Event类型调用不需要等待返回结果,无需处理返回Payload;DryRun类型仅校验权限和参数
  • 增加Lambda执行错误判断:如果返回结果的FunctionError字段不为空,说明Lambda函数内部执行出错,需要单独做错误处理

内容的提问来源于stack exchange,提问作者A-Sharabiani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:54:00