Node.js-从另一个Lambda函数中调用AWS.Lambda函数 [英] Nodejs - Invoke an AWS.Lambda function from within another lambda function
问题描述
我有以下函数,可用于从代码中调用Lambda函数.
I have the following function which I use to invoke a Lambda function from within my code.
但是,当我尝试在Lambda函数中使用它时,出现以下错误:
However when I try to use it within a Lambda function, I get the following error:
AWS lambda undefined 0.27s 3 retries] invoke({ FunctionName: 'my-function-name',
InvocationType: 'RequestResponse',
LogType: 'Tail',
Payload: <Buffer > })
如何从Lambda函数中调用Lambda函数?
How can I invoke a Lambda function from within a Lambda function?
我的功能:
'use strict';
var AWS = require("aws-sdk");
var lambda = new AWS.Lambda({
apiVersion: '2015-03-31',
endpoint: 'https://lambda.' + process.env.DYNAMODB_REGION + '.amazonaws.com',
logger: console
});
var lambdaHandler = {};
// @var payload - type:string
// @var functionName - type:string
lambdaHandler.invokeFunction = function (payload, functionName, callback) {
var params = {
FunctionName: functionName, /* required */
InvocationType: "RequestResponse",
LogType: "Tail",
Payload: new Buffer(payload, 'utf8')
};
var lambdaRequestObj = lambda.invoke(params);
lambdaRequestObj.on('success', function(response) {
console.log(response.data);
});
lambdaRequestObj.on('error', function(response) {
console.log(response.error.message);
});
lambdaRequestObj.on('complete', function(response) {
console.log('Complete');
});
lambdaRequestObj.send();
callback();
};
module.exports = lambdaHandler;
推荐答案
使用每个Lambda中都可用的aws-sdk
,从另一个Lambda函数中调用Lambda函数非常简单.
Invoking a Lambda Function from within another Lambda function is quite simple using the aws-sdk
which is available in every Lambda.
我建议先从简单开始.
这是lambda内调用的"Hello World":
I suggest starting with something simple first.
This is the "Hello World" of intra-lambda invocation:
Lambda_A
调用Lambda_B
Payload
包含单个参数name:'Alex'
的情况.
Lambda_B
的有效载荷为"Hello Alex"
.
Lambda_A
invokes Lambda_B
with a Payload
containing a single parameter name:'Alex'
.
Lambda_B
responds with Payload: "Hello Alex"
.
首先创建Lambda_B
,它需要一个name
属性
在event
参数
上
并用"Hello "+event.name
响应请求:
First create Lambda_B
which expects a name
property
on the event
parameter
and responds to request with "Hello "+event.name
:
exports.handler = function(event, context) {
console.log('Lambda B Received event:', JSON.stringify(event, null, 2));
context.succeed('Hello ' + event.name);
};
确保您赋予Lambda_B
和Lambda_A
相同的角色.
例如:创建一个名为lambdaexecute
的角色,该角色同时具有AWSLambdaExecute
和
AWSLambdaBasicExecutionRole
(出于某些原因都需要):
Ensure that you give Lambda_B
and Lambda_A
the same role.
E.g: create a role called lambdaexecute
which has both AWSLambdaExecute
and
AWSLambdaBasicExecutionRole
(for some reason both were required):
var AWS = require('aws-sdk');
AWS.config.region = 'eu-west-1';
var lambda = new AWS.Lambda();
exports.handler = function(event, context) {
var params = {
FunctionName: 'Lambda_B', // the lambda function we are going to invoke
InvocationType: 'RequestResponse',
LogType: 'Tail',
Payload: '{ "name" : "Alex" }'
};
lambda.invoke(params, function(err, data) {
if (err) {
context.fail(err);
} else {
context.succeed('Lambda_B said '+ data.Payload);
}
})
};
保存完这两个Lambda函数后,请运行Lambda_A
:
Once you have saved both these Lambda functions, Test run Lambda_A
:
一旦您完成了 basic 内lambdda调用工作,就可以轻松扩展它以调用更复杂的Lambda函数.
Once you have the basic intra-lambdda invocation working you can easily extend it to invoke more elaborate Lambda functions.
要记住,主要是 为所有功能设置适当的
ARN Role
.
这篇关于Node.js-从另一个Lambda函数中调用AWS.Lambda函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!