在赋予调用函数的所有权限之后 . 我的Lambda函数无法调用另一个函数 . 我每次因为 30 seconds timeout
问题而超时 . 看起来lambda无法获得另一个lambda函数
我的lambda属于同一地区,同一政策,同一安全组 . 两个lambda中的VPC也相同 . 现在唯一不同的是lambda函数
这是角色权利
1)创建 AWSLambdaExecute
和 AWSLambdaBasicExecutionRole
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 回答
注意
我将通过执行程序表示执行第二个
lambda
的lambda
.为何超时?
由于执行人是"locked",所以互联网通讯都被阻止了 .
这导致任何
http(s)
调用超时,因为它们请求数据包永远不会到达目的地 .这就是为什么
aws-sdk
所做的所有操作都会导致超时的原因 .简单解决方案
如果执行者没有 have 在
VPC
中 - 只是把它放出来,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 .
在公共路由表中,转到路由并添加新路由:
私有子网是其路由表中的子网 - 有 is no 路由到
internet-gateway
.公有子网是其路由表中的子网 - 有 exists 到
internet-gateway
的路由我们在这里有什么?
我们创建了这样的东西:
这就是允许私有子网中的资源调用互联网的原因 . 您可以找到更多文档here .
我遇到了同样的问题,即“固定”到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资源的交互 .