Article available only in Spanish
Este artículo está concebido como introducción al concepto genérico de Infrastructure as Code (IaC) y al software específico Terraform, una de las herramientas que mejores opciones nos ofrece para “programar nuestra infraestructura”.
Si usted está leyendo este artículo seguramente tiene alguna relación o siente curiosidad por el mundo cloud. Este artículo le puede ayudar a adquirir una visión más completa del concepto IaC y a entender mejor las ventajas que ofrece una buena implementación IaC en términos de automatización, escalado, optimización y ahorro en su factura cloud.
¿Qué es Infrastructure as Code (IaC)?
Dicho de forma simple podríamos describir Infrastructure as Code (IaC) como una tecnología que nos permite la creación, actualización o eliminación de nuestra infraestructura mediante código.
El cambio de modelo relativo a la gestión de la infraestructura de los sistemas corporativos es radical en caso de optar por migrar al cloud. También se podría optar por migraciones parciales o modelos híbridos, perfectamente válidos según tipo de infraestructuras o aplicaciones.
En todo caso, con la llegada del cloud pasamos de crear infraestructura por medio de la inclusión de nuevo hardware on-premise a crear dicha infraestructura de forma virtualizada mediante tecnologías IaC sobre nuestros proveedores cloud favoritos (Azure, AWS, GCP, etc.). Un cambio de paradigma. Las ventajas fundamentales de este nuevo modelo son:
- La infraestructura se crea de forma virtualizada con software, no mediante la inclusión de nuevo hardware físico.
- Utilización de código declarativo simple para la gestión de nuestra infraestructura cloud. ¿Y qué es eso de “declarativo”? Simplemente, el código describe el estado final deseado de nuestra infraestructura y la herramienta IaC empleada para su despliegue (Terraform, Azure Resource Manager, etc.) se encarga de aplicar los cambios de la forma más óptima posible.
- Utilización de sistemas de control de versiones sobre los ficheros planos de código fuente de infraestructura.
- Automatización vía DevOps y pipelines CI/CD (Continuos Integration/Continuos Delivery). Excepcional. Nos permite despliegues muchísimo más rápidos, frecuentes, más libres de errores y consistentes entre diferentes entornos. La interacción manual se elimina mayoritariamente.
¿Cómo ahorrar dinero en su factura cloud con IaC?
Si ha leído detenidamente el capítulo anterior fácilmente puede identificar aspectos en los cuales economizar su factura cloud de forma significativa. No hace falta tener mucho conocimiento técnico al respecto sino más bien aplicar la lógica:
- En cloud, podríamos decir que mayoritariamente nuestra factura depende del número y tipo de recursos creados, tiempo en el que están activos, tiempos de utilización y potencia o capacidades (tiers) seleccionadas para cada tipo de recurso (CPUs, memoria, discos, SLAs, etc.). A más recursos, más potentes y más tiempo disponibles, mayor precio. Evidente.
- Si con IaC podemos automatizar la creación de infraestructura, de forma rápida y consistente, resulta claro que podremos escalar (ampliar o potenciar) nuestra infraestructura en periodos de alta demanda y desescalar (eliminar o reducir) una vez disminuya la demanda con el consiguiente ahorro asociado. En todo caso, ya no es necesaria la compra de hardware físico para atender sólo periodos de alta carga de trabajo, pero no usado el resto del tiempo.
- Este escalado y desescalado puede plantearse de modo horizontal (más o menos instancias de recursos), vertical (recursos más o menos potentes sin cambiar el número de instancias) o ambos.
- Además, según tipos de recursos, se pueden utilizar herramientas IaC no solo para crear los recursos, sino para incluir configuraciones avanzadas de modo que los propios recursos puedan auto-escalarse en base a reglas dinámicas o técnicas de Machine Learning (ML) soportadas por nuestro proveedor cloud. Casi nada.
Llegados a este punto, me gustaría comentar un aspecto tal vez un poco off-topic, pero tremendamente importante en relación con el ahorro de dinero en nuestras facturas cloud y a tener en cuenta antes de iniciar las operaciones de escalado, vía IaC o no:
- El primer paso para ahorrar costes es la optimización de las aplicaciones de modo que consuman la menor cantidad de recursos para una carga de trabajo dada. La optimización de las aplicaciones debe ir encaminada a buscar el menor consumo de CPU, memoria, operaciones de acceso a discos, nodos, pods, número de máquinas virtuales, etc. Con la llegada del cloud, la eficiencia del código tiene un impacto directo en el coste.
- Un ejemplo claro y sencillo sería una aplicación que hace uso de una base de datos en cloud cuyas consultas no están optimizadas. La consecuencia directa es que el tiempo de CPU, uso de memoria y acceso a discos será mucho mayor para una carga de trabajo dada. Ello implicará la selección de un modelo de base de datos con mayores capacidades de las que realmente necesitamos y por tanto de mayor precio. A más usuarios y más concurrencia, más consumo y mayor precio. Si no optimizamos y optamos por el escalado a modo “fuerza bruta”, enmascaramos el problema e incurrimos en costes innecesarios. La aplicación puede que funcione bien, pero a un precio mayor al óptimo.
¿Qué es Terraform?
Terraform es una herramienta IaC open-source creada por la compañía HashiCorp, ampliamente utilizada en el mercado actual, que nos permite de una forma simple y potente gestionar nuestra infraestructura cloud mediante ficheros de código declarativo.
El código nativo utilizado por Terraform para definir los recursos se denomina código HCL (HashiCorp Configuration Language) si bien también se proporciona soporte para usar otro tipo de lenguajes como JSON. No obstante, lo lógico y más óptimo desde mi punto de vista es usar el lenguaje nativo HCL.
Terraform nos permite desplegar y gestionar infraestructura sobre los principales proveedores cloud tales como Microsoft Azure, AWS, Google Cloud Platform, Oracle, etc. En total más de 500 proveedores a la fecha de publicación de este artículo.
El workflow que hemos de seguir para trabajar con Terraform es bastante simple:
- Escribir el código HCL en ficheros declarativos planos que definan nuestra estructura. Se ha de seleccionar un proveedor sobre el cual vamos a desplegar la infraestructura y a continuación definir los recursos.
- Inicializar (Init) el entorno de Terraform.
- Previsualizar (Plan) el estado final de nuestra infraestructura antes de aplicarse de forma definitiva. Permite anticiparnos a posibles errores, hacer comprobaciones, etc.
- Aplicar (Apply) los cambios de infraestructura de forma definitiva. Terraform analizará cómo alcanzar el estado de infraestructura deseado de la manera más óptima. El modo en el que gestiona su interacción con las APIs de cada proveedor (Azure, AWS, GCP, etc.) es transparente para nosotros, pero éste es uno de los puntos más importantes a la hora de elegir un producto IaC, ya que nos debe garantizar rendimiento y consistencia.
¿Por qué usar Terraform?
Las principales ventajas de usar Terraform, en parte ya vistas en capítulos anteriores, son:
- Sintaxis simple y unificada sobre múltiples proveedores con lenguaje declarativo HCL. Evita utilizar diferentes herramientas para cada plataforma concreta.
- Soporte de los principales proveedores de infraestructura cloud como Microsoft Azure, AWS, GCP, Oracle, etc.
- Permite versionar la creación de infraestructura y gestionar todo su ciclo de vida (creación, actualización y eliminación) con previsualización de planes de actualización y dependencias.
- Permite automatizar la creación de infraestructura mediante el uso de configuraciones reutilizables de forma consistente y estandarizada. Fácil integración en pipelines CI/CD de DevOps.
- Soporte y aceleración a la creación de infraestructura común con módulos procedentes de Terraform Registry.
Terraform Registry
Terraform Registry es un repositorio público de proveedores y módulos para desplegar de forma rápida configuraciones de infraestructuras comunes. Es soportado por HashiCorp, los diferentes proveedores (Microsoft, Google, AWS, etc.) y comunidades de desarrolladores.
En resumen, en lugar de escribir nuestros ficheros de código desde cero, podemos reutilizar módulos descargados desde Terraform Registry ya testeados y con opciones de configuración que permiten adaptarlos mayoritariamente a nuestros requerimientos particulares.
Por último, simplemente me gustaría añadir que es importante manejar bien la documentación proporcionada por cada módulo para asegurarnos de que la infraestructura a crear cumplirá con todos los requerimientos.
Distribuciones de Terraform
La forma más sencilla de instalar y empezar a trabajar con Terraform es mediante la descarga en local de sus Herramientas CLI. Mediante la descarga de un simple fichero comprimido, un fichero ejecutable y la modificación de algunas variables de entorno, podremos empezar a crear ficheros de código HCL y crear infraestructura en cloud.
Con las herramientas CLI se puede empezar a construir nuestros primeros proyectos con Terraform o incluso ser suficiente para realizar despliegues a nivel corporativo. Algunas buenas prácticas que deberían tenerse en cuenta son:
- Configuración remota del estado de Terraform o backend. ¿Y qué es el estado de Terraform? El estado es donde se guarda información o metadatos que mapean nuestro código actual con la infraestructura real desplegada:
- La planificación de actualización de infraestructura depende del estado. Debe mantenerse lo más sincronizado posible.
- El estado se guarda por defecto en local, pero debería ser almacenado en remoto de forma compartida y segura.
- Se guarda en formato plano: ¡ojo con las contraseñas!
- Almacenamiento seguro de información confidencial como contraseñas, claves o secretos.
- Buena definición de esquemas de ficheros y módulos a nivel de proyectos cumpliendo patrones del tipo DRY (Don’t Repeat Yourself). A este respecto, Terragrunt podría ayudarnos.
Otras distribuciones de Terraform con recursos adicionales sobre CLI son:
- Terraform Cloud: instalación en cloud para entornos colaborativos de equipos de tamaño pequeño o mediano. Proporciona herramientas para facilitar el trabajo colaborativo, sincronización del estado, entornos seguros, etc.
- Terraform Enterprise: dirigida a grandes corporaciones con instancias colaborativas privadas de pago sin límite de recursos