问题描述
在使用 AWS Lambda 时遇到了一个问题:他的 Node.js Lambda 函数在本地测试时可以正常工作,但在部署时失败了。他的 Lambda 函数首先会添加数据库条目,然后调用另一个 Lambda 函数。通过本地测试(使用 serverless invoke local
命令)时,一切正常,但在部署后(使用 aws lambda invoke
命令)却出现了问题。
以下是相关的 Lambda 代码片段:
try {
await dynamoDbLib.call("put", params); // 在本地和部署中都正常
var lambda = new AWS.Lambda();
const req = {
FunctionName: 'eqtor-api-dev-mysim',
InvocationType: 'RequestResponse',
LogType: 'Tail',
Payload: JSON.stringify({ name: 'me' })
};
const result = await lambda.invoke(req).promise(); // 在本地正常,但在部署中失败
console.log(result);
return success(params.Item);
} catch (e) {
return failure({ status: false });
}
解决方案
请注意以下操作可能会受到 AWS Lambda 版本差异的影响。如果需要,可以参考 AWS 官方文档进行调整。
最佳解决方案
根据用户的反馈和解决方法,我们可以看到问题出在 Lambda 执行权限上。以下是解决此问题的步骤:
-
首先,确认 Lambda 执行角色是否具有调用其他 Lambda 函数的权限。这是通过在 Lambda 执行角色的策略中添加
InvokeFunction
权限来实现的。 -
打开 AWS 控制台,导航到 IAM(身份和访问管理)服务。
-
在左侧导航栏中,选择 “角色”,然后找到用于执行 Lambda 函数的角色。
-
点击角色名称,然后进入 “权限” 选项卡。
-
点击 “添加权限” 按钮,搜索并选择 “AWS Lambda” 服务,然后选择 “InvokeFunction” 权限。
-
完成添加权限的步骤,然后保存角色。
-
重新部署 Lambda 函数,确保执行角色已更新。
-
重新测试部署后的 Lambda 函数,应该可以正常调用其他 Lambda 函数了。
替代方案
如果 Lambda 函数之间的依赖关系更加复杂,或者需要更多的控制和灵活性,可以考虑使用以下替代方案之一:
-
创建专门的 Lambda 执行角色: 为每个 Lambda 函数创建独立的执行角色,并确保角色具有适当的权限,以便能够调用其他 Lambda 函数。这样可以避免角色权限交叉和混淆的问题。
-
使用事件桥接: 如果 Lambda 函数之间需要进行异步通信,可以考虑使用 AWS 事件桥接(EventBridge)。通过设置事件规则和目标,可以在触发一个 Lambda 函数时,自动触发另一个 Lambda 函数,而无需显式调用。
-
检查 CloudWatch 日志: 如果 Lambda 函数在部署后仍然出现问题,可以查看 CloudWatch 日志以获取更多详细信息。添加适当的日志记录语句,例如使用
console.log
或console.error
,并在 CloudWatch 中查看 Lambda 函数的日志组以进行故障排除。
结论
通过为 Lambda 执行角色添加 InvokeFunction
权限,您应该能够解决在部署时 Lambda 函数调用失败的问题。确保角色权限得到正确配置,以便可以顺利地在 Lambda 函数之间进行调用。如果问题仍然存在,可以尝试替代方案,如创建独立的执行角色或使用事件桥接来管理 Lambda 函数之间的通信。
请记得根据实际情况和需要进行调整和测试,以确保解决方案适用于您的特定场景。