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;
Ответы
Ответ 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. Он даже регистрирует детали каждого отдельного выполнения, что делает отладку намного лучше, особенно для лямбда-функций.
![введите описание изображения здесь]()