Introducción a AWS Lambda y Node.js

I

Érase una vez, no hace tanto tiempo, una palabra que me llamó la atención. Lambda. Eso tocó una fibra sensible, recordando los buenos tiempos de jugar Half-Life cuando era niño. Poco sabía yo qué era AWS Lambda y lo increíblemente asombroso que es. Si está intrigado, quédese. Solo tomaré unos minutos de su ya ajetreado día, y seguramente no le importará.

Funcionar como un servicio

Vamos a entrar de inmediato. La arquitectura a la que pertenece AWS Lambda se llama Computación sin servidor o Funcionar como un servicio. Es innovador debido a la falta de servidores. Eso suena extraño. Bueno, el código no se ejecuta en patatas, ¿verdad? De acuerdo, eso es solo un dicho. Lo que realmente está sucediendo es que usted, el desarrollador, no necesita preocuparse por la infraestructura en la que se ejecuta su código. Implementa el código en la nube y él mismo maneja la creación de todos los recursos necesarios. ¿Pero cómo? ¡Contenedores!

No, esos no. ¡Estas!

 

Estibador

Docker es la plataforma de contenedores de software líder en el mundo. Los desarrolladores usan Docker para eliminar los problemas de “funciona en mi máquina” cuando colaboran en el código con sus compañeros de trabajo. Los operadores usan Docker para ejecutar y administrar aplicaciones una al lado de la otra en contenedores aislados para obtener una mejor densidad informática. Las empresas utilizan Docker para crear canales de entrega de software ágiles para ofrecer nuevas funciones de forma más rápida, más segura y con confianza para las aplicaciones Linux, Windows Server y Linux en mainframe.

Cada vez que se crea una función de AWS Lambda, se activa un contenedor para servirla. El código se implementa en el contenedor y luego se ejecuta. Por lo tanto, cada solicitud posterior es más rápida porque AWS omite la creación inicial del contenedor si ya existe.

Creando tu primera función

Antes de que pueda ver el código, debe crear una nueva función en la consola de AWS. Lo que significa que necesita una cuenta de AWS. Si no tiene una cuenta, no dude en crear una, tienen increíbles niveles gratuitos que incluyen varios servicios y duran hasta 12 meses.

Continuando, inicie un navegador y navegue hasta su cuenta. Desde allí, debe encontrar Lambda. Presione el menú desplegable de servicios y seleccione Lambda.

Llegará a la página de inicio de Lambda con un gran botón naranja que le indicará que cree una nueva función. Bueno, no lo dejes esperando más, presiónalo.

Esto lo llevará al selector de planos de funciones. Como este ejemplo cubrirá una función básica que simulará un lanzamiento de dados, olvidémonos de los planos y creemos uno desde cero.

¡Increíble! Ahora solo necesita agregar un nombre y papel para la función y finalmente empezar a escribir código. Con respecto al rol, siéntase libre de elegir un rol existente como lambda_basic_execution. Será más que suficiente para este sencillo ejemplo. Finalmente, continúe y cree la función.

¡Excelente! Ahora finalmente está viendo un código. Mucho mejor. Vamos a sumergirnos. Hay varias opciones a tener en cuenta. La opción de tipo de entrada de código establece cómo agregará código a la función. Puede estar en línea, cargar un archivo .zip o cargar desde S3. Usaremos la primera opción, editando en línea. Para funciones pequeñas, está totalmente bien escribir código en línea. Pero cuando tienes más código, se vuelve muy tedioso. Es por eso que hay una opción de carga .zip que también veremos más adelante.

Deje el tiempo de ejecución como Node.js 6.10, que es la última versión compatible de Node.js para Lambda en el momento de escribir este artículo. El manejador también puede permanecer igual. “índice” representa el nombre del archivo, mientras que handler es el nombre de la función.

