Hablar acerca del desarrollo de aplicaciones completamente orientadas a la nube es hablar de un delicado proceso de arquitectura y ceación de muchas herramientas que usarás en modo de desarrollo, pruebas y producción por mencionar algunas cuantas. La piedra angular donde toda la solución que estás haciendo va a recaer es tu infraestructura. Aquí, donde quienes se dedican a las operaciones y conforman ese Ops dentro del mundo de DevOps donde el principal objetivo es crear, controlar, administrar y supervisar a la infraestructura en donde toda la solución trabajará.
Para ello hasta hace algunos meses yo me sentía (bueno, de hecho aún me siento) bastante cómodo con el CLI de Azure para cualquier característica que se necesitara y es más, hasta tengo mis pequeños scripts Bash para crear un montón de cosas con el poder de un solo comando. Pero hay muchos detalles que hacen paulatinamente complicado hacer esto, algunos de ellos son:
- No tienes manera de saber el estado de tus recursos, es decir una vez creados no hay una manera de mantener un «recordatorio» de que fue creado o que faltó, esto es particularmente necesario si piensas agregar una nueva característica o modificar algo, con un script deberías primero hacer una secuencia de comandos para obtener ciertas cosas y luego modificar lo que busques.
- Crear comandos con un montón de parámetros en una línea de comandos y con varios parámetros puede no ser tan complicado si se trata de una arquitectura sencilla pero la complejidad crece exponencialmente con una arquitectura más exigente haciéndose un auténtico dolor de cabeza.
- Trabajar con una sola nube es relativamente sencillo, dominas la técnica de la herramienta adecuada con poco tiempo. ¿Qué tal una herramienta que te permita desplegar cosas a diferentes proveedores de nube?
- No hay manera de tener un control de versiones.
Con todos los retos que paulatinamente se van complicando y considerando que no hay NADIE que disfrute de utilizar las plantillas ARM es que podemos comenzar a pensar en una solución que nos evite tantas molestias y nos permita tener un mejor control sobre nuestra infraestructura. Es así como encontré a Terraform, una herramienta que verdaderamente ha cambiado mi concepción de administración sobre infraestructura y de una manera sumamente positiva.
¿Por qué usar Terraform?
Esto es muy fácil, en mi trabajo me dijeron que era lo que el cliente quería hacerlo así, como ya deberías saber no hay de otra en este caso y ahora debería volar con este cliente y darle profundamente las gracias por «obligarme» a utilizar esta nueva herramienta (usar algo nuevo siempre puede resultar sumamente aburrido o como en este caso demasiado interesante).
Me tomó una tarde y un fin de semana leer más de la plataforma y con ello comenzar a apreciarla así como al concepto de «Infraestructura como código» y aquí es donde comienza lo bueno. Como desarrollador de software el salto a la infraestructura supone un reto complicado pero con Terraform esto no se trata de un reto sino de una oportunidad formidable, puedes aprovechar tus habilidades para escribir código y eso te dará una ventaja enorme.

Además de la ventaja del código, te puedo enumerar otras más:
- Gracias a Terraform ahora tu infraestructura podrá llevar un proceso de DevOps a la perfección.
- Podrás validar el plan de tu infraestructura antes de desplegarla. Permitiéndote que con ello puedas validar primero lo que crearás antes de hacerlo.
- Puedes mantener el rastro de todas y cada una de las modificaciones en tu proyecto.
- Lo mejor, con un poco de experiencia puedes desplegar en diferentes nubes, digamos, Google Cloud, AWS y Azure diferentes elementos ¡al mismo tiempo! Esto significa que no necesitas aprender a utilizar una herramienta por cada proveedor, una sola basta para lograrlo.
Ahora, con las ventajas ya enumeradas, es necesario también saber las características principales de Terraform.
Orquestración: Hay ciertas herramientas que requieren que ciertas características estén previamente creadas, crearlas al mismo tiempo requiere sincronizar bien las tareas y eso es algo que Terraform maneja a la perfección.
Lenguaje: Si has usado, desarrollado algo con JSON entonces estás más que calificado para el trabajo, su lenguaje (HCL) es sumamente sencillo de aprender y práctico, además, su simpleza para implementar características avanzadas es simplemente elegante.
Fragmentación: Uno de los principios que Terraform más cuida es evitar crear un script más largo que el camino a la felicidad. Para ello puedes empezar a ponerlo todo en un archivo, pero conforme tu experiencia se incremente, entonces podrás comenzar a fragmentar en diferentes archivos a un extremo que parece competencia. Así podrás realizar tareas simple en un archivo y conforme la complejidad aumente entonces puedes comenzar a fragmentar. ¿Te suena familiar?
Estado: A veces pienso que Terraform fue creado por un montón de ingenieros que sufrieron mucho con el seguimiento de su infraestructura y planearon con gran cuidado como hacerlo aquí. En cualquier aplicación de software, guardar el estado de ciertas cosas es una práctica común, en el caso de Terraform, el estado juega un papel fundamental para importar elementos previos, para controlar tu infraestructura y para dar seguimiento en versiones posteriores.
¿Por donde comenzar?
Antes de este artículo he escrito varios acerca de como realizar ciertas tareas. Aquí los pondré en el orden sugerido de lectura.
Instalar y configurar Terraform en Windows 10
Creando recursos en Azure por medio de Terraform
Guardar el estado de Terraform en Azure Blob Storage
Comenzando a implementar módulos en Terraform
Desplegar una infraestructura en Terraform usando Github Actions
Trabajar con diferentes archivos .tfvars en Terraform
Manejar variables de salida entre módulos
Importar un recurso de Azure a un estado en Terraform
Guarda el estado de Terraform usando Github Actions
¡Ahora solo resta comenza con la diversión!
Excelente , he escuchado de terraform en mi día a día en el are de desarrollo no se toca mucho ese tema, pero tengo que admitir que ando queriendo emprender el debvopismo.
Ya anímate, DevOps le da muchísimo orden y disciplina a tu día a día para todas las actividades de software.