AWS lambda 调用不调用另一个 lambda 函数 - Node.js
Posted
技术标签:
【中文标题】AWS lambda 调用不调用另一个 lambda 函数 - Node.js【英文标题】:AWS lambda invoke not calling another lambda function - Node.js 【发布时间】:2017-01-01 20:25:17 【问题描述】:赋予调用函数的所有权限后。我的 Lambda 函数无法调用另一个函数。每次我遇到30 seconds timeout
问题时都会超时。看来 lambda 无法获取另一个 lambda 函数
我的 lambdas 位于同一区域、同一策略、同一安全组 .. 两个 lambdas 中的 VPC 也是相同的。现在唯一不同的是 lambda 函数
这里是角色权限
1) 创建了AWSLambdaExecute
和AWSLambdaBasicExecutionRole
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/…。 【参考方案1】:注意
我将用 executor 表示执行第二个lambda
的lambda
。
为什么超时?
由于 executor 被“锁定”在 VPC
后面 - 所有互联网通信都被阻止。
这会导致任何http(s)
调用超时,因为它们请求的数据包永远不会到达目的地。
这就是aws-sdk
执行的所有操作都会导致超时的原因。
简单的解决方案
如果 executor 没有必须在 VPC
中 - 只需将其从其中取出,lambda
也可以在没有 @987654333 的情况下工作@。
当lambda
调用VPC
中的资源时,需要在VPC
中定位lambda
。
真正的解决方案
从上面说的,位于VPC
中的任何资源都无法访问互联网 - 这是不正确的 - 只需要进行一些配置。
-
创建
VPC
。
创建 2 个子网,其中一个表示为 private,第二个表示为 public(这些术语在前面解释过,请继续阅读)。
创建一个互联网网关 - 这是一个将VPC
连接到互联网的虚拟路由器。
创建一个 NAT 网关 - 选择 public 子网并为其创建一个新的 elastic IP
(此 IP 是您的 VPC
的本地 IP) - 此组件将与internet-gateway
进行管道通信。
创建 2 个路由表 - 一个名为 public,第二个名为 private。
-
在 public 路由表中,转到 Routes 并添加一条新路由:
目的地:0.0.0.0/0
目标:
internet-gateway
的ID
-
在 private 路由表中,转到 Routes 并添加新路由:
目的地:0.0.0.0/0
目标:
nat-gateway
的ID
私有子网是在其路由表中的子网 - 没有到internet-gateway
的路由。
公共子网是其路由表中的子网 - 存在到internet-gateway
的路由
我们在这里吃什么?
我们创造了这样的东西:
这允许 私有 子网中的资源调用互联网。 您可以找到更多文档here。
【讨论】:
感谢@johni 的详细回复。我可以使用简单的解决方案运行。肯定会尝试另一个并接受答案。 谢谢,也许您可以提到 Lambda 应该位于私有子网内。 我必须关注这个和@BEm 的评论forums.aws.amazon.com/message.jspa?messageID=724554 注意NAT网关有相应的费用。 这里有一些有用的文档:aws.amazon.com/premiumsupport/knowledge-center/…【参考方案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 都需要一个端点。
【讨论】:
以上是关于AWS lambda 调用不调用另一个 lambda 函数 - Node.js的主要内容,如果未能解决你的问题,请参考以下文章
AWS Lambda 无法调用没有 VPC 的另一个 AWS Lambda - NodeJs
AWS lambda 函数调用另一个带参数的 lambda 函数
来自执行环境的 AWS Lambda 凭证没有执行角色的权限