在我们的系统中,我们有一个Lambdas流,根据它们得到的结果调用其他Lambdas。此流程可能会在未来重构以使用AWS步骤功能,但可能会在接下来的一两个月内保持不变。
最近引入了一个新的lambda,我们遇到了一个问题:
如果我们在本地测试Lambda函数1,它会正确地调用AWS上的函数2。
但是,在部署lambda并运行相同的测试后,函数不会被调用(在监控图表中没有调用)
下面是函数1的代码示例:
'use strict';
const AWS = require("aws-sdk");
const lambda = new AWS.Lambda({ region: "eu-west-1" });
const myHandler = async (event, _, callback) => {
console.log(event)
return doSomething()
.then(something)
.then(somethingElse)
.catch(handleError)
function doSomething() {
return fetch('someurl.com');
}
function something(r) {
if(r.status === 204) {
let lambdaRes = callLambda( "LambdaB", { foo: bar } );
console.log(lambdaRes)
}
return r
}
somethingElse(r) {
if(r.status === 500) {
throw new Error(`bar`);
}
return r.json()
}
async function callLambda(fnName, payload ) {
let params = {
FunctionName: fnName,
InvocationType: 'Event',
Payload: JSON.stringify(payload)
}
return await lambda.invoke(params);
}
function handleError(e) {
if(e.message === 'bar') {
let lambdaRes = callLambda( "LambdaC", { bar: 'foo' } );
console.log(lambdaRes)
}
return callback(null, { message: `Completed with error`});
}
exports.handler = myHandler;我们试图检查问题是否由授权引起,并通过向function 1提供所有可能的授权进行测试,但没有结果。
有什么建议吗?
更新:
这两个函数使用相同的
VPC: vpc-hashnumberVpc,
子网:子网-hashnumber3 1、子网-hashnumber3 2、子网-hashnumber3 3
安全组: sg-hashnumberSg
发布于 2021-04-02 21:18:21
当第一个Lambda函数调用lambda.invoke()时,它无法以某种方式连接到VPC内的另一个Lambda函数。此时,没有其他Lambda函数的运行实例,只有它的定义存在。正在发生的事情是lambda.invoke()调用公共互联网上的AWS API,请求AWS创建第二个函数的新调用。
在VPC内运行的Lambda函数不会获得分配给它们的公有IP地址,即使它们在公有子网中也是如此。让VPC内的Lambda函数访问互联网的唯一方法是将Lambda函数放置在具有到NAT Gateway的路由的私有子网中。
或者,您也可以配置AWS Lambda VPC Endpoint,使您的VPC内的资源能够访问AWS Lambda API,而无需通过互联网。
因此,为了让在VPC内运行的Lambda函数进行AWS API调用以调用其他Lambda函数,您可以选择将NAT网关添加到VPC,或将AWS Lambda VPC端点添加到VPC。
发布于 2021-04-02 19:58:18
因此,如果函数1能够在本地调用函数2,我认为问题出在网络/AWS设置上,以下是您可以做的几件事:
<代码>G215
我的大多数lambda问题都通过这个解决了,一切都很好。
https://stackoverflow.com/questions/66918792
复制相似问题