Saltar al contenido
Aback Tools Logo

¿Qué comprueba realmente terraform validate?

terraform validate comprueba la sintaxis HCL, la conformidad con el esquema del proveedor y las referencias internas, pero no los valores de recursos, el estado ni los permisos. Vea qué cubre realmente.

DH
Tutorials & How-Tos12 min de lectura2,700 palabras

terraform validate es uno de los primeros comandos que aprende quien usa Terraform, pero también uno de los peor entendidos. No se conecta a ningún proveedor de nube. No comprueba si los valores de tus recursos son válidos en el mundo real. No mira tu archivo de estado. Lo que hace es rápido, seguro y esencial, pero entender exactamente dónde se detiene marca la diferencia entre un pipeline de CI fiable y una falsa sensación de seguridad antes de terraform apply.

0Llamadas a API realizadasanálisis estático totalmente offline
3Categorías de comprobaciónsintaxis, esquema, referencias
< 2 sTiempo típico de ejecuciónen la mayoría de configuraciones reales

Qué es terraform validate

terraform validate es un subcomando integrado de Terraform que realiza análisis estático sobre tus archivos de configuración. Lee cada archivo .tf y .tfvars del directorio de trabajo actual (y de forma recursiva los módulos locales), los analiza y comprueba si la configuración es internamente coherente y estructuralmente válida.

Análisis estático, no ejecución

La característica clave de terraform validate es que es totalmente estático. No se hacen conexiones de red, no se llaman API de proveedor y no se lee ningún archivo de estado. La comprobación ocurre por completo en memoria en la máquina que ejecuta el comando. Esto lo hace seguro en cualquier entorno, incluidos los runners de CI sin credenciales de nube, y termina en menos de dos segundos en la mayoría de configuraciones reales.

Esto contrasta con terraform plan, que realiza todas esas comprobaciones estáticas y luego se conecta a las API de proveedor para calcular una diferencia frente a la infraestructura real. Validate es el primer filtro ligero; plan es el filtro completo antes de aplicar. Ejecutar ambos en secuencia te da la cobertura más amplia antes de comprometerte con cualquier cambio de infraestructura.

Note

terraform validate mejoró notablemente en Terraform 0.12, cuando HCL2 pasó a ser el lenguaje de configuración. Antes de 0.12 la validación era superficial y muchos errores estructurales solo aparecían en la fase de plan. Desde 0.12, validate tiene un sistema de tipos completo y conocimiento del esquema, lo que lo hace mucho más útil como comprobación independiente.

Los tres modos de funcionamiento

  • Modo predeterminado: se ejecuta después de terraform init; comprueba sintaxis, esquema contra los plugins de proveedor descargados y referencias entre archivos
  • Sin init: si no existe el directorio .terraform, validate se ejecuta igualmente pero omite las comprobaciones de esquema del proveedor e informa solo de errores de análisis HCL y problemas de referencia que puede resolver sin metadatos del proveedor
  • Modo JSON (-json): emite un objeto JSON estructurado con un booleano valid, un entero error_count y un array diagnostics apto para que lo analice el CI y se integre en editores

Qué comprueba realmente terraform validate

Entender las tres categorías que cubre terraform validate te ayuda a saber exactamente qué garantiza aprobar la validación y dónde termina esa garantía.

1. Corrección de la sintaxis HCL

La primera pasada analiza cada archivo .tf en busca de sintaxis HCL2 válida. Esto detecta llaves sin cerrar, signos igual ausentes en asignaciones de atributos, definiciones de bloque inválidas, uso incorrecto de la sintaxis heredoc y cualquier otra construcción que no sea HCL válida. Un archivo que falle esta comprobación no puede ser leído por Terraform en absoluto: plan y apply también fallarían. Validate detecta estos errores de inmediato con la ruta del archivo y el número de línea.

2. Conformidad con el esquema del proveedor

