Opciones con Terraform para crear la infraestructura de múltiples entornos

Jose Maria Hidalgo Garcia
4 min readJan 17, 2021

Terraform es una herramienta open-source para gestionar infraestructura como código (en adelante IaC) que ofrece un CLI y módulos para trabajar con las APIs de los proveedores cloud más importantes: AWS, Azure, Google Cloud, entre otros muchos.

Una de las buenas prácticas en la definición de nuestra IaC como para cualquier desarrollo de aplicación es disponer de la capacidad para gestionar la configuración para definir y personalizar los diferentes entornos: Desarrollo, Testing, Producción de nuestra infraestructura.

En esta entrada veremos un par de posibilidades que nos ofrece Terraform para esto. Además de sus pros y contras de cada uno.

Antes de comenzar

Cada aplicación o proyecto a lo largo de su ciclo de desarrollo necesita de varios entornos antes de ser desplegada en producción. Es siempre importante disponer de entornos similares para pruebas de consistencia, con el objetivo de certificar los desarrollos antes de promocionarlos. Pero replicar esta configuración para que sea igual no es tarea sencilla y mucho menos si esta configuración la realizamos manualmente. Además es importante considerar que algunos entornos sean efímeros y se creen bajo demanda para minimizar el consumo latente y reducir la factura cloud.

Aquí es donde el uso de Terraform y su capacidad para crear infraestructura similar, efímera en entornos multi-cloud nos facilita enormemente este trabajo.

Veámos que posibilidades tenemos con Terraform.

Método 1: Usando Carpetas

Este método, propone duplicar la misma configuración en cada carpeta pero usando diferentes valores de variables “terraform.tfvars”.

Cada carpeta representa un entorno separado y nos permite tener un backend en cada carpeta y los módulos comunes agrupados. Para ejecutar cada entorno debes colocarte en la carpeta correspondiente y ejecutar los tres comandos principales de Terraform: init, plan y apply.

Para poder configurar la infraestructura en cada entorno es necesario estar en la carpeta del entorno y pasar las variables del mismo a Terraform:

// Dev Environment
terraform plan --var-file="dev.tfvars"
//TEST Environment
terraform plan --var-file="testing.tfvars"
// PROD Environment
terraform plan --var-file="production.tfvars"

Ventajas de usar carpetas para la definición de entornos

  • Puedes eliminar añadir y eliminar recursos en cada entorno
  • Se pueden hacer cambios en un entorno sin afectar a otros
  • Opción recomendada para dar los primeros pasos de IaC para múltiples entornos.

Inconvenientes de usar carpetas para la definición de entornos

  • Existe código duplicado
  • Si se quiere cambiar un recurso, se debe realizar el cambio en todas las carpetas para todos los entornos.

Método 2: Workspaces

Los workspace en Terraform son la manera de manejar de forma independiente state files (ficheros de estado) que son la foto de nuestra infraestructura que usa Terraform para detectar los cambios que va a realizar y sobre que recurso en sucesivas ejecuciones.

Los backends es el lugar donde Terraform almacena estos ficheros. Disponemos dos opciones:

  • Local: Los ficheros de estado quedan almacenados en la máquina donde se ejecuta el plan de Terraform.
  • Remoto: Es el escenario común donde se usa los sistemas de almacenamiento de los proveedores cloud: AWS S3, Azure Blobstorage, etc.

Para simplificar la explicación, supongamos que estamos usando el “local backend” para guardar el estado. Terraform creará un fichero llamado terraform.tfstate para guardar el estado de la configuración aplicada.

Pero en escenarios donde se tiene la misma configuración para diferentes contextos (como por ejemplo diferentes entornos), separar los ficheros de estado es necesario. En el método anterior, estos ficheros se alamacena en cada carpeta.

Pero volvamos a los workspaces…

Terraform siempre dispone de un workspace llamado default. Este workspace es especial porque siempre existe y no se puede eliminar. Sin saberlo, siempre estamos usado un workspace el default.

Para manejar los Workspaces con terraform se debe ejecutar con el siguiente comandoterraform workspace .

Una vez ejecutado se muestran un conjunto de sub-comandos y opciones:

  • terraform workspace new <WORKSPACE_NAME> Crear un workspace.
  • terraform workspace select <WORKSPACE_NAME> Seleccionar un workspace
  • terraform workspace list Listar los workspace disponibles
  • terraform workspace show Muestra el workspace actual
  • terraform workspace delete <WORKSPACE_NAME> Eliminar un workspace

Cuando se crea un workspace y se aplica una configuración, Terraform crea un directorio llamado terraform.tfstate.d y dentro se crea un subdirectorio para cada workspace que contiene los ficheros de estado (*.tfstate).

En la imagen se ve que existen dos workspaces dev (desarrollo) y prod (producción) y los ficheros de estados para cada uno en sus respectivas carpeta dentro de terraform.tfstate.d .

Ventajas de usar Workspaces

  • No hay código duplicado
  • Si se quiere cambiar un recurso, no es necesario cambiar en todos los entornos. se hace solo una vez.

Invonvenientes de usar Workspaces

  • No es sencillo añadir o borrar recursos en cada entorno.
  • Los cambios en un entorno afecta a los otros entornos porque estamos usando los mismo ficheros con diferentes ficheros de variables.

Conclusión

El uso de Terraform Workspace se hace imprescindible para el manejo de infraestructura para escenarios complejos. Ya que facilita la colaboración entre equipos y nos proporciona un ciclo de desarrollo más ordenado.

En las siguientes entradas veremos como ir dando pasos para crear una infraestructura 100% definida como código.

--

--

Jose Maria Hidalgo Garcia

Disfruto creando software e infraestructura Cloud. Asegurando que la definición de los recursos, su configuración esté versionado y poder así automatizar todo