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

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

问题描述

我使用以下函数从我的代码中调用 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_BPayload 包含一个参数 name:'Alex'.
Lambda_B 以 Payload 响应:Hello Alex".

首先创建Lambda_B,它需要一个name propertyevent 参数上
并用 "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_BLambda_A 相同的角色.
例如:创建一个名为 lambdaexecute 的角色,它具有 AWSLambdaRoleAWSLambdaExecute 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屋!

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