从另一个lambda函数中调用一个lambda函数没有得到调用
我怎样才能调用lambda函数内的lambda函数?
例如,
在功能1,它将由API网关请求触发,将调用一个第二lambda函数作为一个事件(InvocationType =事件)。
在功能2,它会做一个HTTP请求到端点。
同时,我要去在serverless.yml代码?或者只在指数/应用/ handler.js代码?
我在这里尝试了计算器的链接 - > Nodejs - Invoke an AWS.Lambda function from within another lambda function但它不工作。
var AWS = require('aws-sdk');
AWS.config.region = 'eu-west-1';
var lambda = new AWS.Lambda();
//LAMBDA A
exports.handler = function(event, context) {
var params = {
FunctionName: 'Lambda_B', // the lambda function we are going to invoke
InvocationType: 'RequestResponse',
LogType: 'Tail',
Payload: '{ "name" : "Yza" }'
};
lambda.invoke(params, function(err, data) {
if (err) {
context.fail(err);
} else {
context.succeed('Lambda_B said '+ data.Payload);
}
})
};
//LAMBDA B
exports.handler = function(event, context) {
console.log('Lambda B Received event:', JSON.stringify(event, null, 2));
context.succeed('Hello ' + event.name);
};
回答如下:
你的问题是,lambda.invoke()
功能是非阻塞的,所以它会调用Lambda_B之前Lambda_A正在完成它的执行。您可以使用承诺,面对这一切。如果你using Node.js 8.10+,你可以这样做:
Lambda_A:
let AWS = require('aws-sdk');
let lambda = new AWS.Lambda();
exports.handler = async (event) => {
let params = {
FunctionName: 'Lambda_B',
InvocationType: 'RequestResponse',
Payload: '{ "foo" : "bar" }'
};
return await lambda.invoke(params, function(err, data) {
if (err) {
throw err;
} else {
console.log('LambdaB invoked: ' + data.Payload);
}
}).promise();
};
Lambda_B:
exports.handler = async (event) => {
return {
statusCode: 200,
body: JSON.stringify('Hello from Lambda_B!'),
};
};
响应Lambda_A调用时:
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST",
"Payload": "{\"statusCode\":200,\"body\":\"\\\"Hello from Lambda_B!\\\"\"}"
}
从Lambda_A控制台输出调用时:
START RequestId: 016a763d-c79e-4d72-bd44-0aaa89a5efaf Version: $LATEST
2019-02-07T08:07:11.154Z 016a763d-c79e-4d72-bd44-0aaa89a5efaf LambdaB invoked: {"statusCode":200,"body":"\"Hello from Lambda_B!\""}
END RequestId: 016a763d-c79e-4d72-bd44-0aaa89a5efaf
REPORT RequestId: 016a763d-c79e-4d72-bd44-0aaa89a5efaf Duration: 717.40 ms Billed Duration: 800 ms Memory Size: 128 MB Max Memory Used: 30 MB
从另一个lambda函数中调用一个lambda函数没有得到调用
我怎样才能调用lambda函数内的lambda函数?
例如,
在功能1,它将由API网关请求触发,将调用一个第二lambda函数作为一个事件(InvocationType =事件)。
在功能2,它会做一个HTTP请求到端点。
同时,我要去在serverless.yml代码?或者只在指数/应用/ handler.js代码?
我在这里尝试了计算器的链接 - > Nodejs - Invoke an AWS.Lambda function from within another lambda function但它不工作。
var AWS = require('aws-sdk');
AWS.config.region = 'eu-west-1';
var lambda = new AWS.Lambda();
//LAMBDA A
exports.handler = function(event, context) {
var params = {
FunctionName: 'Lambda_B', // the lambda function we are going to invoke
InvocationType: 'RequestResponse',
LogType: 'Tail',
Payload: '{ "name" : "Yza" }'
};
lambda.invoke(params, function(err, data) {
if (err) {
context.fail(err);
} else {
context.succeed('Lambda_B said '+ data.Payload);
}
})
};
//LAMBDA B
exports.handler = function(event, context) {
console.log('Lambda B Received event:', JSON.stringify(event, null, 2));
context.succeed('Hello ' + event.name);
};
回答如下:
你的问题是,lambda.invoke()
功能是非阻塞的,所以它会调用Lambda_B之前Lambda_A正在完成它的执行。您可以使用承诺,面对这一切。如果你using Node.js 8.10+,你可以这样做:
Lambda_A:
let AWS = require('aws-sdk');
let lambda = new AWS.Lambda();
exports.handler = async (event) => {
let params = {
FunctionName: 'Lambda_B',
InvocationType: 'RequestResponse',
Payload: '{ "foo" : "bar" }'
};
return await lambda.invoke(params, function(err, data) {
if (err) {
throw err;
} else {
console.log('LambdaB invoked: ' + data.Payload);
}
}).promise();
};
Lambda_B:
exports.handler = async (event) => {
return {
statusCode: 200,
body: JSON.stringify('Hello from Lambda_B!'),
};
};
响应Lambda_A调用时:
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST",
"Payload": "{\"statusCode\":200,\"body\":\"\\\"Hello from Lambda_B!\\\"\"}"
}
从Lambda_A控制台输出调用时:
START RequestId: 016a763d-c79e-4d72-bd44-0aaa89a5efaf Version: $LATEST
2019-02-07T08:07:11.154Z 016a763d-c79e-4d72-bd44-0aaa89a5efaf LambdaB invoked: {"statusCode":200,"body":"\"Hello from Lambda_B!\""}
END RequestId: 016a763d-c79e-4d72-bd44-0aaa89a5efaf
REPORT RequestId: 016a763d-c79e-4d72-bd44-0aaa89a5efaf Duration: 717.40 ms Billed Duration: 800 ms Memory Size: 128 MB Max Memory Used: 30 MB