AWS Lambda 在本地正常工作但部署时失败的解决方法

90次阅读
没有评论

问题描述

在使用 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 执行权限上。以下是解决此问题的步骤:

  1. 首先,确认 Lambda 执行角色是否具有调用其他 Lambda 函数的权限。这是通过在 Lambda 执行角色的策略中添加 InvokeFunction 权限来实现的。

  2. 打开 AWS 控制台,导航到 IAM(身份和访问管理)服务。

  3. 在左侧导航栏中,选择 “角色”,然后找到用于执行 Lambda 函数的角色。

  4. 点击角色名称,然后进入 “权限” 选项卡。

  5. 点击 “添加权限” 按钮,搜索并选择 “AWS Lambda” 服务,然后选择 “InvokeFunction” 权限。

  6. 完成添加权限的步骤,然后保存角色。

  7. 重新部署 Lambda 函数,确保执行角色已更新。

  8. 重新测试部署后的 Lambda 函数,应该可以正常调用其他 Lambda 函数了。

替代方案

如果 Lambda 函数之间的依赖关系更加复杂,或者需要更多的控制和灵活性,可以考虑使用以下替代方案之一:

  1. 创建专门的 Lambda 执行角色: 为每个 Lambda 函数创建独立的执行角色,并确保角色具有适当的权限,以便能够调用其他 Lambda 函数。这样可以避免角色权限交叉和混淆的问题。

  2. 使用事件桥接: 如果 Lambda 函数之间需要进行异步通信,可以考虑使用 AWS 事件桥接(EventBridge)。通过设置事件规则和目标,可以在触发一个 Lambda 函数时,自动触发另一个 Lambda 函数,而无需显式调用。

  3. 检查 CloudWatch 日志: 如果 Lambda 函数在部署后仍然出现问题,可以查看 CloudWatch 日志以获取更多详细信息。添加适当的日志记录语句,例如使用 console.logconsole.error,并在 CloudWatch 中查看 Lambda 函数的日志组以进行故障排除。

结论

通过为 Lambda 执行角色添加 InvokeFunction 权限,您应该能够解决在部署时 Lambda 函数调用失败的问题。确保角色权限得到正确配置,以便可以顺利地在 Lambda 函数之间进行调用。如果问题仍然存在,可以尝试替代方案,如创建独立的执行角色或使用事件桥接来管理 Lambda 函数之间的通信。

请记得根据实际情况和需要进行调整和测试,以确保解决方案适用于您的特定场景。

正文完