Consulte los parámetros que toma la función. Un poco extraños, ¿no? Vamos a analizarlo.

  • los event El parámetro contiene la información del evento actual. Eso significa que el evento que activa la función enviará información a la función que se utilizará. Un ejemplo serían los datos que una solicitud HTTP envía al punto final, como si tiene parámetros de solicitud o un cuerpo.
  • los context contiene toda la información sobre la función en sí. Cuánto tiempo ha estado funcionando, cuánta memoria está consumiendo, entre otras cosas. Esto se ve como información de tiempo de ejecución.
  • los callback es bastante autoexplicativo. Cuando desee decirle a la función que finalice su ejecución, invoca la devolución de llamada. Se necesitan dos parámetros, el primero es un error, el segundo son los datos que desea enviar como respuesta de la función Lambda.

Escribiendo algo de lógica

Eso es suficiente con la configuración por ahora. Codifiquemos algo.

Empezamos con este fragmento de código. El objetivo es escribir un fragmento de código que imite el lanzamiento de un dado.

exports.handler = (event, context, callback) => {
  // TODO implement
  callback(null, 'Hello from Lambda');
};

Aquí va nada.

exports.handler = (event, context, callback) => {
    var min = 1;
    var max = 6;    
    var randomNumber = Math.floor(Math.random() * (max - min + 1)) + min;
    var message="Your dice throw resulted in: " + randomNumber;
    callback(null, message);    
};

¡Agradable! Eso hace el truco. Ahora la función devolverá un número aleatorio entre 1 y 6. Con eso fuera del camino, probémoslo. Presione el botón de prueba naranja y proceda a crear un evento de prueba “Hello World”. Dale un nombre original sin ninguna razón en particular. Solo por la diversión de tener un evento de prueba llamado FunkyName. Ahora puede continuar y probar la función. Después de presionar el botón de prueba, verá algo como esto.

La sección bordeada con el contorno punteado muestra la salida de la función, más precisamente el valor que fue devuelto por la función de devolución de llamada.

¡Eso fue divertido! Ahora tienes un rodar un dado función, pero no hay forma de activarlo fuera de AWS, todavía.

Conectando una API

Aquí viene la parte crucial. ¿Cómo crees que las funciones Lambda saben cómo iniciar su ejecución? ¿Vudú? ¿Magia? No, lamentablemente no. Cada invocación de función se activa mediante un evento. Puede ser cuando una imagen se carga en S3, puede ser una habilidad de Amazon Alexa o simplemente una solicitud HTTP normal.

Creemos un evento HTTP y le digamos que invoque nuestra función. Para poder hacer esto, primero debe saltar a Puerta de enlace API en la consola de AWS. En el menú desplegable de servicios, seleccione API Gateway y aterrizará aquí.

Inmediatamente se le pedirá que cree una API. Ignore todas las sugerencias y elija Nueva API e ingrese un nombre para su API. Me voy a quedar con FunkyApi, simplemente suena bien. Continúe y presione crear.

Ahora viene la parte divertida. Finalmente, conecte la API a la función. Primero presione el Comportamiento desplegable y elegir Crear método. Verá aparecer otro menú desplegable más pequeño. Presiónelo y elija OBTENER. Establezca el tipo de integración en Función Lambda, seleccione la región donde creó la función y escriba el nombre de su función.

¡Presiona guardar y regocíjate!

La API está configurada y lista. Ahora solo necesita implementarlo. presione el Comportamiento menú desplegable una vez más y pulsa Implementar API. Elija una nueva etapa de implementación, anote dev como nombre de la etapa y estará listo para implementar la API.

¡Finalmente! El punto final de la API está listo. Ahora tiene acceso al Invocar URL sobre el dev Stage Editor.

No dude en abrir el punto final de la API en una ventana del navegador y comprobar el resultado. ¿Que ves? No realmente, ¿qué ves? Se debe devolver un número aleatorio entre 1 y 6. ¿¡Qué asombroso es esto !? En menos de 5 minutos, ha creado una función Lambda, la ha conectado a API Gateway y ha creado un punto final para consumir cuando lo desee.

