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

Amazon web services AWS lambda调用不调用另一个lambda函数-Node.js,amazon-web-services,aws-lambda,aws-sdk,amazon-iam,Amazon Web Services,Aws Lambda,Aws Sdk,Amazon Iam,在授予调用函数的所有权限之后。我的Lambda函数无法调用其他函数。每次我超时时,都会出现30秒超时问题。看起来lambda无法获得另一个lambda函数 我的lambda位于相同的区域、相同的策略、相同的安全组。。两个Lambda中的VPC也是相同的。现在唯一不同的是lambda函数 以下是角色权限 1) 创建了AWSLambdaExecute和AWSLambdaBasicExecutionRole 2) 创建了一个要调用的lambda函数 Lambda_检验 exports.handler

在授予调用函数的所有权限之后。我的Lambda函数无法调用其他函数。每次我超时时,都会出现
30秒超时
问题。看起来lambda无法获得另一个lambda函数

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

以下是角色权限

1) 创建了
AWSLambdaExecute
AWSLambdaBasicExecutionRole

2) 创建了一个要调用的lambda函数 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);
  }
 })
};
参考文献摘自:

注 我将通过执行器表示执行第二个
lambda
lambda


为什么超时? 由于执行者被“锁定”在
VPC
后面,因此所有互联网通信都被阻止

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

这就是为什么aws sdk执行的所有操作都会导致超时


简单解 如果执行器不必须处于
专有网络中
-只需将其退出即可,则
lambda
也可以在没有
专有网络的情况下工作

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

实解 综上所述,位于
专有网络
内的任何资源都无法访问互联网-这是不正确的-只需进行少量配置

  • 创建一个
    VPC
  • 创建2个子网,其中一个子网表示为私有,第二个子网表示为公共(这些术语将在前面解释,请继续阅读)
  • 创建一个Internet网关-这是一个虚拟路由器,它将
    VPC
    连接到Internet
  • 创建NAT网关-选择公共子网并为其创建一个新的
    弹性IP
    (此IP是您的
    专有网络
    的本地IP)-此组件将通过管道与
    互联网网关进行通信
  • 创建两个路由表-一个名为public,另一个名为private

  • 在公用路由表中,转到路由并添加新路由:
  • 目的地:0.0.0.0/0

    目标:互联网网关的ID

  • 在专用路由表中,转到路由并添加新路由:
  • 目的地:0.0.0.0/0

    目标:nat网关的ID

    • 专用子网是指在其路由表中没有到
      internet网关的路由的子网

    • 公共子网是指在其路由表中存在到internet网关的路由的子网


    我们这里有什么? 我们创造了这样的东西:

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

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

    假设我有几个lambda,A,B,C,D,。。。我希望这些lambda都能访问RDS数据库。为了访问数据库,我需要将lambda和数据库放在同一个VPC中。但我也喜欢A、B、C、d……中的各种兰姆达斯,。。。互相调用。所以我遇到了Arpit描述的问题

    我通过将每个Lambda拆分为两个Lambda来处理这个问题:一个关注流程流(即调用其他Lambda并被另一个Lambda调用);另一个则专注于做“真正的”工作,比如查询数据库。我现在有函数A_流,B_流,C_流,D_流。。。;和函数A_-worker,B_-worker,C_-worker,D_-worker。。。各种流lambda没有“固定”到特定的VPC,因此可以调用其他lambda。各种worker Lambda与数据库位于同一VPC中,可以查询数据库

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


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

    您的Lambda功能是否在专有网络内运行?是的,两者共享相同的专有网络,lambda执行角色和安全组。感谢回复您将无法通过VPC中存在的Lambda函数访问AWS API或VPC之外的任何其他内容,除非您向VPC添加NAT网关。在本例中,这些细节都无关紧要。您正在尝试调用AWS API,该API恰好是存在于VPC之外的资源。标记是正确的。请参阅。感谢@johni的详细回复。我能够使用简单的解决方案运行。我一定会尝试另一种方法并接受答案。谢谢你,也许你可以提到Lambda应该位于私有子网内。我必须遵循这一点和@BEm的评论说明,NAT网关有相应的成本。这里有一些有用的文档:不敢相信这是可行的,但这是一种更快更简单的方法。我仍然想知道为什么VPC外部的Lambda可以调用V内部的Lambda