Terraform, creando infraestructura escalable: De monolitos a arquitecturas modulares
Actualmente es imposible pensar en un producto de software sin incluir la escalabilidad como una de las claves para el éxito. Para esto la infraestructura desempeña un papel fundamental. En este artículo exploraremos como Terraform (herramienta de IaC de hashicorp), puede ayudarnos a abordar el tema de infraestructuras escalables.
Quién no ha generado un monolito de IaC en su vida?
Imaginemos el primer paso en la desición de generar nuestra IaC. Probablemente comenzamos a escribir recursos dentro de un repositorio, y en la medida que fuimos creciendo el código también.
Cuando intentamos darnos cuenta, había pasado un año de aquel inicio lleno de esperanzas, este pequeño código ahora es un engendro monstruoso que nos aterra modificar. El simple echo de querer modificar un parámetro en un simple recurso nos plantea 25 modificaciones dentro de nuestro terraform plan.
Que sucedió? Cómo llegamos a esto? Probablemente pedidos sin tiempos, complicaciones a la hora de escribir el código u otros acontecimientos hicieron que se solucionen algunas cosas por fuera de nuestro código, haciendolomuy complejo mantener y generando pánico cuando alguien pide una modificación.
Parte de la solución. Modulos
Los módulos en Terraform son una forma de organizar y reutilizar código de infraestructura. Un módulo es un componente independiente que se puede utilizar para construir partes específicas de la infraestructura. Esto permite una mayor modularidad y escalabilidad.
Ventajas:
La estructura mínima para un módulo consta de solo algunos archivos.
README.md: Nuestro README, donde podemos explicar que resuelve el módulo y de que manera.
main.tf: Aqui viven todos los recursos de nuestro módulo
variables.tf: Como su nombre lo indica aquí viven todas las variables del módulo
outputs.tf: En este archivo definimos los outputs de nuestro módulo, necesarios para poder datos desde otros módulos.
Más información aquí
Solución Modular Escalable
Ahora que comprendemos el poder de la modularidad en Terraform, veamos cómo aplicarlo para crear una infraestructura escalable.
Identificar Componentes Clave: Este punto es clave para inclinar la balanzaa nuestro favor. Debemos construir módulos que sean luego utilizados por nuestros equipos, de otra manera la iniciativa perderá fuerza y quedará en el olvido.
Otra opción, muy buena por cierto, es utilizar los módulos ya creados y mantenidos por la comunidad, la recomendación aqui son los módulos de Anton Babenko, una eminencia en el tema.
Recomendado por LinkedIn
La otra opción es construirlos por nuestra cuenta, con el trabajo que esto conlleva.
Existe una tercera opción, que es la que más me gusta por lo general, que implica utilizar los módulos de la comunidad pero generar los propios haciendo un wrapper. Esto nos permitirá definir estándares específicos de nuestro caso de uso.
Naming convention, seguridad (por ejemplo un S3 que nunca pueda ser público), etc...
De que manera los agrupamos
Esta desición es clave. Para poder tomarla debemos estas muy atentos al problema a la estructura de nuestra aplicación.
Conceptualmente buscaremos separar la infraestructura CORE que por lo general una vez desplegada no sufre grandes modificaciones, de la infraestructura particular de un dominio de aplicación específico, por ejemplo pagos, usuarios, compras, etc..
El módulo CORE por lo general dispondrá de los recursos de red utilizando nuestro módulo de VPC, los recursos de cómputo utilizando por ejemplo nuestro módulo de EKS y quizás una base de datos como RDS o Aurora (Debo decir aquí que prefiero que las bases de datos sean de dominio de aplicación).
Con esto en mente podemos generar un repositorio de código de IaC para el módulo CORE llamado de estos módulos, con su correspondiente configuración para poder ser desplegado en los diferentes ambientes.
A partir de este punto, si un dominio de aplicación requiere infraestructura, lo hará mediante su propio repositorio de código independiente.
El dominio de usuarios requiere una tabla de DynamoDB? Repositorio propio
El sistema de login requiere imágenes de identificación de usuarios guardadas en S3? Repositorio propio
Este esquema nos brinda, entre otras cosas, una independencia de ciclo de vida entre nuestro core y los servicios satélites. Por otro lado nos permite definir mucho mejor el OWNERSHIP de los recursos, ya que el dominio de aplicación tiene bien delimitados sus recursos de infraestructura.
Dependiendo el tipo de empresa será el resultado final, pero el concepto puede extrapolarse a cualquier organización.
Al adoptar esta aproximación modular y escalable en Terraform, la empresa estará mejor preparada para enfrentar el crecimiento y los desafíos futuros. La infraestructura comienza a generar agilidad y eficiencia en la organización en lugar de ser un obstáculo y un cuello de botella.
En resumen, Terraform y este tipo de esquemas modulares para la IaC ofrecen una solución poderosa para superar los problemas de los monolitos en la infraestructura. Al adoptar esta mentalidad modular, podemos construir infraestructuras escalables que se adapten a cualquier tamaño y necesidad, sentando las bases para el éxito a largo plazo.
Me encantaría leer tu opinión al respecto y si te gustó compartilo con tu red de contactos!