Después del análisis, validate comprueba cada bloque de recurso, bloque de fuente de datos y configuración de proveedor contra el esquema definido por el plugin de proveedor correspondiente. Los esquemas especifican qué argumentos son válidos, cuáles son obligatorios y cuáles opcionales, y qué tipo espera cada argumento (string, number, bool, list, map, object). Validate detecta un argumento que no existe para un tipo de recurso, un argumento con el tipo equivocado (por ejemplo, pasar una cadena donde se requiere un número) y un argumento obligatorio que falta por completo.

Tip

Para que validate pueda comprobar los esquemas de proveedor, necesitas ejecutar terraform init en el directorio de trabajo. Init descarga los plugins de proveedor y los guarda en el directorio .terraform. Sin eso, validate no tiene esquema con el que comparar y se salta la validación a nivel de recurso. El flujo estándar de CI siempre es init → validate → plan.

3. Validez de las referencias internas

La tercera categoría es la comprobación de referencias cruzadas dentro de la configuración. Las configuraciones de Terraform referencian con frecuencia otros recursos, variables, locals, salidas de módulos y fuentes de datos por nombre. Validate comprueba que cada referencia (por ejemplo var.region, local.common_tags, aws_vpc.main.id, module.networking.subnet_ids) apunte a algo declarado realmente en algún lugar de la configuración. Una variable no declarada, un error tipográfico en una referencia a recurso o una salida de módulo inexistente se detectan aquí.

Categoría de comprobaciónEjemplo de error¿Requiere init?
Error de análisis HCLLlave sin cerrar en la línea 14No
Argumento desconocido"region" no es un argumento válido para aws_s3_bucketSí
Tipo de argumento incorrectoValor inadecuado para el atributo: se esperaba un númeroSí
Falta argumento obligatorioEl argumento "bucket" es obligatorioSí
Variable no declaradaUn recurso gestionado solo puede referirse a variables declaradasNo
Referencia a recurso no declaradoReferencia al recurso no declarado "aws_vpc.typo"No
Entrada de módulo ausenteEl argumento "vpc_id" es obligatorio para module.networkSí

Qué no comprueba terraform validate

Los límites de terraform validate son tan importantes como lo que cubre. Muchos desarrolladores descubren estos límites cuando una configuración que pasa la validación falla en el momento de aplicar. Cada una de estas categorías requiere terraform plan, pruebas de integración o herramientas de política como tflint o Checkov.

Valores reales de los argumentos de recursos

Validate comprueba que un argumento existe y tiene el tipo correcto, pero no puede comprobar si el valor es válido en el mundo real. Un recurso aws_instance puede tener un argumento ami que sea una cadena (correcto en tipo), pero validate no tiene forma de saber si ese AMI ID concreto existe en tu cuenta o región de AWS. Un AMI inválido, un ID de grupo de seguridad inexistente o un nombre de zona de disponibilidad incorrecto pasarán validate y solo fallarán en plan o apply.

Archivo de estado e infraestructura existente

Validate nunca lee tu archivo de estado de Terraform. No puede detectar que un recurso que estás definiendo entra en conflicto con otro que ya existe, que un recurso se eliminó fuera de Terraform (desviación del estado) o que un cambio previsto infringe una restricción que solo se puede evaluar contra la infraestructura real actual. Todo eso son cuestiones de las fases de plan y apply.

Expresiones dinámicas que dependen de fuentes de datos

Las expresiones count, for_each y condicionales son HCL válido y validate las analiza sin problema. Pero si sus valores dependen de una fuente de datos (por ejemplo for_each = toset(data.aws_availability_zones.available.names)), la expresión no se puede evaluar por completo en el momento de validar porque la fuente de datos no se ha consultado. Validate confirma que la sintaxis de la expresión es correcta; no puede confirmar el resultado en tiempo de ejecución.

Autenticación y permisos del proveedor

Validate no hace ninguna llamada a API. No detectará que tus credenciales de AWS han caducado, que a tu cuenta de servicio le faltan los permisos IAM necesarios ni que tu configuración de proveedor apunta a la región o el proyecto equivocados. Todos los errores de autenticación solo aparecen en la fase de plan o apply, cuando el cliente del proveedor se inicializa de verdad y se hacen las llamadas.

Warning

Aprobar terraform validate no significa que tu configuración esté lista para aplicar. Significa que es sintácticamente correcta y válida según el esquema. Sigue siempre validate con terraform plan, en un entorno de staging si es posible, antes de ejecutar terraform apply en producción.

Políticas de seguridad y reglas de cumplimiento

Validate no tiene noción de política de seguridad. Un bucket de S3 configurado como público, una instancia de EC2 sin cifrado o un grupo de seguridad con entrada 0.0.0.0/0 en el puerto 22 pasarán validate sin ninguna advertencia. Las comprobaciones de seguridad y cumplimiento requieren herramientas de política dedicadas como Checkov, tfsec o HashiCorp Sentinel.

terraform validate vs terraform plan

La fuente más frecuente de confusión sobre terraform validate es en qué se diferencia de terraform plan. Se solapan mucho, pero operan en niveles distintos, y ambos son necesarios para un flujo completo antes de aplicar.

terraform validate comprueba si una configuración es sintácticamente válida e internamente coherente, con independencia de las variables proporcionadas o del estado existente.

- Documentación de HashiCorp Terraform

Dónde se solapan

Ambos comandos analizan tus archivos HCL y buscan errores de sintaxis. Ambos comprueban los esquemas de proveedor cuando los plugins de proveedor están disponibles. Ambos validan las referencias internas. Un error de configuración que detecte terraform validate también lo detectaría terraform plan: validate simplemente es más rápido y no requiere credenciales de nube ni un backend de estado.

Hasta dónde llega plan

terraform plan inicializa los clientes de proveedor, se autentica con las API de nube, lee el estado actual y consulta las fuentes de datos. Esto le permite detectar cosas que validate no puede: un valor de argumento que la API del proveedor rechaza, una consulta a fuente de datos que devuelve resultados inesperados, errores de cuota o de límite de peticiones, y conflictos entre la configuración propuesta y la infraestructura existente registrada en el estado.


Capacidadterraform validateterraform plan
Comprobación de sintaxis HCL✓ Sí✓ Sí
Comprobación del esquema del proveedor✓ Sí (tras init)✓ Sí
Comprobación de referencias cruzadas✓ Sí✓ Sí
Comprobación de valores reales de recursos✗ No✓ Sí (vía API)
Lectura del archivo de estado✗ No✓ Sí
Consulta a fuentes de datos✗ No✓ Sí
Comprobación de autenticación y permisos✗ No✓ Sí
Comprobación de políticas de seguridad✗ No✗ No (requiere tfsec/Checkov)
Requiere credenciales de nube✗ No✓ Sí
Tiempo típico de ejecución< 2 s5 s a varios minutos

Note

En los pipelines de CI, validate y plan cumplen funciones distintas. Ejecuta validate en cada commit de pull request: es rápido, no necesita credenciales y detecta la mayoría de los errores de autoría a tiempo. Ejecuta plan en un trabajo aparte con acceso a credenciales de staging, lanzado al fusionar o como paso de aprobación manual.

Cómo ejecutar terraform validate

Ejecutar terraform validate es sencillo, pero los pasos que lo rodean importan para sacarle todo el partido al comando.

1

Ejecuta terraform init para descargar los proveedores

En tu directorio de trabajo de Terraform, ejecuta terraform init. Esto descarga los plugins de proveedor definidos en tu bloque required_providers y los guarda en el subdirectorio .terraform. Sin init, validate omite las comprobaciones de esquema del proveedor y solo realiza el análisis HCL y la validación de referencias. Usa terraform init -backend=false en CI para omitir la configuración del estado remoto cuando no haya credenciales.

2

Ejecuta terraform validate

Ejecuta terraform validate en el mismo directorio. El comando termina con código 0 (correcto) o código 1 (fallo). Si tiene éxito, imprime «Success! The configuration is valid.». Si falla, imprime cada error con la ruta del archivo, el número de línea y columna y una descripción. Usa terraform validate -json para obtener una salida estructurada en scripts de CI.

terminal
bash
# Validación básica
terraform validate

# Salida JSON para que la analice el CI
terraform validate -json

