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:
- https://about.gitlab.com/blog/2020/01/14/serverless-js-project-template/
- https://docs.gitlab.com/ee/user/project/clusters/serverless/aws.html
- https://www.serverless.com/framework/docs/providers/aws/
- https://www.serverless.com/blog/node-rest-api-with-serverless-lambda-and-dynamodb
- https://github.com/serverless/serverless
Traducido por: Juan Pablo Vidalit