Serverless部署AWS Lambda跨函数调用报InvalidSignatureException错误求助
问题根因
你在AWS Lambda JS SDK的构造参数中传入了后端函数对应的API Gateway线上URL作为endpoint参数,该配置用法错误:
- AWS官方Lambda SDK的
endpoint参数用于指定Lambda服务本身的接入地址,而非你要调用的目标函数的API触发地址 - 本地使用serverless-offline时填写的
http://localhost:3002/是离线工具模拟的Lambda服务地址,因此可以正常运行 - 线上环境你传入了API Gateway的
execute-api服务端点,SDK仍按照Lambda服务的规则生成请求签名,AWS服务校验时发现签名作用域和目标服务不匹配,因此抛出该错误,和你配置的函数权限、API Gateway auth规则无关
修复方案
你可以根据自己的业务需求选择以下两种方案之一:
方案1:直接调用后端Lambda(推荐)
你的代码逻辑本身就是直接调用Lambda函数的场景,无需走API Gateway转发,修改方式非常简单:
- 删掉Lambda构造参数中的
endpoint配置即可,线上环境AWS SDK会自动匹配对应区域的Lambda服务端点,无需手动指定 - 在
serverless.yml中为前端Lambda配置调用后端Lambda的权限,示例配置如下:
provider: name: aws region: us-east-1 iamRoleStatements: - Effect: Allow Action: lambda:InvokeFunction # 替换为你的后端Lambda真实ARN Resource: arn:aws:lambda:us-east-1:<AWS账号ID>:function:serverless-function-dev-backend
- 建议为异步调用逻辑添加错误捕获,避免调用失败无日志:
lambdaBackend.invoke(params).promise() .catch(err => console.error('调用后端Lambda失败:', err))
方案2:通过API Gateway调用后端Lambda
如果你确实需要通过预先配置的API Gateway端点触发后端函数,不要使用Lambda SDK,直接用HTTP客户端发送请求即可:
- 由于你已经将API Gateway的auth设置为
none,无需签名即可调用,直接用axios/node-fetch等工具向后端API URL发请求即可,不会出现签名错误问题
内容的提问来源于stack exchange,提问作者Ando Kal
相关产品推荐
相关产品推荐

