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

时间:2016-08-25 11:57:32

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

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

我的lambda属于同一地区,同一政策,同一安全组。两个lambda中的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

2 个答案:

答案 0 :(得分:56)

注意

我将通过 executor 表示执行第二个lambda的{​​{1}}。

为什么要超时?

由于执行者被“锁定”在lambda后面 - 所有互联网通讯都被阻止。

这导致任何VPC次呼叫超时,因为它们请求数据包永远不会到达目的地。

这就是http(s)所做的所有操作都会导致超时的原因。

简单解决方案

如果执行者 不在aws-sdk中 - 只需将其删除,VPC也可以正常工作没有lambda

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

真正的解决方案

从上面的说法可以看出,位于VPC内的任何资源都无法访问互联网 - 这是不正确的 - 只需要进行少量配置。

  1. 创建VPC
  2. 创建2个子网,让其中一个表示为私有,第二个 public (这些术语将在前面解释,继续阅读)。< / LI>
  3. 创建 Internet网关 - 这是一个将VPC连接到互联网的虚拟路由器。
  4. 创建 NAT网关 - 选择公共子网并为其创建新的VPC(此IP是您elastic IP的本地IP) - 此组件将通信传输到VPC
  5. 创建2 路由表 - 一个名为 public ,第二个私有

    1. public 路由表中,转到路由并添加新路由:
    2.   

      目的地:0.0.0.0/0

           

      目标:internet-gateway

      的ID
      1. 私有路由表中,转到路由并添加新路由:
      2.   

        目的地:0.0.0.0/0

             

        目标:internet-gateway

        的ID
        • 私有子网是其路由表中的子网 - 没有路由到nat-gateway

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

        我们在这里有什么?

        我们创造了这样的东西:

        VPC with NAT and IGW

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

答案 1 :(得分:4)

我遇到了同样的问题,其中被“固定”到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交互的工作到相应的worker lambda。它通过执行worker lambda的同步调用来执行此委派。工人lambdas不会调用任何其他lambda。 (就流程图而言,worker lambdas是终端节点。)在我自己的系统中,其他流lambdas对流Lambdas的调用通常是异步的;但我想如果需要它们可以同步。

尽管我将此方法设计为一种解决方法,但它具有将高级功能设计干净地分离为(a)流程流程和(b)执行更详细工作(包括与DB资源交互)的良好功能。 p>