AWS Lambda: función en NODEJS

Nodejs es uno de los lenguajes que admite la función AWS Lambda. Las versiones compatibles con nodejs son v6.10 y v8.10. En este capítulo, aprenderemos en detalle sobre varias funcionalidades de la función AWS Lambda en NODEJS.

Controlador en NodeJS

Para escribir la función AWS Lambda en nodejs, primero debemos declarar un controlador. El controlador en nodejs es el nombre del archivo y el nombre de la función de exportación. Por ejemplo, el nombre del archivo esindex.js y el nombre de la función de exportación es lambda handler, por lo que su controlador correspondiente es index.lambdahandler

Observe un controlador de muestra que se muestra aquí:

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

Params to Handler

Handler es el núcleo principal para construir la función Lambda. El manejador toma tres parámetros:event, context y callback.

Parámetro de evento

Tiene todos los detalles del evento desencadenado. Por ejemplo, si usamos la función Lambda para que se active en S3, el evento tendrá detalles del objeto S3.

Parámetro de contexto

Tiene los detalles del contexto, como las propiedades y los detalles de configuración de la función Lambda.

Función de devolución de llamada

Ayuda a dar detalles a la persona que llama. La estructura de la devolución de llamada se ve de la siguiente manera:

callback(error, result);

Los parámetros de la función de devolución de llamada se explican a continuación:

Error −Esto tendrá detalles si se ha producido algún error durante la ejecución de la función Lambda. Si la función Lambda tiene éxito,null se puede pasar como el primer parámetro para la función de devolución de llamada.

Result −Esto le dará los detalles de la ejecución exitosa de la función lambda. Si ocurre un error, se ignora el parámetro de resultado.

Note −No es obligatorio utilizar la función de devolución de llamada en AWS Lambda. En caso de que no haya una función de devolución de llamada, el controlador la devolverá como nula.

Las firmas de devolución de llamada válidas se dan a continuación:

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

Siempre que se ejecuta AWS Lambda, los detalles de la devolución de llamada, como el error o el éxito, se registran en AWS CloudWatch junto con los mensajes de la consola, si los hubiera.

Trabajar con AWS Lambda en Nodejs8.10

Entendamos cómo trabajar con AWS Lambda en nodejs8.10 e invoquemos la función de forma sincronizada y asincrónica.

Invocación de la función Lambda de forma sincronizada

El siguiente ejemplo le da una idea sobre cómo invocar la función Lambda de forma sincronizada:

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);
};

Puede observar el siguiente resultado después de probar este código en la consola de AWS:

Tenga en cuenta que la salida del código anterior es un objeto de promesa. No da el recuento, ya que el recuento se incrementa dentro de un setTimeout y la llamada a la función no espera la ejecución dentro de setTimeout y devuelve el objeto de promesa.

Si tuvieramos async/await en la función del controlador obtendrá la salida exacta de la función lambda.

Invocar al controlador de forma asincrónica

El siguiente ejemplo le da una idea sobre cómo invocar la función Lambda de forma asíncrona:

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);
};

Hemos agregado async y awaiten el código anterior. Cuando usamosawaital lado de la llamada a la función, la ejecución se detiene hasta que se resuelve la promesa dentro de la función. Tenga en cuenta queawait es válido solo para async funciones.

Puede observar el siguiente resultado después de probar este código en la consola de AWS:

Detalles de contexto en NodeJS

El objeto de contexto proporciona detalles como el nombre de la función Lambda, el tiempo restante en milisegundos, la identificación de la solicitud, el nombre del grupo de observación en la nube, los detalles del tiempo de espera, etc.

Las siguientes tablas muestran la lista de métodos y atributos disponibles con el objeto de contexto:

Método disponible para objeto de contexto

No Señor Nombre y descripción del método
1

getRemainingTimeInMillis()

Este método proporciona el tiempo restante en milisegundos hasta que la función Lambda finaliza la función

Atributos disponibles para el objeto de contexto

No Señor Nombre y descripción del atributo
1

functionName

Esto le da el nombre de la función de AWS Lambda

2

functionVersion

Esto da la versión de la función AWS Lambda que se ejecuta

3

nvokedFunctionArn

Esto le dará detalles de ARN.

4

memoryLimitInMB

Esto muestra el límite de memoria agregado al crear la función Lambda

5

awsRequestId

Esto proporciona el ID de solicitud de AWS.

6

logGroupName

Esto le dará el nombre del grupo de Cloudwatch

7

logStreamName

Esto le dará el nombre del flujo de registro de Cloudwatch donde se escriben los registros.

8

identity

Esto proporcionará detalles sobre el proveedor de identidad de amazon cognito cuando se usa con aws mobile sdk.

Los detalles dados son los siguientes:

  • identity.cognito_identity_id
  • identity.cognito_identity_pool_id
9

clientContext

Esto mostrará detalles de la aplicación cliente cuando se usa con aws mobile sdk. Los detalles dados son los siguientes:

  • 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: tiene un dictado de valores personalizados de la aplicación de cliente móvil
  • client_context.env: tiene detalles del entorno del AWS Mobile SDK

Mire el siguiente ejemplo para tener una mejor idea sobre el objeto de contexto:

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);
};

Puede observar el siguiente resultado después de probar este código en la consola de AWS:

Puede observar la siguiente salida de registro después de probar este código en la consola de AWS:

Iniciar sesión en NodeJS

Podemos usar console.log para iniciar sesión en NodeJS. Los detalles del registro se pueden obtener del servicio CloudWatch con la función Lambda.

Observe el siguiente ejemplo para una mejor comprensión:

exports.handler = (event, context, callback) => {
   // TODO implement
   console.log('Logging for AWS Lamnda in NodeJS');
   callback(null, 'Name of aws Lambda is=>'+context.functionName);
};

Puede observar el siguiente resultado después de probar este código en la consola de AWS:

Puede observar la siguiente captura de pantalla de CloudWatch:

Manejo de errores en NodeJS

Entendamos cómo se realiza la notificación de errores en NodeJS. Observe el siguiente código:

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

Puede observar lo siguiente en la salida del registro:

Los detalles del error se dan en la devolución de llamada de la siguiente manera:

{
   "errorMessage": "something is wrong",
   "errorType": "Error",
   "stackTrace": [    "exports.handler (/var/task/index.js:2:17)"  ]
}