我有以下函数,可用于从我的代码中调用Lambda函数。
但是,当我尝试在Lambda函数中使用它时,出现以下错误:
AWS lambda undefined 0.27s 3 retries] invoke({ FunctionName: 'my-function-name', InvocationType: 'RequestResponse', LogType: 'Tail', Payload: <Buffer > })
如何从Lambda函数中调用Lambda函数?
我的功能:
'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;
使用aws-sdk每个Lambda中都提供的,从另一个Lambda函数中调用Lambda函数非常简单。
aws-sdk
我建议首先从 简单的 事情开始。 这是lambda内调用的“ Hello World”:
Lambda_A``Lambda_B 使用Payload包含一个参数的调用name:'Alex'。 Lambda_B回应有效负载:"Hello Alex"。
Lambda_A``Lambda_B
Payload
name:'Alex'
Lambda_B
"Hello Alex"
首先创建Lambda_B,它期望参数具有name 属性 , 并使用以下命令响应请求:event "Hello "+event.name
name
event
"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( 出于某些原因,两者都需要 ):
Lambda_A
lambdaexecute
AWSLambdaExecute
AWSLambdaBasicExecutionRole
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:
一旦完成了 基本 的lambdda内调用工作,就可以轻松扩展它以调用更复杂的Lambda函数。
您要 记住 的主要事情是 为所有功能 设置适当ARN Role的功能。
ARN Role