# Ejemplo de estructura de salida JSON
{
  "valid": false,
  "error_count": 2,
  "diagnostics": [
    {
      "severity": "error",
      "summary": "Unsupported argument",
      "detail": "An argument named 'regoin' is not expected here. Did you mean 'region'?",
      "range": {
        "filename": "main.tf",
        "start": { "line": 8, "column": 3 }
      }
    }
  ]
}
3

Revisa y corrige los errores indicados

Cada diagnóstico incluye una ruta de archivo y un número de línea. Abre el archivo señalado y mira la línea reportada más las 3-5 líneas anteriores: los errores de HCL a veces aparecen un poco después del error real. Las correcciones habituales incluyen corregir nombres de argumentos (los errores tipográficos son los más frecuentes), añadir un argumento obligatorio ausente, arreglar un desajuste de tipos (entrecomillar un número que debería ir sin comillas) o declarar una variable que se referencia pero no está definida.

4

Continúa con terraform plan

Cuando validate pase sin errores, ejecuta terraform plan en un entorno con credenciales válidas. Este es el segundo filtro, que detecta problemas en tiempo de ejecución que validate no puede ver: valores de recursos inválidos, errores de permisos y conflictos con el estado de la infraestructura. Los dos comandos juntos cubren toda la superficie de validación previa a aplicar.

Formateador HCL

Normaliza la indentación HCL, el espaciado de bloques y la alineación de atributos en tus archivos de Terraform antes de ejecutar validate, todo en tu navegador y sin registro.

Open tool

terraform validate en CI/CD

terraform validate encaja de forma natural en pipelines de CI porque no necesita credenciales de nube, se ejecuta en segundos y detecta casi todos los errores de autoría antes de que consuman una ejecución de plan o lleguen a una revisión de código. El patrón estándar es ejecutarlo en cada pull request que modifique archivos .tf.

Ejemplo con GitHub Actions

El siguiente flujo de trabajo instala Terraform, ejecuta init con -backend=false para no necesitar credenciales de estado y ejecuta validate. Si validate falla, el flujo de trabajo termina con código distinto de cero y bloquea la fusión del pull request.

.github/workflows/terraform-validate.yml
yaml
name: Terraform Validate

on:
  pull_request:
    paths:
      - '**.tf'
      - '**.tfvars'

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: '1.8.0'

      - name: Terraform Init (no backend)
        run: terraform init -backend=false

      - name: Terraform Validate
        run: terraform validate -json | tee validate-output.json
        # Exit code 1 on any error - fails the workflow automatically

Tip

Usar -backend=false hace que terraform init descargue los plugins de proveedor sin intentar inicializar el backend de estado remoto. Es el patrón correcto para los trabajos de CI de pull request que no deben tocar el archivo de estado compartido y no tienen credenciales de backend.

Combinar validate con tflint

tflint es un linter que detecta problemas que terraform validate deja pasar: comprobaciones de reglas específicas del proveedor (como tipos de instancia de AWS inválidos), declaraciones sin usar y reglas de política propias. Ejecutar tflint después de validate en el mismo trabajo de CI ofrece una cobertura de análisis estático más amplia. tflint tiene plugins de reglas específicas para AWS, Azure y GCP que comprueban los valores de los argumentos contra opciones válidas conocidas, detectando errores que la comprobación genérica de esquema de validate no puede.

  • terraform fmt -check: verifica que el código sigue las convenciones de estilo de Terraform (falla si algún archivo necesita reformateo)
  • terraform validate: comprueba sintaxis, conformidad con el esquema y referencias internas
  • tflint: reglas específicas del proveedor, detección de variables sin usar y aplicación de políticas propias
  • Checkov o tfsec: análisis de políticas de seguridad y cumplimiento
  • terraform plan: validación en tiempo de ejecución en un entorno de staging con credenciales reales

Verificador de convenciones de nombres de recursos de Terraform

Valida las etiquetas de recursos, módulos, variables y salidas de Terraform para un estilo de nombres coherente y el cumplimiento de políticas, todo en tu navegador.

Open tool

Buenas prácticas para una validación completa

terraform validate es una base, no un techo. Un flujo de trabajo maduro con Terraform combina varias técnicas de validación para detectar distintas clases de error en el punto adecuado del ciclo de desarrollo.

