Учебники

AWS Lambda — функция в NODEJS

Nodejs — это один из языков, которые поддерживает лямбда-функция AWS. Версия, поддерживаемая с помощью nodejs: v6.10 и v8.10. В этой главе мы подробно узнаем о различных функциях лямбда-функции AWS в NODEJS.

Обработчик в NodeJS

Чтобы написать AWS лямбда-функцию в nodejs, мы должны сначала объявить обработчик. Обработчик в nodejs — это имя файла и имя функции экспорта. Например, имя файла — index.js, а имя функции экспорта — лямбда-обработчик , поэтому соответствующий ему обработчик — index.lambdahandler.

Обратите внимание на пример обработчика, показанный здесь —

exports.lambdahandler = function(event, context, callback) {   //code goes here}

Params to Handler

Обработчик является основным ядром для построения лямбда-функции. Обработчик принимает три параметра: событие, контекст и обратный вызов .

Параметр события

В нем есть все подробности сработавшего события. Например, если мы используем лямбда-функцию для запуска на S3, событие будет иметь подробную информацию об объекте S3.

Параметр контекста

Он содержит детали контекста, такие как свойства и детали конфигурации функции Lambda.

Функция обратного вызова

Это помогает в предоставлении деталей обратно звонящему. Структура обратного вызова выглядит следующим образом —

callback(error, result);

Параметры функции обратного вызова описаны ниже:

Ошибка — это будет иметь подробную информацию, если какая-либо ошибка произошла во время выполнения лямбда-функции. Если лямбда-функция завершается успешно, в качестве первого параметра функции обратного вызова можно передать значение null .

Результат — это даст подробную информацию об успешном выполнении лямбда-функции. Если возникает ошибка, результат param игнорируется.

Примечание. В AWS Lambda не обязательно использовать функцию обратного вызова. Incase, если нет функции обратного вызова, обработчик вернет ее как ноль.

Действительные подписи обратного вызова приведены ниже —

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 в функции-обработчике, мы получим точный результат от лямбда-функции

Вызов обработчика в асинхронном режиме

Следующий пример дает вам представление о том, как вызывать лямбда-функцию асинхронным способом.

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 рядом с вызовом функции, выполнение приостанавливается, пока не будет выполнено обещание внутри функции. Обратите внимание, что ожидание действительно только для асинхронных функций.

После тестирования этого кода в консоли AWS вы можете наблюдать следующий вывод:

Вывод четного числа

ContextDetails в NodeJS

Объект контекста предоставляет такие детали, как имя лямбда-функции, оставшееся время в миллисекундах, идентификатор запроса, имя группы в облачном хранилище, сведения о тайм-ауте и т. Д.

В следующих таблицах показан список методов и атрибутов, доступных с контекстным объектом —

Метод доступен для объекта контекста

Sr.No Название и описание метода
1

getRemainingTimeInMillis ()

Этот метод дает оставшееся время в миллисекундах, пока функция Lambda не завершит функцию.

getRemainingTimeInMillis ()

Этот метод дает оставшееся время в миллисекундах, пока функция Lambda не завершит функцию.

Атрибуты, доступные для объекта контекста

Sr.No Название атрибута и описание
1

FunctionName

Это дает имя лямбда-функции AWS

2

functionVersion

Это дает версию AWS Lambda, выполняющую функцию

3

nvokedFunctionArn

Это даст ARN детали.

4

memoryLimitInMB

Это показывает ограничение памяти, добавленное при создании лямбда-функции

5

awsRequestId

Это дает идентификатор запроса AWS.

6

logGroupName

Это даст название имени группы CloudWatch

7

logStreamName

Это даст имя имени потока журнала cloudwatch, в котором записываются журналы.

8

идентичность

Это даст подробную информацию о 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

FunctionName

Это дает имя лямбда-функции AWS

functionVersion

Это дает версию AWS Lambda, выполняющую функцию

nvokedFunctionArn

Это даст ARN детали.

memoryLimitInMB

Это показывает ограничение памяти, добавленное при создании лямбда-функции

awsRequestId

Это дает идентификатор запроса AWS.

logGroupName

Это даст название имени группы CloudWatch

logStreamName

Это даст имя имени потока журнала cloudwatch, в котором записываются журналы.

идентичность

Это даст подробную информацию о Amazon Cognito провайдера идентификации при использовании с AWS Mobile SDK.

Подробности приведены ниже:

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 —

Скриншот Cloud Watch

Обработка ошибок в NodeJS

Давайте разберемся, как делается уведомление об ошибке в NodeJS. Соблюдайте следующий код —

exports.handler = function(event, context, callback) {
   // This Source code only throws error. 
   var error = new Error("something is wrong");
   callback(error);   
};

Детали результата выполнения

Вы можете наблюдать следующее в выводе журнала:

Наблюдение за выходом журнала

Детали ошибки приведены в обратном вызове следующим образом: