【问题标题】:AWS lambda invoke not calling another lambda function - Node.jsAWS lambda 调用不调用另一个 lambda 函数 - Node.js
【发布时间】:2017-01-01 20:25:17
【问题描述】:

赋予调用函数的所有权限后。我的 Lambda 函数无法调用另一个函数。每次我遇到30 seconds timeout 问题时都会超时。看来 lambda 无法获取另一个 lambda 函数

我的 lambdas 位于同一区域、同一策略、同一安全组 .. 两个 lambdas 中的 VPC 也是相同的。现在唯一不同的是 lambda 函数

这里是角色权限

1) 创建了AWSLambdaExecuteAWSLambdaBasicExecutionRole

2) 创建了一个要调用的 lambda 函数 Lambda_TEST

exports.handler = function(event, context) {
  console.log('Lambda TEST Received event:', JSON.stringify(event, null, 2));
  context.succeed(event);
};

3) 这是另一个调用它的函数。

var AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';
var lambda = new AWS.Lambda();

exports.handler = function(event, context) {
 var params = {
   FunctionName: 'Lambda_TEST', // the lambda function we are going to invoke
   InvocationType: 'RequestResponse',
   LogType: 'Tail',
   Payload: '{ "name" : "Arpit" }'
 };

  lambda.invoke(params, function(err, data) {
   if (err) {
    context.fail(err);
   } else {
   context.succeed('Lambda_TEST said '+ data.Payload);
  }
 })
};

参考来自:This link

【问题讨论】:

  • 您的 Lambda 函数是否在 VPC 内运行?
  • 是的,两者共享相同的 VPC 、 lambda 执行角色和安全组。 .感谢回复
  • 除非您将 NAT 网关添加到 VPC,否则您将无法从 VPC 中存在的 Lambda 函数访问 AWS API 或 VPC 之外存在的任何其他内容。跨度>
  • 在这种情况下,这些细节都不重要。您正在尝试调用 AWS API,它恰好是您的 VPC 外部存在的资源。
  • 标记是正确的。见docs.aws.amazon.com/lambda/latest/dg/…

标签: amazon-web-services aws-lambda aws-sdk amazon-iam


【解决方案1】:

注意

我将用 executor 表示执行第二个lambdalambda


为什么超时?

由于 executor 被“锁定”在 VPC 后面 - 所有互联网通信都被阻止。

这会导致任何http(s) 调用超时,因为它们请求的数据包永远不会到达目的地。

这就是aws-sdk 执行的所有操作都会导致超时的原因。


简单的解决方案

如果 executor 没有必须VPC 中 - 只需将其从其中取出,lambda 也可以在没有 @987654333 的情况下工作@。

lambda 调用VPC 中的资源时,需要在VPC 中定位lambda

真正的解决方案

从上面说的,位于VPC 中的任何资源都无法访问互联网 - 这是不正确的 - 只需要进行一些配置。

  1. 创建VPC
  2. 创建 2 个子网,其中一个表示为 private,第二个表示为 public(这些术语在前面解释过,请继续阅读)。
  3. 创建一个互联网网关 - 这是一个将VPC 连接到互联网的虚拟路由器。
  4. 创建一个 NAT 网关 - 选择 public 子网并为其创建一个新的 elastic IP(此 IP 是您的 VPC 的本地 IP) - 此组件将与internet-gateway 进行管道通信。
  5. 创建 2 个路由表 - 一个名为 public,第二个名为 private

    1. public 路由表中,转到 Routes 并添加一条新路由:

    目的地:0.0.0.0/0

    目标:internet-gateway的ID

    1. private 路由表中,转到 Routes 并添加新路由:

    目的地:0.0.0.0/0

    目标:nat-gateway的ID

    • 私有子网是在其路由表中的子网 - 没有internet-gateway的路由。

    • 公共子网是其路由表中的子网 - 存在internet-gateway的路由


我们在这里吃什么?

我们创造了这样的东西:

这允许 私有 子网中的资源调用互联网。 您可以找到更多文档here

【讨论】:

【解决方案2】:

我遇到过同样的问题,即“固定”到 VPC 的 Lambda 无法调用其他 Lambda。我一直在通过重构我的解决方案的结构来处理这个问题,而不使用 NAT。

假设我有几个 lambda,A、B、C、D...,我希望这些 Lambda 每个都具有对 RDS 数据库的查询访问权限。为了获得此数据库访问权限,我需要将 lambdas 放在与数据库相同的 VPC 中。但我也希望 A、B、C、D、... 之间的各种 lambdas 相互调用。所以我遇到了 Arpit 描述的问题。

我一直在通过将每个 Lambda 拆分为两个 Lambda 来处理这个问题:一个专注于流程流(即调用其他 lambda 并被另一个 lambda 调用);另一个专注于做“真正的”工作,比如查询数据库。所以我现在有函数 A_flow, B_flow, C_flow, D_flow, ...;和函数 A_worker, B_worker, C_worker, D_worker, ... 各种流 lambdas 没有“固定”到特定的 VPC,因此可以调用其他 lambdas。各种worker Lambda与数据库在同一个VPC中,可以查询数据库。

每个流 lambda 都将与 DB 交互的工作“委托”给相应的工作 lambda。它通过执行工作 lambda 的同步调用来完成此委托。 worker lambdas 不会调用任何其他 lambdas。 (就流程流图而言,worker lambdas 是终端节点。)在我自己的系统中,其他流lambdas 对流lambdas 的调用通常是异步的;但我想如果需要它们可以是同步的。

尽管我将这种方法设计为一种解决方法,但它有一个很好的特性,可以将高级功能设计清晰地分离为 (a) 流程和 (b) 执行更详细的工作,包括与数据库资源的交互。

【讨论】:

  • 不敢相信这有效,但这是更快更简单的方法。我仍然想知道为什么 VPC 外部的 Lambda 可以调用 VPC 内部的 Lambda,而反之则不能。
  • 我使用了相同的方法......但是几天以来,VPC 外部的 lambdas 似乎无法在内部调用 lambdas......我错过了什么吗?每个 lambda 都有调用目标 lambda 的策略....
  • 我按照步骤操作,但没有成功。我想在 Lambda 函数中使用 Gmail SMTP 详细信息,以及连接到 VPC 内的 RDS 实例。如果我删除 VPC,则它无法连接到 RDS,直到我将其公开,并且邮件正常工作。但是,如果将 Lambda 放在同一个 VPC 中,则 RDS 连接有效,但邮件功能给出“连接超时”。我已经使用弹性 IP 创建了 NAT 网关,并与 Lambda 的同一子网关联,但仍然是同样的问题。
  • 这一切看起来很疯狂,但这很有效。 VPC 外部的 lambda 可以调用 VPC 内的 lambda,但反之则不行。设置一个 NAT GW 将是一个简单的解决方案,它可以做很多事情,但是在运行个人实验/学习所有这些时它会花费很多(无论如何对我来说)。
  • 当调用者 lambda 可以保留在 VPC 之外时,此方法是正确的。它之所以有效,是因为调用者 lambda 可以访问作为公共端点的 AWS API。通过 API,您可以实例化任何资源,而不管它在哪里。
【解决方案3】:

截至 2020 年 10 月,AWS PrivateLink 是比配置互联网网关/NAT 网关更简单的解决方案。请参阅此处的发行说明以及其中指向 PrivateLink 文档的链接:https://aws.amazon.com/blogs/aws/new-use-aws-privatelink-to-access-aws-lambda-over-private-aws-network/

请注意,如果两个 lambda 位于不同的 VPC 中,并且正在执行的 lambda 需要处理来自目标 lambda 的响应,那么两个 lambda 都需要一个端点。

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 2018-06-09
    • 2018-08-21
    • 2021-09-19
    • 2020-03-23
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多