Blog

IaC (Infraestructura como Código) en Proyectos redbee

Blog
En este artículo describiremos las dos tecnologías de Infraestructura como Código (IaC) utilizadas en uno de nuestros proyectos en redbee, enfocadas principalmente en la consistencia, sostenibilidad y alta disponibilidad en diferentes entornos. Abordaremos las preguntas esenciales: qué es, por qué y cómo utilizar Terraform y Terragrunt.

Autores: José Leandro Valdes y Andrés Eduardo Ciccarelli

¿Qué es Infraestructura como Código?

La idea detrás de Infraestructura como Código (IaC) es escribir y ejecutar código para definir, implementar y actualizar infraestructura.

TERRAFORM

Es una herramienta popular de Infraestructura como Código (IaC) que proporciona un enfoque declarativo para aprovisionar y gestionar recursos de infraestructura. 

Aquí hay algunas razones por las que Terraform se utiliza ampliamente: 

  • Por ser  compatible con múltiples proveedores de nube (como AWS, Azure, Google Cloud, entre otros) así como infraestructura local. Con esta herramienta, la infraestructura se define utilizando un lenguaje de configuración declarativo. Terraform se encarga del aprovisionamiento, actualización y destrucción de recursos para lograr ese estado. Este enfoque ayuda a mantener la consistencia y simplificar la gestión de la infraestructura. 
  • Trata la infraestructura como código, lo que significa que las configuraciones de infraestructura son versionables, compartibles y pueden almacenarse en sistemas de control de versiones. Esto permite a los equipos colaborar de manera efectiva, aplicar las mejores prácticas de ingeniería de software y realizar un seguimiento fácil de los cambios en la infraestructura a lo largo del tiempo. 
  • Gestiona automáticamente las dependencias entre recursos. Determina el orden correcto en el que se deben crear, actualizar o destruir los recursos según las relaciones definidas. Esta función simplifica la gestión de configuraciones de infraestructura complejas y elimina la coordinación manual de dependencias de recursos.
  • Detección de desvío de infraestructura: Detecta y resalta cualquier discrepancia entre el estado deseado descrito en la configuración, es decir en el código, y el estado real de la infraestructura. Esto ayuda a identificar y rectificar cualquier cambio manual realizado fuera de Terraform, asegurando que la infraestructura se mantenga consistente con la configuración prevista.

¿Qué es y cuál es el objetivo de un módulo de Terraform?

Un módulo de Terraform es una colección de archivos de configuración en un directorio dedicado. Estos módulos encapsulan grupos de recursos dedicados a una tarea, reduciendo la cantidad de código que debes desarrollar para componentes de infraestructura similares. Por ejemplo podría existir un módulo en el cual existan todos los componentes necesarios para la creación de un cluster de kubernetes en un proveedor de nube.

A continuación se muestra un ejemplo de la estructura implementada en unos de nuestros clientes:

TERRAGRUNT

TERRAGRUNT

Es una herramienta de código abierto diseñada para facilitar y mejorar la gestión de infraestructura como código (IaC) utilizando Terraform. Terragrunt es un wrapper (envoltorio ligero) que proporciona herramientas adicionales para mantener tus configuraciones DRY  (Don’t Repeat Yourself: No te repitas), trabajar con múltiples módulos de Terraform y gestionar el estado remoto.

¿Es útil Terragrunt?

La capacidad de Terragrunt para implementar recursos en varios entornos no solo reduce la duplicación de código, sino que también ayuda en la gestión eficiente de las configuraciones del entorno.

