Creando un API Rest con Infra como código (Terraform) & Serverless (Lambda + Python) - Parte 2 CI/CD
Tags: cloudnative, aws, python, terraform
Published: 2023-06-07 20:01:05

En el post anterior [Parte 1](https://dev.to/aws-builders/creando-un-api-rest-con-infra-como-codigo-terraform-serverless-lambda-python-parte-1-4ha), vimos cómo desplegar la infraestructura utilizando Terraform y crear rápidamente una API con Python y Serverless. El ejemplo nos brindó los fundamentos de los componentes y servicios claves para la creación de la infraestructura. En este artículo, la idea es automatizar el despliegue utilizando una plataforma que siempre me ha parecido excelente, como CircleCI. También veremos cómo manejar el estado de los recursos desde Terraform Cloud y, finalmente, enumeraremos buenas prácticas a tener en cuenta al crear una API.

[GitHub Repository](https://github.com/jorgetovar/serverless-terraform)

## Integración Continua y Despliegue Continuo

La Integración Continua y el Despliegue Continuo (CI/CD) son prácticas esenciales en el desarrollo de software moderno. Permiten a los equipos automatizar y optimizar el proceso de construcción, prueba e implementación de aplicaciones, reduciendo el esfuerzo manual y asegurando lanzamientos más rápidos y confiables.


![Terraform Apply](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l4v8ryhd18b1zoedutc6.png)


### CircleCI

CircleCI es una plataforma de CI/CD que automatiza y agiliza el proceso de construcción, prueba y despliegue de aplicaciones. Proporciona una infraestructura escalable y flexible para ejecutar flujos de trabajo de CI/CD en la nube. La configuración y uso de CircleCI es más sencilla en comparación con la configuración de Jenkins y su infraestructura asociada. Además, CircleCI ofrece características principales de forma gratuita y también incluye la opción de configurar aprobaciones manuales, que en otras plataformas como GitHub Actions son de pago.


```yaml
- plan-apply:
    filters:
     branches:
      only:
        - main
- hold-apply:
    type: approval
    requires:
      - plan-apply
- apply:
    requires:
      - hold-apply
```
Implementación de la aprobación manual, una de las características más importantes y fáciles de implementar.

![CircleCI](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/08dxzj0f9fax0xm29lje.png)


## Lambda Layers

Las capas de Lambda permiten separar y reutilizar componentes de código comunes, como librerías, dependencias o archivos estáticos. Esto facilita el desarrollo, mantenimiento y actualización de funciones Lambda, al proporcionar una manera eficiente de gestionar y compartir recursos compartidos entre múltiples funciones. Las capas de Lambda también permiten la conexión con librerías poderosas como Powertools para implementar observabilidad con trazabilidad, registro y métricas.

El código debe quedar dentro del folder Python


![Layers](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ax6lkqwl8ltv9494r6h9.png)

Por ejemplo si queremos usar la librería de requests podríamos o instalar todos todo el paquete en el mismo folder, o mucho mejor poner el layer con el código compartido.


![Terraform Layers](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h4ha3qza6any0848u70r.png)


## Buenas Prácticas

1. No mantener ramas (branches) por mucho tiempo en el repositorio del software. Es recomendable integrar con la rama principal (main) todos los días.
2. Versionar todo el código y la infraestructura. Mantener un control de versiones adecuado ayuda en el seguimiento y la gestión de cambios.
3. Realizar pruebas unitarias y de integración de forma regular para liberar el software en producción con confianza.
4. Implementar medidas de seguridad adecuadas, como autenticación y autorización, para proteger tu API de accesos no autorizados.
5. Utilizar herramientas de monitorización, como ELK Stack, para recopilar y analizar datos de rendimiento en tiempo real.
6. Generar documentación interactiva utilizando herramientas como Swagger o Postman para facilitar el consumo de tu API.
7. Minimizar los privilegios y guardar de forma segura las credenciales usadas para desplegar la infraestructura.

### Seguridad

En Amazon API Gateway, puedes configurar políticas de límite de velocidad (rate limit) para restringir el número de solicitudes por intervalo de tiempo y evitar abusos en el uso de la API. Además, puedes habilitar opciones de autenticación en

API Gateway, como autenticación basada en claves de API, tokens de autorización o integración con proveedores de identidad como AWS Cognito o servicios personalizados de IAM, para garantizar que solo los usuarios autorizados puedan acceder a la API y sus recursos protegidos. Estas medidas de límite de velocidad y autenticación en conjunto brindan seguridad y control en el acceso y uso de la API.

Actualmente el llamado se puede hacer sin ninguna validación, simplemente conociendo el endpoint.

`http "$(terraform output -raw base_url)/hello"`

### Remote State

En el post anterior dejamos por fuera archivos de estado de Terraform que quedan en la máquina local. Idealmente, se debe ejecutar desde un servidor todos los cambios, controlar la granularidad y guardar registro de todos los cambios. Por eso, vamos a usar Terraform Cloud para configurar y manejar todo de forma segura desde otro entorno, sin necesidad de lidiar con archivos de estado.

Terraform Cloud ofrece beneficios como la gestión centralizada del estado de la infraestructura, la ejecución remota de planes y aplicaciones, y el registro de cambios y notificaciones para mantener un seguimiento claro de las modificaciones en la infraestructura.


![Resources](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w2r67ibpnpgdnew3w5sv.png)


## Conclusión

La automatización, las plataformas de software como servicio (SaaS), la inteligencia artificial y otras tecnologías están facilitando cada vez más la generación de aplicaciones dentro de un marco de buenas prácticas. Sin embargo, el proceso de desarrollo sigue siendo un tema humano, donde la mentalidad y el profesionalismo nos permiten alcanzar el siguiente nivel de excelencia.

Es importante recalcar que los mayores problemas que existen en el proceso de desarrollo y entrega de software son de organización y personas. Al final, construir aplicaciones es una actividad social, pero cuanto más resolvamos los problemas técnicos y mejor sea la comunicación, más fácil debería ser llegar a producción. ¡Feliz codificación! 🎉

- [LinkedIn](https://www.linkedin.com/in/%F0%9F%91%A8%E2%80%8D%F0%9F%8F%AB-jorge-tovar-71847669/)
- [Twitter](https://twitter.com/jorgetovar621)
- [GitHub](https://github.com/jorgetovar)

Si te gustaron los artículos, visita mi blog [jorgetovar.dev](jorgetovar.dev)