Subiendo código con un ZIP

¿Qué sucede si necesita utilizar algunos módulos de npm? No puede agregarlos en línea. Tiene que haber una forma de ejecutar código con dependencias. Bueno, lo hay, pero es un poco complicado hacerlo bien. Sin embargo, ¡sigamos adelante!

En primer lugar, cree un directorio e inicialice npm.

$ mkdir roll-a-dice && npm init

Una vez que haya hecho esto, continúe e instale moment, una biblioteca de fecha y hora simple.

$ npm install moment --save

Esto creará una carpeta node_modules con las dependencias requeridas. Para incluirlos, debe comprimir todos los archivos y cargar el archivo .ZIP en Lambda.

Nota IMPORTANTE: Comprima únicamente los archivos y carpetas dentro del directorio del proyecto. Hacer NO zip toda la carpeta. Si lo hace, se romperá la configuración y la función Lambda fallará.

Antes de continuar y comprimir los archivos, agregue algo de código con el nuevo módulo npm que acaba de instalar para asegurarse de que la función Lambda lo usa.

Cree un nuevo archivo en el directorio del proyecto y asígnele un nombre index.js. Pegue la función Lambda existente de AWS en el archivo y edítela ligeramente.

var moment = require('moment');

exports.handler = (event, context, callback) => {
  var min = 1;
  var max = 6;
  
  var randomNumber = Math.floor(Math.random() * (max - min + 1)) + min;
  var now = moment().format();
  
  var message="Your dice throw resulted in " + 
  randomNumber + ' and was issued at ' + now;
  
  callback(null, message);
};

Guarde todos los archivos y ciérrelos. Recuerde, solo los archivos y carpetas dentro del rodar un dado directorio.

Ahora tiene un archivo .ZIP. Continúe y vuelva a la consola de AWS.

Cambiar el Tipo de entrada de código a Cargar un archivo .ZIP y cargue el archivo que acaba de comprimir. ¡Excelente! Ahora, vuelva a la parte superior de la página y presione el botón naranja grande una vez más para Guardar y probar la función.

¡Agradable! Funciona y muestra la fecha y hora actuales. Comprimió correctamente la función y el módulo npm. Por si acaso, vuelva a la ventana del navegador y pruebe el punto final una vez más. Ahora debería mostrar el mensaje actualizado.

 

API y aplicaciones sin servidor de AWS: una introducción completa

¿Desea obtener más información sobre Lambda, API Gateway y otros servicios de AWS? Intente realizar un curso de formación paso a paso para enseñarle cómo crear rápidamente servicios web rápidos, económicos y escalables.

 

¿Ahora que? ¡Empiece a codificar!

Lambda es una herramienta increíble que funciona bien con una gran cantidad de otros servicios en AWS. Las funciones de Lambda se pueden invocar en respuesta a un evento como la carga de archivos, se pueden usar para chatbots, API REST y mucho, mucho más.

Este simple ejemplo de API que codificamos anteriormente es solo el comienzo. Pero puedes ver el punto. Se evita tanta sobrecarga con solo preocuparse por el código, sin preocuparse por la infraestructura subyacente. Les insto a que sigan jugando con esta tecnología, ya que solo se volverá más popular en el futuro. Simplemente comience a codificar. Sea lo que sea, no importa. Simplemente comience a escribir código, porque aprenderá más haciéndolo usted mismo.

Si omitió alguno de los pasos anteriores, aquí está el repositorio con todo el codigo.

Espero que hayan disfrutado leyendo esto tanto como yo disfruté escribiéndolo. Hasta la próxima, ten curiosidad y diviértete.

¿Crees que este tutorial será de ayuda para alguien? No dudes en compartir. Si te gustó, házmelo saber en los comentarios a continuación.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad