ir a pragma.co
Lecciones Academia Pragma

Crear y utilizar un layer en Serverless y Node.js

por Sergio Gutiérrez, el 28 de octubre de 2019

Para comprender adecuadamente este tutorial se recomienda tener conocimientos previos en lambdas de nodejs y serverless.

Nota: reemplazar las partes que se encuentran entre <> con la información personal.

crear_utilizar_layers_severless_nodejs

Amazon Web Service (AWS) sigue impresionando y deslumbrando a todo aquel que se topa con su rica infraestructura, sus flexibles entornos y utilidades. En esta ocasión vienen a colación los layers y las ventajas de hacer uso de ellos.

Ahora, ¿Qué podemos entender por layer(capa)?, claramente como su nombre lo indica una capa puede agrupar código que tiende a repetirse, librerías, binarios y recursos; de los que múltiples lambdas pueden depender al mismo tiempo.

Los layers son una adición relativamente nueva a las características de AWS, por lo que su documentación incluso en inglés tiende a ser muy pobre y fragmentada; es por esto que se ha escrito este artículo recopilando y agregando métodos de automatización un tanto rebuscados pero útiles para permitir que los layers puedan exhibir todo su potencial sin ser un dolor de cabeza.

Para empezar crearemos la carpeta que contendrá nuestro layer junto con algunos archivos vacíos que serán de mucha utilidad de la siguiente forma:

<layer-name>/
├── Jenkinsfile
├── layer/
│ ├── <functions>.js
│ └── node_modules/
├── package.json
└── serverless.yml

El archivo package principal contendrá adicionalmente a las habituales dependencias de node algunos scripts para facilitar la construcción y despliegue del layer.

package.json

Layer en Serverless y Nodejs

El archivo serverless resulta incluso más simple que los de una lambda, en este caso la propiedad más importante resulta ser retain: true la que puede ser retirada para evitar posible uso excesivo de disco, dado que ésta hace que permanezcan las versiones anteriores del layers incluso después de un nuevo despliegue, evitando que las lambdas que hacen referencia a ésta puedan fallar a falta del layer requerido.

serverless.yml

Layer en Serverless y Nodejs 2

 

Se recomienda tener los siguientes scripts de npm para la fácil construcción del layer:

1. Para construir las dependencias:

Layer en Serverless y Nodejs

2. Para desplegar el layer:

Layer en Serverless y Nodejs

Es una buena práctica no construir y desplegar a mano los proyectos, es por esto que el siguiente Jenkinsfile permite realizar el proceso de forma automatizada:

Jenkinsfile

Layer en Serverless y Nodejs

Integración con la lambda:

Ahora deberemos crear una lambda que haga uso de nuestro layer, para ello utilizamos el siguiente comando:

Layer en Serverless y Nodejs

La distribución de archivos quedará así:

<lambda-name>/
├── handler.js
├── Jenkinsfile
└── serverless.yml

Nuestro archivo serverless para la lambda simplemente será como el siguiente, denotando la sección “layers” al final de cada función individual:

serverless.yml

Layer en Serverless y Nodejs

El archivo serverless contendrá la referencia del layer mediante la opción de consola de comandos layer (${opt:layer}), esto quiere decir que al ejecutar serverless deply también deberemos proveer la opción layer de la siguiente forma:

Layer en Serverless y Nodejs

El “layer version ARN” hace referencia al nombre de recurso de Amazon de la versión específica del layer para obtener este parámetro se puede hacer con el siguiente comando:

Layer en Serverless y Nodejs

Todo esto se unifica en el Jenkinsfile para automatizar su despliegue:

Jenkinsfile

Layer en Serverless y Nodejs

Lo más importante a notar en el Jenkinsfile propuesto es la “stage” “Obtain layer version” que es la encargada de obtener el ARN de la versión del layer.

Actualización del layer

Se podría pensar que después de todo esto el layer y la lambda deberían estar listos, en teoría sí, no obstante en el caso de que se desee actualizar la información del layer se producirá un inconveniente y es que el ARN del layer no es actualizado en las lambdas de forma automática, por lo que sería necesario desplegar nuevamente todas las lambdas que hacen uso del layer. No obstante se ha diseñado un script capaz de correr en git bash, cuyo objetivo es actualizar las funciones de las lambdas una a una y es compatible con Jenkins.

Para integrar el script en el layer nos debemos dirigir a la carpeta del layer y abrir una terminal git bash, en la que ejecutaremos los siguientes comandos:

Layer en Serverless y Nodejs

Layer en Serverless y Nodejs

Layer en Serverless y Nodejs

Layer en Serverless y Nodejs

Esto integrará el script como un submódulo del layer permitiendo así que las actualizaciónes que se le puedan hacer al script se vean reflejadas en todos los layers que hagan uso de este script.

Por último, agregaremos la siguiente stage a nuestro Jenkinsfile del layer:

Layer en Serverless y Nodejs

Es cierto que todo esto ha sido un proceso largo y un tanto complicado, no obstante mi consejo es que se tomen las partes que sean útiles y se haga a un lado lo que no, de cualquier forma espero que alla sido de ayuda.

 

Guía para crear una aplicación serverless en 4 pasos

 

 

Temas:Desarrollo de software

Lecciones Pragma

Lecciones en Academia Pragma

Aquí encontrarás tutoriales técnicos para que apliques en temas de desarrollo de software, cloud, calidad en software y aplicaciones móviles. 

También puedes visitar nuestro Blog con contenido actual sobre Transformación Digital, Marketing, Conocimiento de Usuario y más. 

Blog

Suscríbete a la academia

Descarga la Guía para trabajar con ambientes IBM Websphere Portal