Terraform con múltiples entornos

Terraform es una infraestructura de código abierto, una herramienta de software que proporciona un flujo de trabajo CLI consistente para gestionar cientos de servicios en la nube. Terraform codifica las API de la nube en archivos de configuración declarativos. La mayoría de las veces desplegamos la infraestructura en múltiples entornos.

Necesitamos estos entornos para el desarrollo, la ejecución, las pruebas y la producción. Es muy importante escribir una configuración de Terraform sostenible y escalable que nos permita proveer la infraestructura en estos diferentes entornos. En este documento, veremos las diferentes formas de aprovisionar infraestructura en múltiples entornos. Cada una de ellas con sus ventajas y desventajas.

 

Introducción 

Cada aplicación pasa por diferentes entornos antes de ser enviada a producción. Siempre es una buena práctica tener entornos similares por razones de consistencia. Es muy fácil replicar los errores y solucionarlos fácilmente. No es fácil replicar el mismo conjunto de infraestructura en cada entorno si lo hacemos manualmente. Terraform facilita la creación de infraestructura en un entorno multi-nube.

Dado que Terraform es una herramienta de Infraestructura como código, escribes tu infraestructura en código y es muy fácil escribir de forma modular para diferentes entornos . Veremos las posibles formas de crear infraestructura en múltiples entornos en las siguientes secciones.

Utilizar carpetas - Método 1 

En este método duplicamos la misma infraestructura en cada carpeta con un valor diferente en el archivo terraform.tfvars.

Cada carpeta representa un entorno separado y se puede tener un backend en cada carpeta también, y no hay nada en común entre estas carpetas. Podemos tener archivos outputs.tf, providers.tf, variables.tf, etc., en cada carpeta. Cuando se ejecutan los comandos de Terraform hay que navegar a la carpeta respectiva y ejecutar los tres comandos init, plan y apply.

 

Utilizar carpetas - Método 1

Ventajas

  • Podemos añadir o eliminar fácilmente recursos en cada entorno. 

  • Los cambios en un entorno no afectan a otros entornos.

Desventajas

  • Duplicación de código

  • Si quieres cambiar el recurso, tienes que cambiarlo en todos los entornos. 

Utilizar carpetas - Método 2 

En este método, mantendríamos la misma infraestructura con archivos comunes. Sin embargo, tendremos diferentes terraform.tfvars en cada entorno. Esta forma no es ideal cuando se tiene diferente infraestructura en todos los entornos. En nuestro caso todos los recursos de infraestructura son los mismos por lo que podríamos utilizar este método.

Dado que estamos manteniendo los mismos archivos main.tfvariables.tf, cuando estamos ejecutando los comandos de Terraform es necesario pasar diferentes variables en función del entorno. Por ejemplo, si tenemos tres entornos, estos son los comandos que hay que ejecutar para crear la infraestructura.

1// Dev Environment\ 2terraform plan --var-file="tfvars/environment/dev.tfvars" 3 4// QA Environment\ 5terraform plan --var-file="tfvars/environment/qa.tfvars" 6 7// Prod Environment\ 8terraform plan --var-file="tfvars/environment/prod.tfvars" 9

 

Utilizar carpetas - Método 2

Ventajas

  • No hay duplicación de código

  • Si quieres cambiar el recurso, no lo tienes que cambiar en todos los entornos.

Desventajas

  • No podemos añadir o eliminar fácilmente recursos en cada entorno

  • Los cambios en un entorno sí afectan a los demás entornos, ya que estamos utilizando los mismos archivos con diferentes archivos var.

Uso de Workspaces 

Terraform comienza con un único workspace llamado default. El workspace es especial porque es el predeterminado y no puede ser eliminado. Si nunca has utilizado explícitamente los workspaces, entonces sólo has trabajado en el workspace por default.

Los workspaces se gestionan con el comando terraform workspace. Hay un conjunto de comandos para los workspaces. Por ejemplo, podemos utilizar este comando terraform workspace new para crear un nuevo workspace.

Módulos 

Un módulo es un contenedor de código para múltiples recursos que se utilizan en conjunto. Cada configuración de Terraform tiene al menos un módulo, conocido como módulo de raíz. Este módulo de raíz suele estar formado por los recursos definidos en los archivos que tienen la extensión .tf en el directorio de trabajo principal.

 

Un módulo puede llamar a otros módulos y estos módulos llamados se convierten en módulos hijos de los módulos que llaman. Podemos poner una gran cantidad de recursos en un módulo particular que puedes utilizar en tu módulo principal de manera concisa. Podemos usar estos módulos de forma configurable para que el mismo módulo pueda ser empleado en diferentes entornos sin cambiar ningún código.

Esto es una combinación de uso de carpetas y módulos. Importamos el módulo al archivo principal y puedes pasar las respectivas variables de entrada basadas en el entorno como se muestra en la siguiente figura.

Resumen 

  • Terraform es una infraestructura de código abierto, una herramienta de software que proporciona un flujo de trabajo CLI consistente para gestionar cientos de servicios en la nube.

  • La mayoría de las veces desplegamos la infraestructura en múltiples entornos. Necesitamos estos entornos para el desarrollo, la ejecución, las pruebas y la producción.

  • Hay 4 maneras de escribir código reutilizable para diferentes entornos en Terraform.

  • El uso de carpetas es el más empleado de todos. Hay dos maneras de hacerlo.

  • Terraform comienza con un único workspace llamado default. El workspace es especial porque es el predeterminado y también porque nunca puede ser eliminado.

  • Un módulo es un contenedor de múltiples recursos que se utilizan de manera conjunta. Podemos utilizar estos módulos de forma configurable para que el mismo módulo pueda ser utilizado en diferentes entornos sin cambiar ningún código.