Подтвердить что ты не робот

Nodejs - вызывать функцию AWS.Lambda из другой лямбда-функции

У меня есть следующая функция, которую я использую для вызова функции Lambda из моего кода.

Однако, когда я пытаюсь использовать его в функции Lambda, я получаю следующую ошибку:

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

Как я могу вызвать функцию лямбда из функции лямбда?

Моя функция:

'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;
4b9b3361

Ответ 1

Вызов функции лямбда из другой функции лямбда довольно прост, используя aws-sdk, который доступен в каждой лямбда.

Я предлагаю сначала начать с чего-то простого.
Это "Hello World" внутри-лямбда-призыва:

Lambda_A вызывает Lambda_B с Payload, содержащим единственный параметр name:'Alex'.
Lambda_B отвечает полезной нагрузкой: "Hello Alex".

lambda invoke

Сначала создайте Lambda_B, который ожидает свойство name по параметру event и отвечает на запрос с помощью "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_B и Lambda_A ту же роль.
Например: создайте роль под названием lambdaexecute, которая имеет как AWSLambdaExecute, так и AWSLambdaBasicExecutionRole (по какой-то причине оба были необходимы):

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_A:

lambda invoke-lambda_a-execution-result

После того, как вы будете работать с базовым интра-лямбда-вызовом, вы можете легко расширить его, чтобы вызвать более сложные функции лямбда.

Главное, что вам нужно запомнить, - установить соответствующие ARN Role для всех функций.

Ответ 2

По состоянию на 3 декабря 2016 года вы можете просто использовать функцию AWS Step, чтобы поместить функцию лямбда Lambda_B в качестве последовательного шага Lambda_A.

С помощью шаговых функций AWS вы определяете свое приложение как состояние машина, серия шагов, которые вместе фиксируют поведение приложение. Государствами на государственном компьютере могут быть задачи, последовательные шаги, параллельные шаги, пути ветвления (выбор) и/или таймеры (ожидание). Задания являются единицами работы, и эта работа может выполняться AWS Lambda функции, экземпляры Amazon EC2 любого типа, контейнеры или серверы помещений - все, что может связываться с функциями Step 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
    }

  }
}

Кроме того, вы можете добавлять гораздо более сложные логики в конечный автомат, например, параллельные шаги и сбои catch. Он даже регистрирует детали каждого отдельного выполнения, что делает отладку намного лучше, особенно для лямбда-функций.

введите описание изображения здесь