Así es cómo funciona Terragrunt:

  • Organización de módulos: Esta herramienta fomenta la reutilización de código a través de módulos. Los módulos de Terraform que se pueden usar en diferentes proyectos. Terragrunt permite la definición y gestión centralizada de éstos módulos, lo que facilita su uso y mantenimiento en diversos proyectos.
  • Gestión de configuración: Ayuda a la gestión de las configuraciones de Terraform al definir archivos de configuración llamados «hcl.hcl» o «terragrunt.hcl». Estos archivos se utilizan para definir la estructura de directorios, variables de entrada, recursos de Terraform y otros aspectos relacionados con la infraestructura. Terragrunt utiliza estos archivos de configuración para aplicar de manera consistente y segura las configuraciones de Terraform.
  • Invocación de módulos: Al utilizar Terragrunt, la invocación de módulos de Terraform se realiza especificando la ruta en el archivo de configuración de Terragrunt (incluso, puede ser un repositorio de git). Terragrunt se encarga de manejar la lógica de ejecución, gestionar la configuración y garantizar que los módulos se apliquen de manera correcta y ordenada.
  • Estado remoto: Ofrece un bloque de estado remoto que permite utilizar un backend remoto para almacenar de forma segura el estado de Terraform. Esto facilita la colaboración del equipo y la gestión del estado en entornos compartidos.
  • Comandos simplificados: Simplifica el uso de Terraform al proporcionar comandos abreviados y funciones adicionales. Por ejemplo, en lugar de ejecutar comandos separados de Terraform para inicializar, planificar y aplicar cambios, Terragrunt combina estos pasos en un solo comando. Además, Terragrunt agrega la capacidad de bloquear y desbloquear la infraestructura para evitar cambios accidentales durante la ejecución de comandos.

A continuación se muestra la estructura del repositorio de Terragrunt del proyecto de cliente:

Se administran dos regiones, us-east-1 (Norte de Virginia) y us-east-2 (Ohio)

Se poseen 3 ambientes en N. Virginia, Dev, QA y Prod.

Dentro de cada carpeta del ambiente existen todas las subcarpetas que hacen referencias, a través de sus archivos .hdlc, a los módulos de Terraform.

Una de las grandes ventajas de utilizar Terragrunt, como ya se mencionó, es poder reutilizar los componentes de Terraform, pero Terragrunt además permite enviar diferentes variables a estos módulos obteniendo diferentes infraestructuras para los diferentes ambientes. Un ejemplo sencillo es tener diferentes cantidades de instancias de EC2 (servidores en AWS) y diferentes tamaños (configuraciones de hardware y capacidad computacional) en los diferentes ambientes (dev, qa, prod, etc.).

Beneficios Obtenidos

Luego de haber implantado Infrastructure as Code (IaC) en el cliente, los beneficios que hemos obtenidos son los siguientes:

  • Automatización y velocidad: Reemplazo de tareas manuales y propensas a errores a la ejecución de código, que genera la infraestructura de forma automática, con una reducción muy notable de tiempo de aprovisionamiento, reduciendo errores y aumentando la eficiencia.
  • Consistencia: Al definir la infraestructura como código, existe una consistencia en todos los entornos. El mismo código se utiliza para aprovisionar y configurar la infraestructura en diferentes entornos, lo que evita discrepancias y garantiza que todos los entornos estén configurados de la misma manera. 
  • Control de versiones, colaboración de equipos: El código de infraestructura se encuentra almacenado en un sistema de control de versiones. Esto permite realizar un seguimiento de los cambios, revisar y revertir versiones anteriores, colaborar de manera efectiva y mantener un historial de los cambios realizados en la infraestructura. Varios miembros del equipo pueden trabajar en el mismo código de infraestructura de manera simultánea, realizar revisiones de código y colaborar en mejoras. Además, se pueden establecer prácticas de revisión y aprobación de cambios para garantizar la calidad y la seguridad en la infraestructura.
  • Escalabilidad y flexibilidad: El código se puede adaptar y modificar para agregar o eliminar recursos de manera rápida y sencilla, lo que permite responder a las necesidades cambiantes del negocio de manera ágil.
  • Documentación online: Al utilizar código como la representación de la infraestructura, se tiene una documentación en actualizada de cómo está configurada la misma.
Contacto

Contactanos

¿Cómo podemos ayudarte?