Terraform y la Administración de Estados de Infraestructura

Andrés Torres | 06 de julio, 2020

Apoyado por nuestro experto en innovación Manuel Cubillo

¿Qué es Terraform?

Terraform facilita la creación, modificación, y mejora de infraestructura en una manera segura y predecible. Es una herramienta de código abierto que convierte las APIs (Interfaz de Programación de Aplicaciones) en archivos de configuración que pueden ser compartidos entre los miembros de un equipo, manejados como código, editados, revisados, y versionados. 

Estados de Infraestructura

En el pasado, utilizar Terraform como una herramienta para un equipo que trabaja con más de un ambiente de despliegue podía ser un problema. Se daban conflictos en las versiones desplegadas, los cambios realizados por colaboradores tendían a sobrescribir los cambios de otros, especialmente si no se utilizaba Atlas (el servicio de pago de Hashicorp).

La administración de infraestructura en estos ambientes solía ser complicada, pero recientemente se han implementado cambios en los “workspaces” y “backends” remotos para mejorar la experiencia de administración. 

El concepto de ‘estado’ de infraestructura consiste en capturar el panorama general de lo que ya hemos configurado y ejecutado en nuestra infraestructura actual (VPC's, Subnets, Instancias, RDS, Volúmenes, etc.).

Esta ‘captura’ nos ayuda a actualizar nuestra infraestructura, lo cual nos permite ejecutar nuestros scripts y solamente aplicar los cambios deseados, posibilitando la idempotencia a la hora de crear nuestra arquitectura TI.

Problema de Sincronización

Digamos que tenemos un repositorio git con nuestros scripts de Terraform. Estos scripts crean una VPC (Nube Virtual Privada), dos subnets y dos instancias, una dentro de cada subnet. Los colaboradores tiene la libertad de desplegar en este repositorio git cuando deseen.

Screen Shot 2019-06-21 at 3.43.42 PM

El state file (archivo de estado) no se debe de almacenar en el git ya que es un archivo que contiene información confidencial de nuestra arquitectura. Sin embargo, éste cambia a menudo y necesitamos un mecanismo para administrar esos cambios.

¿Qué sucede cuando dos colaboradores aplican cambios a la infraestructura sin compartir su state file? Resultaría en errores de consistencia en la infraestructura porque algunos cambios serán sobreescritos debido a la falta de sincronización. 

¿Qué podemos hacer?

El Enfoque Terraform

En este caso, Terraform nos brinda una herramienta de estados remotos llamada backends; ésta nos permite tener un state file actualizado para cada iteración o ejecución. 

¿Pero qué sucedería si se desea probar los cambios sin modificar el ambiente de desarrollo, de control de calidad o de producción? Simplemente utilizamos la herramienta de Terraform llamada workspaces.

Workspaces nos permite crear diferentes ambientes que tendrán su propio state file y no bloquearán la sobreescritura sobre un ‘state file’. Esto nos dará la oportunidad de trabajar con diferentes archivos de estado y diferentes “stacks”.

Para trabajar con esta configuración, podemos utilizar la infraestructura de AWS (Amazon Web Services): 

  1. Crear una cuenta en AWS con acceso S3.
  2. Crear un ‘S3 bucket’ donde se guardarán los archivos terraform.tfstate.
    YOUR-BUCKET-NAME
  3. Una vez creado el ‘bucket’, se debe de configurar para guardar los state files de Terraform.
  4. Se debe crear el archivo principal (main.tf) y su archivo variable.tf, el cual contiene la definición del ‘bucket’ y del proveedor.

    Nota: el ‘backend’ no puede utilizar variables, por lo cual la región debe de ser escrita.

    main.tf


provider "aws" {
	region = "${var.region}"
	}
terraform {
	backend "s3" {
    	bucket = "YOUR-BUCKET-NAME"
        key = "terraform.tfstate"
        encrypt = true
        region = "us-west-1"
        }
    }

 

variables.tf


variable "region" {
	default = "us-west-1"
    }
    
variable "environment"{
	default = "dev"
	}

 

5.Iniciar el backend:

terraform init -backend-config="access_key=<YOUR ACCESS KEY>"\ -backend-config="secret_key=<YOUR SECRET KEY>"\ -backend-config="region=<REGION TO USE>"\ -backend-config="bucket=YOUR-BUCKET-NAME"\ -backend-config="key=terraform.tfstate"

 

6.Agregar los ‘workspaces’ que se desean utilizar:


terraform workspace new dev
terraform workspace new prod
terraform workspace new YOUR-WORKSPACE-NAME

 

7.Seleccionar los ‘workspaces’ que se desean utilizar:

terraform workspace use dev

 

8.Ejecutar el plan terraform con el env vars deseado:

terraform plan --var-file="variables_dev.tfvars"

 

9.Ejecutar el ‘terraform apply’ con el env vars deseado:

terraform apply --var-file="variables_dev.tfvars"

 

Los ‘workspaces’ y ‘backends’ remotos de Terraform son bastante útiles. Basándose en este ejemplo simple, se puede comenzar a administrar los diferentes ambientes con los que trabaja un equipo. Existen herramientas adicionales, como el bloqueo de un estado Terraform para prevenir que varias personas lo modifiquen al mismo tiempo. ¡Brindaremos más información al respecto en una próxima publicación!

Conclusión

Terraform es una herramienta gratis de código libre creada por HashiCorp y escrita en el lenguaje de programación Go. Se puede implementar para provisionar infraestructuras completas - aquellas que se extienden a lo largo de múltiples proveedores de servicios de nube (públicos y privados), como AWS, Google Cloud, Digital Ocean, Microsoft Azure, OpenStack, y otros.

Como un sistema orquestador de nueva generación, Terraform trae un nuevo set de herramientas y funcionalidades a la mesa, incluyendo infraestructura inmutable, código declarativo/no de procesos y arquitectura exclusiva para el cliente. 

Con un enfoque inmutable (archivos de estado), Terraform elimina la posibilidad de derivaciones en el código (dónde diferentes configuraciones pueden resultar en errores) que pueden llevar a fallos de seguridad. Con este enfoque, actualizar los ambientes de desarrollo es más fácil, lo cual disminuye la probabilidad de bugs.

Terraform incluye herramientas mucho más poderosas y populares debido a la gran gama de proveedores de nube que admite.¡Lo recomendamos!

ContáctenosContact Us

Contenido

Categorías

Compartir Artículo

Artículos Destacados