Amazon web services AWS lambda调用不调用另一个lambda函数-Node.js
在授予调用函数的所有权限之后。我的Lambda函数无法调用其他函数。每次我超时时,都会出现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
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