Node.js-从另一个Lambda函数中调用AWS.Lambda函数 [英] Nodejs - Invoke an AWS.Lambda function from within another lambda function

查看:244
本文介绍了Node.js-从另一个Lambda函数中调用AWS.Lambda函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下函数,可用于从代码中调用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_BLambda_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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