Serverless Framework CICD en AWS

Nahuel Hernandez
DevOps
...usar Terraform para crear y administrar infraestructura en la nube... Framework Serverless para crear e implementar

Serverless Framework CICD en AWS

Me encanta usar Terraform para crear y administrar infraestructura en la nube. Sin embargo, hay casos en los que prefiero un Framework Serverless para crear e implementar recursos en AWS, que involucran servicios como la función Lambda y API Gateway. Además, el proceso también se puede automatizar utilizando Gitlab CI/CD. Creo que Terraform plus Serverless Framework es una combinación perfecta para Infraestructura como código y Función como servicio en Amazon Web Services.



Una arquitectura sin servidor (Serverless) es una forma de crear y ejecutar aplicaciones y servicios sin tener que administrar la infraestructura. En AWS podemos crear Lambda, API Gateway, DynamoDB y otros recursos que son "sin servidor". Algunas herramientas pueden ayudarnos a crear e implementar nuestras funciones Lambda y otros recursos de infraestructura como Serverless Framework, SAM, Terraform, Cloudformation y otros.


Framework Serverless

Elijo el Framework Serverless  porque es de código abierto, usa YAML y es agnóstico, podemos usarlo con AWS, Azure, GCP, Knative, etc. Es un marco escrito en Javascript y en segundo plano crea los recursos de infraestructura usando Cloudformation, y lo bueno es que nos permite probarlo localmente.


Algunas de las características son:


  • Admite Node.js, Python, Java, Go, C #, Ruby, Swift, Kotlin, PHP, Scala y F #
  • Gestiona el ciclo de vida de su arquitectura sin servidor (compilar, implementar, actualizar, eliminar).
  • Implemente de forma segura funciones, eventos y sus recursos necesarios juntos a través de administradores de recursos de proveedores ( Ej., AWS CloudFormation).
  • Las funciones se pueden agrupar ("servicios sin servidor") para una fácil gestión de código, recursos y procesos, en grandes proyectos y equipos.
  • Mínima configuración y andamios.
  • Soporte incorporado para múltiples etapas.
  • Optimizado para flujos de trabajo de CI / CD.
  • Cargado de automatización, optimización y mejores prácticas.
  • 100% extensible: se puede extender  o modificar  el framework y sus operaciones a través de plugins o complementos. 
  • Un ecosistema de servicios serverless y plugins 



INFRAESTRUCTURA COMO CÓDIGO EN AWS

Personalmente, en AWS, opto por el frameworks Serverless para crear Lambdas, API Gateway y para otros recursos de infraestructura uso Terraform. Terraform para recursos serverless es complicado y necesita escribir mucho más código que si usa Serverless Framework, también con Serverless Framework los desarrolladores pueden probar sus implementaciones localmente antes de implementar en AWS. Por estas razones, creo que Serverless Framework + Terraform es una combinación asombrosa en AWS.




GITLAB CICD

Automatizaré la implementación Serverless usando el servicio Gitlab CICD, este servicio es muy sencillo de hacer los pipelines, y además tienen  runners gratuitos.


OBJETIVO:

Crear una función Lambda básica con Node y publícarla en el mundo con una puerta de enlace API. Este proceso debe automatizarse cuando se produce una nueva confirmación ( Más conocido como commit) en la rama principal, donde las implementaciones se realizan. Demostración del repositorio con los archivos: https://gitlab.com/naguer/serverless-cicd-on-aws 


EN ESTE TUTORIAL, APRENDERÁ A:

  • Creación de un controlador Lambda
  • Creación de la configuración de Serverless Framework
  • Creando el pipeline de CICD
  • Configuración de su credencial de AWS en Gitlab
  • Implementar su función
  • Probando tu función
  • Extra: ejecutar la función localmente
  • Limpiar los recursos de AWS con AWS Cli


REQUISITO PREVIO:

  • Cuenta de AWS
  • Cuenta de Gitlab
  • Node.js
  • AWS CLI y configurarlo


Creación de un Controlador LAMBDA 

Primero, necesitamos crear una función simple en Node con un mensaje, esta función toma las solicitudes del punto final de API Gateway y regresa con un mensaje.

