Primeros pasos con AWS Lambda y Node.js

Érase una vez, no hace mucho, una palabra me llamó la atención. lambda. Eso tocó una fibra sensible, recordando los buenos viejos tiempos de jugar Half-Life cuando era niño. Poco hice...

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

Función como servicio

Empecemos de inmediato. La arquitectura a la que pertenece AWS Lambda se denomina Informática sin servidor o [Función como servicio](https://en. wikipedia.org/wiki/Function_as_a_service). Es innovador debido a la falta de servidores. Eso suena extraño. Bueno, el código no se ejecuta en papas, ¿o sí? Bien, eso es solo un dicho. Lo que realmente sucede 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 maneja la creación de todos los recursos necesarios por sí mismo. ¿Pero cómo? ¡Contenedores!

{.img-responsive}

No, esos no. ¡Estas!

Docker

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 compañeros de trabajo. Los operadores usan Docker para ejecutar y administrar aplicaciones en paralelo en contenedores aislados para obtener una mejor densidad informática. Las empresas usan Docker para crear canalizaciones ágiles de entrega de software para enviar nuevas funciones de forma más rápida, más segura y con confianza para aplicaciones Linux, Windows Server y Linux en mainframe.

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

Creación de su primera función

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

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

Servicios de AWS

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

Crear una Función

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 simplemente cree uno desde cero.

Autor desde cero

¡Impresionante! Ahora solo necesita agregar un nombre y [función] (http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) para la función y finalmente comenzar 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 simple ejemplo. Finalmente, continúe y cree la función.

Información básica de la función

¡Excelente! Ahora finalmente estás viendo algo de 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á el código a la función. Puede ser en línea, cargar un archivo .zip o cargar desde S3. Usaremos la primera opción, editar 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 mencionaremos más adelante.

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

Editor en línea de funciones

Echa un vistazo a los parámetros que toma la función. Un poco extraño, ¿no? Vamos a desglosarlo.

  • El parámetro event contiene la información del evento actual. Eso significa que el evento que desencadena la función enviará información a la función para usar. 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.
  • El contexto 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 la información de tiempo de ejecución.
  • La devolución de llamada se explica por sí misma. Cuando quiera decirle a la función que finalice su ejecución, invoque la devolución de llamada. Toma dos parámetros, el primero es un error, el segundo son los datos que desea enviar como respuesta de la función Lambda.

Escribir algo de lógica {#escribir algo de lógica}

Eso es suficiente con la configuración por ahora. Vamos a codificar algo.

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

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

Aquí va nada.

1
2
3
4
5
6
7
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, vamos a probarlo. Presione el botón naranja de prueba y proceda a crear un evento de prueba "Hello World". Dale un nombre funky 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.

Prueba de funciones

La sección delimitada por el contorno discontinuo muestra el resultado de la función, más precisamente, el valor que devolvió la función de devolución de llamada.

¡Eso fue divertido! Ahora tiene una función tirar un dado, pero aún no hay forma de activarla fuera de AWS.

Conexión de una API

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

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

Comenzar API Gateway

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

Create API

Ahora viene la parte divertida. Finalmente, conecte la API a la función. Primero presione el menú desplegable Acciones y seleccione Crear método. Verás que aparece otro menú desplegable más pequeño. Púlselo y seleccione 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.

Crear Método y Hook Lambda

¡Presiona guardar y regocíjate!

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

API de implementación

¡Finalmente! El punto final de la API está listo. Ahora tiene acceso a Invoke URL en dev Stage Editor.

API ha sido desplegada

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

Subir código con un ZIP

¿Qué sucede si necesita usar algunos módulos de npm? No puedes 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.

1
$ mkdir roll-a-dice && npm init

Once you've done this, go ahead and install momento, a simple datetime library.

1
$ 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: solo comprima los archivos y carpetas dentro del directorio del proyecto. NO comprima toda la carpeta. ¡Si lo hace, 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 use.

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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 continúe y comprímalos. Recuerde, solo los archivos y carpetas dentro del directorio tirar un dado.

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

Subir ZIP

Cambie el Tipo de entrada de código a Cargar un archivo .ZIP y cargue el archivo que acaba de comprimir. ¡Excelente! Ahora, desplácese hacia atrás hasta 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.

Función de prueba

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

Aplicaciones y API sin servidor de AWS: una introducción completa ¿Quiere obtener más información sobre Lambda, API Gateway y otros servicios de AWS? Intente realizar un curso de capacitación paso a paso para aprender cómo crear rápidamente servicios web rápidos, económicos y escalables.

¿Ahora que? ¡Empieza a codificar! {#lo que ahora empieza a codificar}

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

Este sencillo ejemplo de API que codificamos anteriormente es solo el comienzo. Pero puedes ver el punto. Se evita tanta sobrecarga simplemente preocupándose por el código, sin preocuparse por la infraestructura subyacente. Le insto a que continúe jugando con esta tecnología, ya que solo se volverá más popular en el futuro. Solo comienza a codificar. Sea lo que sea, no importa. Simplemente comience a escribir código, porque aprenderá más si lo hace usted mismo.

Si te saltaste alguno de los pasos anteriores, aquí está el repositorio con todo el código.

Espero que hayan disfrutado leyendo esto tanto como yo disfruté escribiéndolo. Hasta la próxima, sé curioso 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.