node.js-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函数?

我的功能:

'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;
3个解决方案
96 votes

使用每个Lambda中都提供的ARN Role,从另一个Lambda函数中调用Lambda函数非常简单。

我建议先从简单的事情开始。
这是lambda内调用的“ Hello World”:

ARN Role调用Lambda_Alambdaexecute中包含一个参数AWSLambdaExecute
AWSLambdaBasicExecutionRole回应有效负载:"Hello Alex"

lambda invoke

首先创建ARN Role,它需要Lambda_A属性在lambdaexecute参数上
并以AWSLambdaExecute响应请求:

Lambda_B

exports.handler = function(event, context) {
  console.log('Lambda B Received event:', JSON.stringify(event, null, 2));
  context.succeed('Hello ' + event.name);
};

确保为ARN RoleLambda_A赋予相同的角色。
例如:创建一个名为lambdaexecute的角色,该角色同时具有AWSLambdaExecuteAWSLambdaBasicExecutionRole(出于某些原因都需要):

lambda-role-for-intra-lambda-execution

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函数后,测试运行ARN Role

lambda invoke-lambda_a-execution-result

一旦完成了基本的lambda内调用工作,就可以轻松扩展它以调用更复杂的Lambda函数。

您要记住的主要事情是为所有功能设置适当的ARN Role

nelsonic answered 2020-02-10T05:35:29Z
25 votes

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

使用AWS Step Functions,您可以将应用程序定义为状态   机器,一系列步骤共同捕获了   应用程式。 状态机中的状态可以是任务,顺序步骤,   并行步骤,分支路径(选择)和/或计时器(等待)。 任务   是工作单元,这项工作可以由AWS Lambda执行   函数,任何类型的Amazon EC2实例,容器或   场所服务器-可以与Step Functions通信的任何服务器   可以为API分配任务。

因此,以下状态机应满足您的需求。

enter image description here

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

{
  "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
    }

  }
}

此外,您可以在状态机中添加更为复杂的逻辑,例如并行步骤和捕获故障。 它甚至记录每个执行的详细信息,这使调试有了更好的体验,尤其是对于lambda函数。

enter image description here

C.Lee answered 2020-02-10T05:36:08Z
2 votes

@nelsonic提到的所有内容都是正确的,除了角色。

我尝试选择他上面提到的角色:

  • AWSLambdaExecute
  • AWSLambdaBasicExecutionRole

但是它不允许我调用其他lambda函数,因此我将角色更改为以下内容:

  • AWSLambda角色
  • AWSLambdaBasicExecutionRole

背后的原因是AWSLambdaExecute仅提供Put,Get访问S3和完全访问CloudWatch Logs。但是AWSLambdaRole为AWS Lambda服务角色提供了默认策略。如果您遵守其权限策略,它将讨论invokeFunction

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

注意:可以在没有AWSLambdaBasicExecutionRole策略的情况下继续进行,因为它仅启用了云中的日志监视功能。 但是AWSLambdaRole是绝对必要的。

Mohammed Asad answered 2020-02-10T05:37:03Z
translate from https://stackoverflow.com:/questions/35754766/nodejs-invoke-an-aws-lambda-function-from-within-another-lambda-function