Antes de correr terraform plan, hay dos comandos que pueden ahorrarte tiempo y dolores de cabeza: terraform fmt y terraform validate. Si trabajas con decenas de recursos o estás migrando hacia pipelines automatizados con GitHub Actions o Azure Pipelines, dominar estos comandos vuelve tu código más legible y atrapa errores antes de tocar la nube.
¿Para qué sirve terraform fmt y cuándo usarlo?
El comando terraform fmt se encarga de uniformar el formato de tus archivos .tf. Alinea los signos de igual, ajusta indentaciones y deja todo el código con un estilo consistente, sin importar si lo escribiste tú o alguien más del equipo.
La magia aparece cuando lo combinas con la bandera --recursive. Desde la carpeta raíz de tu proyecto, un solo comando recorre todas las subcarpetas y aplica el formato a cada archivo.
bash
terraform fmt --recursive
El resultado es código mucho más cómodo de leer. Los signos de igual quedan en la misma columna, las indentaciones respetan una jerarquía clara y cualquier persona que entre a tu repositorio va a tener una experiencia de lectura más agradable.
¿Cuándo debo correr terraform fmt? Justo antes de cada commit. Así evitas mezclar cambios de lógica con cambios cosméticos y no tienes que ajustar indentaciones a mano.
¿Cómo aplicar fmt a un proyecto completo?
Tienes dos formas de usarlo según el alcance que necesites:
- Entrar a una carpeta específica con
cd y correr terraform fmt sobre ese directorio.
- Pararte en la carpeta raíz del proyecto y correr
terraform fmt --recursive para que afecte todo el árbol.
La segunda opción es la que más recomiendo cuando ya tienes varios módulos o estás cerca de automatizar con pipelines.
¿Qué hace terraform validate y por qué importa antes de plan?
terraform validate revisa la sintaxis y la coherencia interna de tu código sin tocar la nube. Es el filtro previo ideal para no gastar tiempo en un terraform plan que va a fallar por un detalle tonto.
Técnicamente, terraform plan ya ejecuta una validación interna antes de calcular el despliegue. La diferencia es que validate te da ese feedback de inmediato, sin esperar a que plan haga ping al proveedor.
Antes de validar necesitas tener el directorio inicializado. Si todavía no lo hiciste:
bash
terraform init
terraform validate
¿Qué errores detecta terraform validate? Errores de sintaxis, nombres mal formados, atributos requeridos que faltan y reglas de validación definidas en el proveedor. No detecta errores que dependan de una verificación contra la nube.
¿Qué errores no atrapa validate?
Aquí viene el matiz importante. Validate no se comunica con el proveedor, así que hay errores que solo aparecen en plan o apply.
Un ejemplo claro: si pongo Brazil North como región en Azure, una región que no existe, validate me dice que la configuración es válida. La sintaxis está bien escrita. Sin embargo, al correr terraform plan -out plan.out, plan sí me marca el error porque hace una verificación real contra Azure.
La regla práctica queda así:
- terraform validate atrapa errores de sintaxis, de nombres y de validaciones básicas del proveedor.
- terraform plan atrapa errores que requieren consultar con la nube, como regiones inexistentes o conflictos con recursos ya desplegados.
- terraform apply puede mostrar errores de permisos o restricciones que solo se manifiestan al ejecutar.
¿Cómo se ve un error real con validate en una storage account?
Un caso muy típico es el de las cuentas de almacenamiento en Azure. Si pongo un guion bajo en el nombre, algo como nombre_123, validate me responde con la regla concreta: la cuenta debe tener solo letras minúsculas y números, y entre 3 y 24 caracteres.
Corrijo el nombre quitando el guion, vuelvo a correr terraform validate y obtengo el mensaje de éxito: la configuración es válida.
Este flujo me ahorra dos cosas. Primero, el tiempo que tardaría plan en hacer la verificación con Azure. Segundo, la frustración de iterar sobre el mismo error varias veces.
¿Por qué fmt y validate son clave para automatizar con pipelines?
Cuando llevas tu código a GitHub Actions o Azure Pipelines, cada paso de validación previo te ahorra minutos de ejecución y créditos de cómputo. En un proyecto con dos o tres recursos el ahorro es marginal, pero con 70 recursos o más se vuelve sustancial.
Incorpora estos dos comandos como pasos obligatorios en tu pipeline antes de plan:
- Correr
terraform fmt --recursive --check para asegurar que el código esté bien formateado.
- Correr
terraform init para inicializar el directorio.
- Correr
terraform validate para atrapar errores de sintaxis.
- Solo después, correr
terraform plan.
Así construyes un proceso predecible, donde los errores aparecen en la etapa más barata y los despliegues a producción llegan limpios.
¿Ya estás usando fmt y validate en tu flujo de trabajo o todavía vas directo a plan? Cuéntame en los comentarios cómo los integras en tu proyecto.