Archivo: src / handler.js

 

 src es el directorio de las funciones de Lambda, pero podemos cambiarlo. En nuestro caso, module.exports.hello defina el controlador hello y en el siguiente paso con el serverless.ymlllamaremos a este controlador.

Más información sobre el controlador de nodos para Lambda: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

CREACIÓN DE LA CONFIGURACIÓN DEL FRAMEWORKS SERVERLSS

El archivo serverless.yml declara la configuración que utiliza el Framework Serverless para crear nuestro servicio.

Archivo: serverless.yml

Nuestra parte de funciones tiene un controlador y eventos. El controlador proporciona la función Lambda creada anteriormente y los eventos crearán una AWS API Gateway con un punto final GET para permitir que las solicitudes externas se envíen a nuestra función Lambda.



Más información sobre el archivo serverless.yml con el proveedor de AWS: https://www.serverless.com/framework/docs/providers/aws/guide/serverless.yml 


CREANDO EL PIPELINE CI/CD

Ahora necesitamos crear la canalización (Pipeline), nuestra canalización será muy básica

Archivo: .gitlab-ci.yml


Quiero agregar otras etapas para la prueba, pero con la prueba comentada porque no está en el alcance de esta demostración.

Además, quiero agregar solo para activar la canalización cuando alguien escribe en la rama dev .

Archivo: .gitlab-ci.yml

Nota: En el futuro, podemos crear una imagen de Docker personalizada para Serverless con los paquetes necesarios para aumentar la velocidad de la canalización.



CONFIGURACIÓN DE SU CREDENCIAL DE AWS EN GITLAB

Necesitamos realizar el despliegue en AWS. Para esto necesitamos configurar las credenciales de AWS en nuestro repositorio de Gitlab y  para ello necesitamos crear el usuario gitlab-serverless con permisos para crear AWS Lambda, API Gateway, Cloudformation, S3, logs y crea recursos de IAM.


Ahora necesitamos copiar las credenciales de AWS, vaya a la siguiente ruta Github repository Settings > CI/CD > Variables y cree las variables AWS_ACCESS_KEY_ID ,  AWS_SECRET_ACCESS_KEY y AWS_DEFAULT_REGION del usuario gitlab-serverless.


IMPLEMENTAR SU FUNCIÓN

Cuando hacemos un commit en el la rama Dev el pipeline  se inicia, podemos ver la información del pipeline CI/CD -> Pipeline 



En la etapa de implementación , podemos ver los registros con la URL del punto final de API Gateway https://2m88rkgidb.execute-api.us-east-1.amazonaws.com/dev/hello 

PROBANDO TU FUNCIÓN

Podemos probar la función en un navegador o usando curl en una terminal, necesitamos hacer un GET a la URL de API Gateway, este punto final llamará a la función Lambda hello y  procesará la respuesta con el mensaje


Ahora tenemos una funcion lambda Implementada usando GitLab CI/CD 



EXTRA: EJECUTAR LA FUNCIÓN LOCALMENTE


Como mencioné antes, una de las mejores características del Framework Serverless es que podemos probar localmente, esto creará un punto final local que replica la puerta de enlace de la API de AWS.


Primero necesitamos agregar el plugin serverless-offline en el  archivo serverless.yml

Ahora necesitamos instalar el paquete serverless-offline


Y finalmente comienzo el servicio


Ahora en otra terminal podemos probar la url de borde o punto final con: 


Nota: recuerde que este código es solo para pruebas locales, debe limpiarlo antes de ir a un entorno de producción


LIMPIAR LOS RECURSOS DE AWS CON AWS CLI

Serverless Framework crea los recursos usando AWS Cloudformation, por esta razón hacer una limpieza es muy fácil, necesitamos eliminar Cloudformation Stack, pero primero necesitamos eliminar el bucket de S3.

Encuentra la URL del depósito (O bucket) 

Quite el depósito s3 y los archivos

PRÓXIMOS PASOS:

  • Integrar con el almacén de parámetros de AWS (para secrets)
  • Configurar CORS (uso compartido de recursos entre orígenes)
  • Prueba automatizada (Jest, Axios y plugin Serverless-offline)

REFERENCIAS:


Traducido por: Juan Pablo Vidalit


Nahuel Hernandez

Cloud Architect & DevOps | Blockchain at Extrimian

Related Posts

Únete a nuestra Newsletter

Lidera la Conversación en la Nube