Formatea antes de validar

Ejecuta terraform fmt antes de validate en todos los flujos, locales y de CI. El formato canónico de HCL no es solo cuestión de estilo: evita casos límite en los que un espaciado o una ubicación de comentario incoherentes ocultan errores reales en la salida del análisis. El Formateador HCL de Aback Tools ofrece la misma normalización en tu navegador sin necesidad de tener Terraform instalado, algo útil para revisiones rápidas o para editar en máquinas donde no puedes ejecutar terraform fmt.

Ejecuta siempre init antes de validate en CI

Ejecutar validate sin init solo da un análisis parcial: análisis HCL y comprobación de referencias, pero sin validación del esquema del proveedor. Omitir las comprobaciones de esquema significa que puedes fusionar una configuración que usa un nombre de argumento con errata o pasa el tipo equivocado a un atributo de recurso. Los pocos segundos extra que añade init -backend=false al trabajo de CI merecen la pena por la cobertura.

Usa -json para salidas estructuradas en CI

La salida legible predeterminada de validate es clara para depurar en local, pero la salida JSON es mucho más útil en pipelines automatizados. Con -json puedes analizar el array diagnostics para extraer rutas de archivo y números de línea, anotar los diffs del pull request con comentarios de error en línea usando la API de GitHub Checks, o enviar los errores a una notificación personalizada de Slack. Analiza primero el booleano valid: si es true, el array diagnostics puede contener igualmente advertencias que merece la pena mostrar.

Valida todos los módulos de forma independiente

terraform validate en un módulo raíz también comprueba los módulos locales a los que llama, pero los módulos remotos solo se comprueban después de que init los descargue. Para repositorios de módulos, ejecuta validate por separado en cada directorio de módulo durante el desarrollo. Así aparecen los errores de esquema del propio módulo antes de que los consumidores lleguen a referenciarlo.

Warning

Una idea equivocada muy común es que terraform validate cubre la seguridad. No lo hace. Una configuración de Terraform perfectamente válida puede aprovisionar buckets de almacenamiento accesibles públicamente, bases de datos sin cifrar o roles IAM demasiado permisivos. Ejecuta siempre Checkov, tfsec o un escáner de políticas similar como paso aparte después de validate en tu pipeline de CI.

Mantén los archivos .tf formateados antes de confirmar

Usa un hook de pre-commit que ejecute terraform fmt -check y falle si algún archivo .tf no está en formato canónico. Esto mantiene coherente todo el código, evita diffs solo de estilo en las revisiones y hace que la salida de validate sea más fácil de leer porque el código tiene estructura limpia. Elimina los comentarios de desarrollo de las configuraciones de producción con el Eliminador de comentarios de Terraform HCL para mantener los archivos confirmados limpios y legibles.

Key takeaways

  • terraform validate comprueba la sintaxis HCL, la conformidad con el esquema del proveedor y las referencias cruzadas internas: no hace ninguna llamada a API y no necesita credenciales de nube.
  • Debes ejecutar terraform init antes de validate para habilitar las comprobaciones del esquema del proveedor; sin ello, validate omite la validación de argumentos de recursos.
  • Validate no puede detectar valores de argumento inválidos, desviación del estado, permisos ausentes ni infracciones de políticas de seguridad: eso requiere terraform plan y herramientas de política dedicadas.
  • El flag -json genera diagnósticos estructurados (valid, error_count, diagnostics[]) ideales para el análisis en CI, anotaciones en línea en PR y pipelines de informes propios.
  • El flujo correcto de CI es: terraform fmt -check → terraform init -backend=false → terraform validate → tflint → terraform plan (en staging y con credenciales).
  • Usa el Formateador HCL y el Verificador de convenciones de nombres de recursos de Terraform para la higiene de estilo y nombres antes de validar.
  • Aprobar terraform validate no significa que la configuración esté lista para aplicar: significa que es sintáctica y estructuralmente correcta como para pasar a plan.

Preguntas frecuentes

