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

在Serverless Offline中如何从一个Lambda函数调用另一个?

Serverless Offline本地调用Lambda函数遇到415错误的解决方法

问题场景

用Serverless框架开发的Lambda函数,部署到AWS后跨函数调用正常,但本地使用serverless-offline调试时:

  1. 初始代码提示Function not found: arn:aws:lambda:us-west-2:893853743015:function:my-api-local-handleProcessA
  2. 修改Lambda客户端的endpoint后,出现415 Unsupported Media Type错误

初始核心代码:

const middy = require("@middy/core");
const httpErrorHandler = require("@middy/http-error-handler");
const httpUrlEncodeBodyParser = require("@middy/http-urlencode-body-parser");

const AWS = require("aws-sdk");

const lambda = new AWS.Lambda();

const baseHandler = async (payload) => {
  const params = {
    FunctionName: `my-api-${process.env.STAGE}-handleProcessA`,
    InvocationType: "Event",
    LogType: "None",
    Payload: JSON.stringify(payload),
  };

  await lambda.invoke(params).promise();

  return standardResponse();
}

const endpoint = middy(baseHandler)
  .use(httpUrlEncodeBodyParser())
  .use(httpErrorHandler());

module.exports = { endpoint };

修改后的Lambda客户端配置:

const lambda = new AWS.Lambda({
  region: "us-west-2",
  endpoint: process.env.IS_OFFLINE
    ? "http://localhost:6002"
    : "https://lambda.us-west-2.amazonaws.com",
});

核心原因分析

  1. 415错误根源:serverless-offline模拟的Lambda调用端点默认要求请求Content-Type为application/json,但AWS SDK默认发送的是application/x-amz-json-1.1,导致格式不兼容。
  2. 函数参数错误:middy包装的handler接收的第一个参数是API Gateway的event对象,而非直接的payload,原代码中baseHandler的参数定义错误,导致传递给目标Lambda的Payload格式异常。
  3. 本地函数名匹配问题:本地调试时无需使用完整ARN,直接用serverless.yml中定义的函数名即可,ARN格式会导致serverless-offline无法识别。

解决步骤

1. 修正Handler参数定义

将baseHandler的参数改为event,并从event.body中获取请求体(因为使用了httpUrlEncodeBodyParser,event.body已被解析为对象):

const baseHandler = async (event) => {
  // 获取解析后的请求体作为payload
  const requestPayload = event.body;
  const params = {
    // 本地调试用函数名,线上用完整名称
    FunctionName: process.env.IS_OFFLINE 
      ? "handleProcessA" 
      : `my-api-${process.env.STAGE}-handleProcessA`,
    InvocationType: "Event",
    LogType: "None",
    Payload: JSON.stringify(requestPayload),
    // 本地强制设置Content-Type为application/json
    ...(process.env.IS_OFFLINE && { Headers: { 'Content-Type': 'application/json' } })
  };

  await lambda.invoke(params).promise();

  return standardResponse();
}

2. 调整Lambda客户端配置

移除硬编码的线上endpoint(AWS SDK会自动根据region匹配),并确保本地端口与serverless-offline启动时的Lambda端口一致(默认是3002,若自定义了--lambda-port 6002则保持):

const lambda = new AWS.Lambda({
  region: "us-west-2",
  endpoint: process.env.IS_OFFLINE ? "http://localhost:6002" : undefined
});

3. 验证serverless-offline配置

  • 确保serverless.yml中已正确定义handleProcessA函数,且stage为local时能被加载
  • 启动serverless-offline时确认Lambda端口与代码中配置一致,比如:
serverless offline start --lambda-port 6002

4. 升级依赖版本

若以上步骤无效,尝试升级serverless-offline和serverless到最新版本,避免版本兼容问题:

npm update serverless serverless-offline

内容的提问来源于stack exchange,提问作者Mahesh Samudra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:45:44