Terraform nos permite realizar implementaciones de IaC. Podemos aplicar y destruir infraestructura de una manera rapida y automatizada. Para poder realizar estas operaciones uno de los archivos fundamentales de Terraform es el archivo <terraform.tfstate>
¿Que es y para que se utiliza el State en Terraform?
Terraform necesita almacenar el estado o “state” de la infraestructura y su configuracion. Esta información “del mundo real” es almacenada en el archivo <terraform.tfstate>.
Almacenando el estado de los recursos y sus dependencias, Terraform puede determinar qué cambios necesita aplicar a la infraestructura existente para alcanzar el estado deseado definido en el código: el “desired state”.
Este archivo guarda la información de los recursos que Terraform ha creado o configurado y se mantiene actualizado a medida que se generan cambios en la infraestrctura bajo el radar de la herramienta.
Es crucial manejarlo con cuidado, ya que puede contener información sensible. También es fundamental asegurarse de que el estado no entre en conflictos, especialmente en equipos grandes, mediante el uso de bloqueos o “locking”.
Por defecto, el estado se almacena en el backend “local”: se genera un archivo en el path en el que se encuentren nuestros archivos de nuestra configuración. Sin embargo, en entornos de equipo o para garantizar una mejor seguridad y versionado, es recomendable utilizar backends remotos como Azure Blob Storage, AWS S3, entre otros.
Remote State
El Remote State es la solución recomendada para el trabajo colaborativo con Terraform. Nos permitirá que varias personas/equipos puedan trabajar sobre la misma infarestructura. Mediante un backend de estado completamente funcional, Terraform puede utilizar el State Lock remoto como medida para prevenir que dos o más usuarios ejecuten Terraform simultáneamente, garantizando así que cada ejecución comience con el estado más recientemente actualizado.
Al usar Google Cloud Bucket Storage o GCS (o cualquier solución de almacenamiento remoto), aseguras que tu estado de Terraform esté centralizado, encriptado, versionado y accesible para aquellos que lo necesiten, lo cual es esencial para la gestión adecuada de la infraestructura con Terraform, especialmente en entornos de equipo y producción.
Ahora, veamos como configurarlo en un projecto de GCP. Para esto vamos a tener que revisar algunos puntos importantes:
Autenticación
En primera instancia vamos a tener que crear un Service Principal en GCP que nos permita autenticar y autorizar nuestro acceso a GCP de manera segura.
¿Que es un Service Account en GCP?
Una Service Account (SA) en GCP es un tipo de Identidad de IAM que nos permitirá utilizar las APIs o recursos de GCP de manera segura. Se utilizan en lugar de usuarios normales para acceder a servicios como VM instances, Applicaciones o en este caso un Google Cloud Storage (GCS) para utilizar Terraform. Esto quiere decir que es ideal para las interacciones “Server-to-Server” evitando la interación de usuarios.
Es importante implementar el Least Privilaged Access para nuestras SA para que cumplan una función unica. En este caso la utilizaremos para hacer el Login con Terraform: es decir, que esta service account solo deberá tener permisos para crear, modificar o eliminar recursos en nuestro Scope de GPC (en nuestro caso el projecto seleccionado)
¿Cómo se realiza la autenticación utilizando Service Accounts en GCP?
Las Service Accounts utilizan Key pars para poder realizar el login en nuestros recursos. Esta Key es almacenada, utilizadas por GCP y su ciclo de vida pueden ser administrado utilizando tanto la consola como la linea de comando.
Creación de Service Account
Ahora vamos a crear nuestro Service Account:
- En primer lugar, ingresaremos a nuestra Consola de GCP.
- Ingresaremos a la sección de “IAM & Admin” y seleccionaremos “Service Accounts”.
- Luego haremos click en “+ Create Service Account”
- Una vez en el asistente completaremos los Datos de la Service Account.
- Luego le daremos los permisos necesarios. En este caso, por fines los de demo, le daremos permisos de editor. Pero debemos intentar siempre mantener el Least Privilage en producción.
- Luego daremos click en “Done”.
- Podremos apreciar que nuestra Service Account fue creada.
- Ahora generaremos nuestra Key. Para esto debemos hacer click en la SA creada.
- Luego debemos seleccionar el tab “Keys”. Luego, click en “Add Key”.
- Seleccionaremos el format JSON y click en “Create”.
- Finalizará la creación:
- Y la Key será guardada en nuestro equipo.
- Como podemos ver en la sección de descargas de nuestro navegador.
- En este caso enviaremos el archivo al repo de nuestro codigo de Terraform (pueden buscarse alternativas mas seguras en producción) y excluiremos el archivo para ser manejado por Git a través de .gitignore.
- Podemos ver el contenido de la Key.
Creación del Cloud Storage Bucket
Ahora debemos realizar la creación de nuestro Cloud Storage Bucket en Google Cloud Storage (GCS). Para esto podemos seguir el siguiente tutorial:
https://cloud.google.com/storage/docs/creating-buckets?hl=es-419
En este caso, el bucket creado se llama mc-state:
Configurar autenticación para Terraform
Ahora debemos configurar la autenticación para Terraform.
A fines practicos de la demo, configuraremos la variable de entorno en PowerShell, pero tambien podremos hacerlo a través de las variables de entorno de nuestro repositorio de Git (esto es lo mas recomndable.
- Ejecutaremos el siguiente comando:
$env:GOOGLE_APPLICATION_CREDENTIALS="heroic-dynamo-410801-ba0880d89d64.json"
Configuración de Backend.tf
Ahora realizaremos la configuración de nuestro codigo de Backend. En este caso estaré generando un archivo con este fin llamado “backend.tf” en el directorio root:
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "3.5.0"
}
}
backend "gcs" {
bucket = "mc-tfstate"
prefix = "terraform/state"
}
}
- En este archivo configuraremos el required provider para nuestro backend.
- Y ademas, configuraremos el Backend en si mismo: especificaremos el nombre “gcs” y setearemos el nombre del bucket y el prefijo del archivo.
Es importante mencionar que el prefijo del archivo solo involucra los directorios del archivo y no el nombre en si. El nombre del archivo corresponderá al Workspace que Terraform se encuentra. En general, si no se ha cambiado en nuestra linea de comando este será el Default. Por este motivo el nombre del archivo será “default.tfstate”.
Iniciar configuración de Terraform
Iniciaremos la configuración de Terraform utilizando el siguiente comando:
terraform init
Una vez iniciado podremos comprobar que el State fue creado segun mencionado en el punto anterior:
Leave a Reply