Nodejs - 从另一个 lambda 函数中调用 AWS.Lambda 函数 [英] Nodejs - Invoke an AWS.Lambda function from within another lambda function
问题描述
我使用以下函数从我的代码中调用 Lambda 函数.
但是,当我尝试在 Lambda 函数中使用它时,出现以下错误:
AWS lambda undefined 0.27s 3 retries] invoke({ FunctionName: 'my-function-name',调用类型:'请求响应',日志类型:'尾',有效载荷:<缓冲区>})
如何从 Lambda 函数中调用 Lambda 函数?
我的功能:
'use strict';var AWS = require("aws-sdk");var lambda = new AWS.Lambda({apiVersion: '2015-03-31',端点:'https://lambda.'+ process.env.DYNAMODB_REGION + '.amazonaws.com',记录器:控制台});var lambdaHandler = {};//@var 负载 - 类型:字符串//@var 函数名 - 类型:字符串lambdaHandler.invokeFunction = function (payload, functionName, callback) {变量参数 = {函数名:函数名,/* 需要 */调用类型:请求响应",日志类型:尾",有效载荷:新缓冲区(有效载荷,'utf8')};var lambdaRequestObj = lambda.invoke(params);lambdaRequestObj.on('success', function(response) {控制台日志(响应数据);});lambdaRequestObj.on('error', function(response) {控制台日志(响应.错误.消息);});lambdaRequestObj.on('完成',函数(响应){console.log('完成');});lambdaRequestObj.send();打回来();};module.exports = lambdaHandler;
使用在每个 Lambda 中都可用的 aws-sdk
从另一个 Lambda 函数中调用一个 Lambda 函数非常简单.><块引用>
我建议先从简单开始.
这是你好世界"lambda 内调用:
Lambda_A
调用 Lambda_B
Payload
包含一个参数 name:'Alex'
.Lambda_B
以 Payload 响应:Hello Alex"
.
首先创建Lambda_B
,它需要一个name
property在 event
参数上
并用 "Hello "+event.name
响应请求:
Lambda_B
exports.handler = function(event, context) {console.log('Lambda B 收到事件:', JSON.stringify(event, null, 2));context.succeed('Hello ' + event.name);};
确保您赋予 Lambda_B
和 Lambda_A
相同的角色.
例如:创建一个名为 lambdaexecute
的角色,它具有 AWSLambdaRole
、AWSLambdaExecute
和AWSLambdaBasicExecutionRole
(全部都是必需的):
Lambda_A
var AWS = require('aws-sdk');AWS.config.region = 'eu-west-1';var lambda = new AWS.Lambda();export.handler = 函数(事件,上下文){变量参数 = {FunctionName: 'Lambda_B',//我们要调用的 lambda 函数调用类型:'请求响应',日志类型:'尾',有效负载:'{名称":亚历克斯"}'};lambda.invoke(params, function(err, data) {如果(错误){上下文失败(错误);} 别的 {context.succeed('Lambda_B 表示'+ data.Payload);}})};
一旦你保存了这两个 Lambda 函数,测试运行 Lambda_A
:
一旦您使 基本 内部 lambdda 调用正常工作,您就可以轻松扩展它以调用更复杂的 Lambda 函数.
<块引用>您必须记住的主要事情是为所有功能设置适当的ARN角色
.
I have the following function which I use to invoke a Lambda function from within my code.
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 > })
How can I invoke a Lambda function from within a Lambda function?
My 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;
Invoking a Lambda Function from within another Lambda function is quite simple using the aws-sdk
which is available in every Lambda.
I suggest starting with something simple first.
This is the "Hello World" of intra-lambda invocation:
Lambda_A
invokes Lambda_B
with a Payload
containing a single parameter name:'Alex'
.
Lambda_B
responds with Payload: "Hello Alex"
.
First create Lambda_B
which expects a name
property
on the event
parameter
and responds to request with "Hello "+event.name
:
Lambda_B
exports.handler = function(event, context) {
console.log('Lambda B Received event:', JSON.stringify(event, null, 2));
context.succeed('Hello ' + event.name);
};
Ensure that you give Lambda_B
and Lambda_A
the same role.
E.g: create a role called lambdaexecute
which has AWSLambdaRole
, AWSLambdaExecute
and
AWSLambdaBasicExecutionRole
(All are required):
Lambda_A
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);
}
})
};
Once you have saved both these Lambda functions, Test run Lambda_A
:
Once you have the basic intra-lambdda invocation working you can easily extend it to invoke more elaborate Lambda functions.
The main thing you have to remember is to set the appropriate
ARN Role
for all functions.
这篇关于Nodejs - 从另一个 lambda 函数中调用 AWS.Lambda 函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!