Nodejs – 从另一个lambda函数中调用AWS.Lambda函数

我有以下函数,我用它来调用我的代码中的Lambda函数。

但是,当我尝试在Lambda函数内使用它时,出现以下错误:

AWS lambda undefined 0.27s 3 retries] invoke({ FunctionName: 'my-function-name', InvocationType: 'RequestResponse', LogType: 'Tail', Payload: <Buffer > }) 

我如何从Lambda函数中调用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函数中调用Lambda函数非常简单,使用每个Lambda中都可用的aws-sdk

我build议先从简单的事情开始。
这是lambdaexpression式调用的“Hello World”:

Lambda_A使用包含单个参数name:'Alex'Payload调用Lambda_B
Lambda_B回应有效载荷: "Hello Alex"

拉姆达调用

首先创build需要event参数的name 属性的 Lambda_B
并用"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); }; 

确保您为Lambda_BLambda_A相同的angular色。
例如:创build一个名为lambdaexecute的angular色,它具有AWSLambdaExecute AWSLambdaBasicExecutionRole出于某种原因,都是必需的 ):

λ-角色换内的λ-执行

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); } }) }; 

一旦保存了这两个Lambda函数,Test运行Lambda_A

lambda invoke-lambda_a-execution-result

一旦你有基本的lambdaexpression式调用工作,你可以很容易地扩展它来调用更复杂的Lambda函数。

你必须记住的主要事情是为所有function设置适当的ARN Role

截至2016年12月3日,您可以简单地使用AWS Stepfunction将Lambda函数Lambda_B作为Lambda_A的顺序步骤。

借助AWS Step Functions,您可以将您的应用程序定义为状态机,这是一系列步骤,共同捕捉应用程序的行为。 状态机中的状态可以是任务,顺序步骤,并行步骤,分支path(select)和/或定时器(等待)。 任务是工作单元,可以使用AWS Lambda函数,任何types的Amazon EC2实例,容器或本地服务器执行此项工作 – 任何可以与Step Functions API通信的任何项都可以分配一个任务。

所以下面的状态机应该满足你的需要。

在这里输入图像描述

这是与状态机对应的代码。

 { "Comment": "A simple example of the Amazon States Language using an AWS Lambda Function", "StartAt": "Lambda_A", "States": { "Lambda_A": { "Type": "Task", "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME", "Next": "Lambda_B" }, "Lambda_B":{ "Type": "Task", "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME", "End": true } } } 

而且,您可以在状态机中添加更复杂的逻辑,例如并行步骤和捕获失败。 它甚至logging每一个执行的细节,这使得debugging更好的体验,特别是对于lambda函数。

在这里输入图像描述