在Serverless Offline中如何从一个Lambda函数调用另一个?
Serverless Offline本地调用Lambda函数遇到415错误的解决方法
问题场景
用Serverless框架开发的Lambda函数,部署到AWS后跨函数调用正常,但本地使用serverless-offline调试时:
- 初始代码提示
Function not found: arn:aws:lambda:us-west-2:893853743015:function:my-api-local-handleProcessA - 修改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", });
核心原因分析
- 415错误根源:serverless-offline模拟的Lambda调用端点默认要求请求
Content-Type为application/json,但AWS SDK默认发送的是application/x-amz-json-1.1,导致格式不兼容。 - 函数参数错误:middy包装的handler接收的第一个参数是API Gateway的
event对象,而非直接的payload,原代码中baseHandler的参数定义错误,导致传递给目标Lambda的Payload格式异常。 - 本地函数名匹配问题:本地调试时无需使用完整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
相关产品推荐
相关产品推荐

