首页 文章

AWS lambda调用不调用另一个lambda函数 - Node.js

提问于
浏览
22

在赋予调用函数的所有权限之后 . 我的Lambda函数无法调用另一个函数 . 我每次因为 30 seconds timeout 问题而超时 . 看起来lambda无法获得另一个lambda函数

我的lambda属于同一地区,同一政策,同一安全组 . 两个lambda中的VPC也相同 . 现在唯一不同的是lambda函数

这是角色权利

1)创建 AWSLambdaExecuteAWSLambdaBasicExecutionRole

2)创建了一个名为 Lambda_TEST 的lambda函数

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

2 回答

  • 45

    注意

    我将通过执行程序表示执行第二个 lambdalambda .


    为何超时?

    由于执行人是"locked",所以互联网通讯都被阻止了 .

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

    这就是为什么 aws-sdk 所做的所有操作都会导致超时的原因 .


    简单解决方案

    如果执行者没有 haveVPC 中 - 只是把它放出来, lambda 也可以在没有 VPC 的情况下工作 .

    lambda 调用 VPC 内的资源时,需要在 VPC 中找到 lambda .

    真正的解决方案

    从上面可以看出,位于 VPC 内的任何资源都无法访问互联网 - that is not correct - 只需要进行少量配置 .

    • 创建 VPC .

    • 创建2个子网,让一个被表示为私有,第二个被公开(这些术语将在前面解释,继续阅读) .

    • 创建Internet网关 - 这是一个将 VPC 连接到Internet的虚拟路由器 .

    • 创建NAT网关 - 选择 public 子网并为其创建一个新的 elastic IP (此IP是 VPC 的本地IP) - 此组件将通信管道传送到 internet-gateway .

    • 创建2个路由表 - 一个名为public,另一个名为public .

    • 在公共路由表中,转到路由并添加新路由:

    目的地:0.0.0.0/0目标:互联网网关的ID

    • 在私有路由表中,转到路由并添加新路由:

    目的地:0.0.0.0 / 0目标:nat网关的ID

    • 私有子网是其路由表中的子网 - 有 is no 路由到 internet-gateway .

    • 公有子网是其路由表中的子网 - 有 existsinternet-gateway 的路由


    我们在这里有什么?

    我们创建了这样的东西:

    VPC with NAT and IGW

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

  • 3

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

    假设我有几个lambdas,A,B,C,D,......我希望这些Lambdas每个都有对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,......各种流lambda不会“固定”到特定的VPC,因此可以调用其他lambdas . 各种工作伙伴Lambdas与数据库位于同一个VPC中,可以查询数据库 .

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

    虽然我设计了这种方法作为一种解决方法,但它具有干净地分离高级别的一个很好的功能功能设计分为(a)流程和(b)执行更详细的工作,包括与DB资源的交互 .

相关问题