AWS Lambda - функция в NODEJS
Nodejs - один из языков, поддерживаемых функцией AWS Lambda. Версии, поддерживаемые nodejs, - v6.10 и v8.10. В этой главе мы подробно узнаем о различных функциях функции AWS Lambda в NODEJS.
Обработчик в NodeJS
Чтобы написать функцию AWS Lambda в nodejs, мы должны сначала объявить обработчик. Обработчик в nodejs - это имя файла и имя функции экспорта. Например, имя файлаindex.js и имя функции экспорта lambda handler, поэтому его соответствующий обработчик index.lambdahandler
Посмотрите на образец обработчика, показанный здесь -
exports.lambdahandler = function(event, context, callback) { //code goes here}
Параметры для обработчика
Обработчик - это основное ядро для построения лямбда-функции. Обработчик принимает три параметра:event, context а также callback.
Параметр события
В нем есть все детали инициированного события. Например, если мы используем лямбда-функцию для запуска на S3, событие будет содержать подробную информацию об объекте S3.
Параметр контекста
Он содержит подробную информацию о контексте, такую как свойства и детали конфигурации лямбда-функции.
Функция обратного вызова
Это помогает вернуть подробности звонящему. Структура обратного вызова выглядит следующим образом -
callback(error, result);
Параметры функции обратного вызова объяснены ниже -
Error −В нем будут подробности, если во время выполнения лямбда-функции произошла какая-либо ошибка. Если лямбда-функция завершается успешно,null можно передать как первый параметр для функции обратного вызова.
Result −Это даст подробную информацию об успешном выполнении лямбда-функции. Если возникает ошибка, параметр результата игнорируется.
Note −Использование функции обратного вызова в AWS Lambda не является обязательным. Если функции обратного вызова нет, обработчик вернет ее как null.
Действительные подписи обратного вызова приведены ниже -
callback(); // It will return success, but no indication to the caller
callback(null); // It will return success, but no indication to the caller
callback(null, "success"); // It will return the success indication to the caller
callback(error); // It will return the error indication to the caller
Всякий раз, когда AWS Lambda запускается, детали обратного вызова, такие как ошибка или успех, регистрируются в AWS CloudWatch вместе с сообщениями консоли, если таковые имеются.
Работа с AWS Lambda в Nodejs8.10
Давайте разберемся, как работать с AWS Lambda в nodejs8.10 и вызывать функцию синхронно и асинхронно.
Синхронный вызов лямбда-функции
Следующий пример дает вам представление о синхронном вызове лямбда-функции:
exports.handler = function(event, context, callback) {
let arrItems = [4,5,6,8,9,10,35,70,80,31];
function countevennumbers (items) {
return new Promise(resolve => {
setTimeout(() => {
let a = 0;
for (var i in items) {
if (items[i] % 2 == 0) {
a++;
}
}
resolve(a);
},2000);
});
}
let evennumber = countevennumbers(arrItems);
callback(null,'even numbers equals ='+evennumber);
};
После тестирования этого кода в консоли AWS вы можете увидеть следующий результат:
Обратите внимание, что вывод из приведенного выше кода является объектом обещания. Он не дает счет, поскольку счетчик увеличивается внутри setTimeout, а вызов функции не ожидает выполнения внутри setTimeout и возвращает объект обещания.
Если бы у нас было async/await в функции-обработчике получит точный вывод от лямбда-функции.
Вызов обработчика асинхронным способом
Следующий пример дает вам представление о вызове функции Lambda в асинхронном режиме:
exports.handler = async function(event, context, callback) {
let arrItems = [4,5,6,8,9,10,35,70,80,31];
function countevennumbers (items) {
return new Promise(resolve => {
setTimeout(() => {
let a = 0;
for (var i in items) {
if (items[i] % 2 == 0) {
a++;
}
}
resolve(a);
}, 2000);
});
}
let evennumber = await countevennumbers(arrItems);
callback(null,'even numbers equals ='+evennumber);
};
Мы добавили async а также awaitв приведенном выше коде. Когда мы используемawaitрядом с вызовом функции выполнение приостанавливается до тех пор, пока обещание внутри функции не будет разрешено. Обратите внимание, чтоawait действительно только для async функции.
После тестирования этого кода в консоли AWS вы можете увидеть следующий результат:
ContextDetails в NodeJS
Объект контекста предоставляет такие детали, как имя лямбда-функции, оставшееся время в миллисекундах, идентификатор запроса, имя группы облачных наблюдений, детали тайм-аута и т. Д.
В следующих таблицах показан список методов и атрибутов, доступных для объекта контекста.
Доступный метод для объекта контекста
Старший Нет | Название и описание метода |
---|---|
1 | getRemainingTimeInMillis() Этот метод дает оставшееся время в миллисекундах до тех пор, пока функция Lambda не завершит функцию. |
Атрибуты, доступные для объекта контекста
Старший Нет | Название и описание атрибута |
---|---|
1 | functionName Это дает имя функции AWS Lambda. |
2 | functionVersion Это дает версию функции AWS Lambda, выполняющую |
3 | nvokedFunctionArn Это даст подробную информацию о ARN. |
4 | memoryLimitInMB Это показывает ограничение памяти, добавленное при создании лямбда-функции. |
5 | awsRequestId Это дает идентификатор запроса AWS. |
6 | logGroupName Это даст имя группы cloudwatch. |
7 | logStreamName Это даст имя потока журнала Cloudwatch, в который записываются журналы. |
8 | identity Это даст подробную информацию о поставщике идентификационных данных Amazon Cognito при использовании с aws mobile sdk. Приведены следующие подробности -
|
9 | clientContext Это будет подробная информация о клиентском приложении при использовании с aws mobile sdk. Подробности приведены ниже -
|
Взгляните на следующий пример, чтобы получить лучшее представление об объекте контекста -
exports.handler = (event, context, callback) => {
// TODO implement
console.log('Remaining time =>', context.getRemainingTimeInMillis());
console.log('functionName =>', context.functionName);
console.log('AWSrequestID =>', context.awsRequestId);
console.log('logGroupName =>', context.log_group_name);
console.log('logStreamName =>', context.log_stream_name);
console.log('clientContext =>', context.clientContext);
callback(null, 'Name of aws Lambda is=>'+context.functionName);
};
После тестирования этого кода в консоли AWS вы можете увидеть следующий результат:
Вы можете увидеть следующий вывод журнала после тестирования этого кода в консоли AWS:
Вход в NodeJS
Мы можем использовать console.log для входа в NodeJS. Детали журнала можно получить из службы CloudWatch с помощью функции Lambda.
Обратите внимание на следующий пример для лучшего понимания -
exports.handler = (event, context, callback) => {
// TODO implement
console.log('Logging for AWS Lamnda in NodeJS');
callback(null, 'Name of aws Lambda is=>'+context.functionName);
};
После тестирования этого кода в консоли AWS вы можете увидеть следующий результат:
Вы можете увидеть следующий снимок экрана из CloudWatch -
Обработка ошибок в NodeJS
Давайте разберемся, как делается уведомление об ошибке в NodeJS. Обратите внимание на следующий код -
exports.handler = function(event, context, callback) {
// This Source code only throws error.
var error = new Error("something is wrong");
callback(error);
};
В выводе журнала вы можете наблюдать следующее:
Детали ошибки приведены в обратном вызове следующим образом:
{
"errorMessage": "something is wrong",
"errorType": "Error",
"stackTrace": [ "exports.handler (/var/task/index.js:2:17)" ]
}