terraform validate comprueba tres cosas: la corrección de la sintaxis HCL (bloques válidos, sintaxis de atributos correcta, sin errores de análisis), la conformidad con el esquema (si los atributos que usaste los reconoce el proveedor y están en tipos compatibles) y la validez de las referencias internas (si cada variable, local, salida de módulo y referencia a recurso está declarada en alguna parte de la configuración). No se conecta a ninguna API de proveedor, así que no puede verificar si un recurso con esos argumentos existe realmente o se puede crear.

Sí, para una validación completa. Ejecutar terraform init descarga los plugins de proveedor y sus definiciones de esquema; sin ellos, terraform validate no puede comprobar si los argumentos que usaste son válidos para un tipo de recurso dado. Desde Terraform 0.13, ejecutar validate sin init produce un error en configuraciones que referencian proveedores. Si quieres omitir por completo las comprobaciones de esquema (por ejemplo, en una verificación solo de sintaxis), acepta esa limitación, pero el flujo estándar es init y después validate.

terraform validate es un paso de análisis puramente estático: lee tus archivos .tf, comprueba la sintaxis y el esquema, y termina sin contactar con ninguna API de proveedor. terraform plan realiza esas mismas comprobaciones y luego se conecta a las API de proveedor para determinar qué cambios se harían realmente. Plan detecta problemas que validate no puede: valores de argumento inválidos (como un nombre de región que no existe), permisos faltantes, límites de cuota y desviación del estado. Validate es rápido y seguro para CI; plan requiere credenciales y acceso real a la infraestructura.

No. terraform validate detecta errores estructurales y de esquema, pero deja pasar una clase importante de errores en tiempo de ejecución. No detectará un AMI ID inválido en una instancia de AWS, un nombre de bucket de GCS que infringe reglas de caracteres ni un recurso que entra en conflicto con otro existente en el estado. Tampoco valida la lógica de las expresiones count y for_each si dependen de fuentes de datos o valores remotos. Piensa en validate como un primer filtro rápido: necesario, pero no suficiente para tener plena confianza antes de aplicar.

Añade un trabajo de CI que ejecute terraform init y después terraform validate. Usa la acción hashicorp/setup-terraform para instalar la versión correcta de Terraform, luego ejecuta init con -backend=false para omitir la inicialización del estado remoto (que requiere credenciales) y a continuación validate. El paso de validate termina con código distinto de cero ante cualquier error, lo que hace fallar el flujo de trabajo y bloquea el pull request. Este patrón detecta errores de sintaxis HCL y de esquema en cada commit sin necesitar credenciales de nube en el entorno de CI.

El flag -json hace que terraform validate emita un objeto JSON estructurado en lugar de texto legible. El objeto tiene un booleano valid (true o false), un entero error_count y un array diagnostics. Cada entrada de diagnostics incluye una severidad (error o warning), un mensaje de resumen, una cadena de detalle y un objeto range con filename, línea inicial y línea final. Este formato es ideal para analizarlo en scripts de CI, integrarlo en paneles de informes propios o alimentar extensiones de editor que muestran anotaciones en línea.

Sí, parcialmente. terraform validate comprueba que los bloques de llamada a módulo referencian un origen de módulo que existe localmente o se puede resolver, que se proporcionan las variables de entrada obligatorias del módulo y que los tipos pasados a las entradas del módulo son compatibles con las declaraciones de variables del módulo. No descarga módulos remotos en el momento de validar salvo que ya los haya descargado terraform init. Después de init, el origen del módulo descargado está disponible localmente y se puede comprobar por completo contra el esquema.

Un flujo completo de calidad de Terraform combina varias herramientas. terraform validate cubre sintaxis y esquema. terraform plan cubre el comportamiento en tiempo de ejecución. tflint añade comprobaciones de reglas específicas del proveedor y reglas de política propias más allá de lo que exige validate. Checkov y tfsec hacen análisis de políticas de seguridad. Para el formato HCL y la coherencia de estilo antes de todo eso, el Formateador HCL de Aback Tools normaliza la indentación y la estructura de bloques, y el Verificador de convenciones de nombres de recursos de Terraform valida los nombres conforme a las convenciones de tu equipo.

ShareXLinkedIn