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.

Приведены следующие подробности -

  • identity.cognito_identity_id
  • identity.cognito_identity_pool_id
9

clientContext

Это будет подробная информация о клиентском приложении при использовании с aws mobile sdk. Подробности приведены ниже -

  • client_context.client.installation_id
  • client_context.client.app_title
  • client_context.client.app_version_name
  • client_context.client.app_version_code
  • client_context.client.app_package_name
  • client_context.custom - в нем есть пользовательские значения из мобильного клиентского приложения
  • client_context.env - в нем есть сведения о среде из 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)"  ]
}