Pular para o conteúdo
Aback Tools Logo

O que o terraform validate realmente verifica?

O terraform validate verifica sintaxe HCL, conformidade com o esquema do provedor e referências internas, mas não valores de recursos, estado nem permissões. Veja o escopo exato.

DH
Tutorials & How-Tos12 min de leitura2,700 palavras

O terraform validate é um dos primeiros comandos que quem usa Terraform aprende, mas também é um dos mais mal compreendidos. Ele não se conecta a nenhum provedor de nuvem. Não verifica se os valores dos seus recursos são válidos no mundo real. Não olha para o seu arquivo de estado. O que ele faz é rápido, seguro e essencial, mas entender exatamente onde ele para é a diferença entre um pipeline de CI confiável e uma falsa sensação de segurança antes do terraform apply.

0Chamadas de API feitasanálise estática totalmente offline
3Categorias de verificaçãosintaxe, esquema, referências
< 2 sTempo típico de execuçãona maioria das configurações reais

O que é o terraform validate

O terraform validate é um subcomando embutido do Terraform que faz análise estática dos seus arquivos de configuração. Ele lê cada arquivo .tf e .tfvars do diretório de trabalho atual (e, recursivamente, os módulos locais), analisa e verifica se a configuração é internamente consistente e estruturalmente válida.

Análise estática, não execução

A característica principal do terraform validate é ser totalmente estático. Nenhuma conexão de rede é feita, nenhuma API de provedor é chamada e nenhum arquivo de estado é lido. A verificação acontece inteiramente em memória, na máquina que executa o comando. Isso o torna seguro em qualquer ambiente, inclusive runners de CI sem credenciais de nuvem, e ele termina em menos de dois segundos na maioria das configurações reais.

Isso contrasta com o terraform plan, que faz todas essas verificações estáticas e então se conecta às APIs dos provedores para calcular um diff em relação à infraestrutura real. O validate é o primeiro filtro leve; o plan é o filtro completo antes de aplicar. Rodar os dois em sequência dá a maior cobertura antes de você assumir qualquer mudança de infraestrutura.

Note

O terraform validate melhorou bastante no Terraform 0.12, quando o HCL2 passou a ser a linguagem de configuração. Antes do 0.12, a validação era superficial e muitos erros estruturais só apareciam na fase de plan. Desde o 0.12, o validate tem sistema de tipos completo e conhecimento de esquema, o que o torna muito mais útil como verificação independente.

Os três modos de operação

  • Modo padrão: roda após o terraform init; verifica sintaxe, esquema contra os plugins de provedor baixados e referências entre arquivos
  • Sem init: se o diretório .terraform não existir, o validate ainda roda, mas pula as verificações de esquema do provedor e reporta apenas erros de análise HCL e problemas de referência que consegue resolver sem metadados do provedor
  • Modo JSON (-json): emite um objeto JSON estruturado com um booleano valid, um inteiro error_count e um array diagnostics adequado para análise em CI e integrações com editores

O que o terraform validate realmente verifica

Entender as três categorias cobertas pelo terraform validate ajuda a saber exatamente o que passar na validação garante, e onde essa garantia termina.

1. Correção da sintaxe HCL

A primeira passada analisa cada arquivo .tf em busca de sintaxe HCL2 válida. Isso captura chaves não fechadas, sinais de igual ausentes em atribuições de atributos, definições de bloco inválidas, uso incorreto da sintaxe heredoc e qualquer outra construção que não seja HCL válido. Um arquivo que falha nessa verificação não pode ser lido pelo Terraform de forma alguma: plan e apply também falhariam. O validate captura esses erros imediatamente, com o caminho do arquivo e o número da linha.

2. Conformidade com o esquema do provedor

Depois da análise, o validate verifica cada bloco de recurso, bloco de fonte de dados e configuração de provedor contra o esquema definido pelo plugin de provedor correspondente. Os esquemas especificam quais argumentos são válidos, quais são obrigatórios e quais opcionais, e qual tipo cada argumento espera (string, number, bool, list, map, object). O validate captura um argumento que não existe para determinado tipo de recurso, um argumento com tipo errado (por exemplo, passar uma string onde se espera um número) e um argumento obrigatório totalmente ausente.

Tip

Para o validate conseguir verificar os esquemas dos provedores, você precisa rodar terraform init no diretório de trabalho. O init baixa os plugins de provedor e os guarda no diretório .terraform. Sem isso, o validate não tem esquema para comparar e pula a validação no nível de recurso. O fluxo padrão de CI é sempre init → validate → plan.

3. Validade das referências internas

A terceira categoria é a verificação de referências cruzadas dentro da configuração. Configurações Terraform referenciam com frequência outros recursos, variáveis, locals, saídas de módulos e fontes de dados por nome. O validate verifica se cada referência (por exemplo var.region, local.common_tags, aws_vpc.main.id, module.networking.subnet_ids) aponta para algo realmente declarado em algum lugar da configuração. Uma variável não declarada, um erro de digitação em uma referência de recurso ou uma saída de módulo ausente serão detectados aqui.

Categoria de verificaçãoExemplo de erroExige init?
Erro de análise HCLChave não fechada na linha 14Não
Argumento desconhecido"region" não é um argumento válido para aws_s3_bucketSim
Tipo de argumento erradoValor inadequado para o atributo - esperado númeroSim
Argumento obrigatório ausenteO argumento "bucket" é obrigatórioSim
Variável não declaradaUm recurso gerenciado só pode se referir a variáveis declaradasNão
Referência a recurso não declaradoReferência ao recurso não declarado "aws_vpc.typo"Não
Entrada de módulo ausenteO argumento "vpc_id" é obrigatório para module.networkSim

O que o terraform validate não verifica

Os limites do terraform validate são tão importantes quanto o que ele cobre. Muitos desenvolvedores descobrem esses limites quando uma configuração que passou na validação falha na hora de aplicar. Cada uma dessas categorias exige terraform plan, testes de integração ou ferramentas de política como tflint ou Checkov.

Valores reais dos argumentos de recursos

O validate verifica se um argumento existe e tem o tipo certo, mas não consegue verificar se o valor é válido no mundo real. Um recurso aws_instance pode ter um argumento ami que seja string (correto em tipo), mas o validate não tem como saber se aquele AMI ID específico existe na sua conta ou região da AWS. Um AMI inválido, um ID de security group inexistente ou um nome de zona de disponibilidade incorreto passam no validate e só falham no plan ou no apply.

Arquivo de estado e infraestrutura existente

O validate nunca lê o seu arquivo de estado do Terraform. Ele não consegue detectar que um recurso que você está definindo conflita com outro que já existe, que um recurso foi excluído fora do Terraform (desvio de estado) ou que uma mudança planejada viola uma restrição que só pode ser avaliada contra a infraestrutura real atual. Tudo isso são questões das fases de plan e apply.

Expressões dinâmicas que dependem de fontes de dados

Expressões count, for_each e condicionais são HCL válido e o validate as analisa sem problema. Mas se os valores dependerem de uma fonte de dados (por exemplo for_each = toset(data.aws_availability_zones.available.names)), a expressão não pode ser totalmente avaliada no momento da validação, porque a fonte de dados ainda não foi consultada. O validate confirma que a sintaxe da expressão está correta; não consegue confirmar o resultado em execução.

Autenticação e permissões do provedor

O validate não faz nenhuma chamada de API. Ele não detectará que suas credenciais da AWS expiraram, que sua conta de serviço não tem as permissões IAM necessárias ou que a configuração do provedor aponta para a região ou o projeto errados. Todos os erros de autenticação só aparecem na fase de plan ou apply, quando o cliente do provedor é realmente inicializado e as chamadas são feitas.

Warning

Passar no terraform validate não significa que a configuração está pronta para aplicar. Significa que ela é sintaticamente correta e válida segundo o esquema. Siga sempre o validate com terraform plan, em um ambiente de staging se possível, antes de rodar terraform apply em produção.

Políticas de segurança e regras de conformidade

O validate não tem nenhuma noção de política de segurança. Um bucket S3 configurado como público, uma instância EC2 sem criptografia ou um security group com entrada 0.0.0.0/0 na porta 22 passam no validate sem qualquer aviso. Verificações de segurança e conformidade exigem ferramentas de política dedicadas, como Checkov, tfsec ou HashiCorp Sentinel.

terraform validate vs terraform plan

A maior fonte de confusão sobre o terraform validate é como ele difere do terraform plan. Eles se sobrepõem bastante, mas operam em níveis diferentes, e os dois são necessários para um fluxo completo antes de aplicar.

O terraform validate verifica se uma configuração é sintaticamente válida e internamente consistente, independentemente das variáveis fornecidas ou do estado existente.

- Documentação do HashiCorp Terraform

Onde eles se sobrepõem

Os dois comandos analisam seus arquivos HCL e buscam erros de sintaxe. Os dois verificam esquemas de provedor quando os plugins estão disponíveis. Os dois validam referências internas. Um erro de configuração capturado pelo terraform validate também seria capturado pelo terraform plan: o validate é simplesmente mais rápido e não exige credenciais de nuvem nem backend de estado.

Até onde o plan vai além

O terraform plan inicializa clientes de provedor, autentica nas APIs de nuvem, lê o estado atual e consulta fontes de dados. Isso permite capturar o que o validate não consegue: um valor de argumento que a API do provedor rejeita, uma consulta a fonte de dados com resultados inesperados, erros de cota ou limite de requisições e conflitos entre a configuração proposta e a infraestrutura existente registrada no estado.


Capacidadeterraform validateterraform plan
Verificação de sintaxe HCL✓ Sim✓ Sim
Verificação do esquema do provedor✓ Sim (após init)✓ Sim
Verificação de referências cruzadas✓ Sim✓ Sim
Verificação de valores reais dos recursos✗ Não✓ Sim (via API)
Leitura do arquivo de estado✗ Não✓ Sim
Consulta a fontes de dados✗ Não✓ Sim
Verificação de autenticação e permissões✗ Não✓ Sim
Verificação de política de segurança✗ Não✗ Não (exige tfsec/Checkov)
Exige credenciais de nuvem✗ Não✓ Sim
Tempo típico de execução< 2 s5 s a vários minutos

Note

Em pipelines de CI, validate e plan cumprem funções diferentes. Rode o validate em cada commit de pull request: é rápido, não precisa de credenciais e captura a maioria dos erros de autoria cedo. Rode o plan em um job separado com acesso a credenciais de staging, disparado na fusão ou como etapa de aprovação manual.

Como rodar o terraform validate

Rodar o terraform validate é simples, mas as etapas ao redor importam para aproveitar bem o comando.

1

Rode terraform init para baixar os provedores

No seu diretório de trabalho do Terraform, rode terraform init. Isso baixa os plugins de provedor definidos no bloco required_providers e os guarda no subdiretório .terraform. Sem o init, o validate pula as verificações de esquema do provedor e faz apenas a análise HCL e a validação de referências. Use terraform init -backend=false no CI para pular a configuração do state remoto quando não houver credenciais.

2

Rode terraform validate

Execute terraform validate no mesmo diretório. O comando termina com código 0 (sucesso) ou 1 (falha). Em caso de sucesso, imprime «Success! The configuration is valid.». Em caso de falha, imprime cada erro com o caminho do arquivo, o número de linha e coluna e uma descrição. Use terraform validate -json para saída estruturada em scripts de CI.

terminal
bash
# Validação básica
terraform validate

# Saída JSON para análise no CI
terraform validate -json

# Exemplo de estrutura da saída 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

Revise e corrija os erros reportados

Cada diagnóstico inclui um caminho de arquivo e um número de linha. Abra o arquivo indicado e olhe a linha reportada mais as 3 a 5 linhas acima: erros de HCL às vezes aparecem um pouco depois do erro real. Correções comuns incluem ajustar nomes de argumentos (erros de digitação são os mais frequentes), fornecer um argumento obrigatório ausente, corrigir incompatibilidade de tipo (colocar entre aspas um número que deveria estar sem aspas) ou declarar uma variável referenciada mas não definida.

4

Continue com o terraform plan

Quando o validate passar sem erros, rode terraform plan em um ambiente com credenciais válidas. Esse é o segundo filtro, que captura problemas de execução que o validate não vê: valores de recursos inválidos, erros de permissão e conflitos com o estado da infraestrutura. Os dois comandos juntos cobrem toda a superfície de validação pré-aplicação.

Formatador HCL

Normalize indentação HCL, espaçamento de blocos e alinhamento de atributos nos seus arquivos do Terraform antes de rodar o validate - no seu navegador, sem cadastro.

Open tool

terraform validate em CI/CD

O terraform validate se encaixa naturalmente em pipelines de CI porque não exige credenciais de nuvem, roda em segundos e captura a maioria dos erros de autoria antes que consumam uma execução de plan ou cheguem a uma revisão de código. O padrão usual é rodá-lo em cada pull request que altera arquivos .tf.

Exemplo no GitHub Actions

O workflow abaixo instala o Terraform, roda init com -backend=false para não precisar de credenciais de state e roda validate. Se o validate falhar, o workflow termina com código diferente de zero e bloqueia a fusão do 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 faz o terraform init baixar os plugins de provedor sem tentar inicializar o backend de state remoto. Esse é o padrão correto para jobs de CI de pull request que não devem tocar no arquivo de estado compartilhado e não têm credenciais de backend.

Combinar o validate com o tflint

O tflint é um linter que captura problemas que o terraform validate deixa passar: verificações de regras específicas do provedor (como tipos de instância da AWS inválidos), declarações não usadas e regras de política próprias. Rodar o tflint depois do validate no mesmo job de CI dá cobertura de análise estática mais ampla. O tflint tem plugins de regras específicos para AWS, Azure e GCP que verificam valores de argumentos contra opções válidas conhecidas, capturando erros que a verificação genérica de esquema do validate não vê.

  • terraform fmt -check: verifica se o código segue as convenções de estilo do Terraform (falha se algum arquivo precisar de reformatação)
  • terraform validate: verifica sintaxe, conformidade com o esquema e referências internas
  • tflint: regras específicas do provedor, detecção de variáveis não usadas, aplicação de políticas próprias
  • Checkov ou tfsec: varredura de políticas de segurança e conformidade
  • terraform plan: validação em execução em um ambiente de staging com credenciais reais

Verificador de convenções de nomes de recursos do Terraform

Valide rótulos de recursos, módulos, variáveis e saídas do Terraform para um estilo de nomes consistente e conformidade de políticas - tudo no seu navegador.

Open tool

Boas práticas para validação completa

O terraform validate é uma base, não um teto. Um fluxo de trabalho maduro com Terraform combina várias técnicas de validação para capturar diferentes classes de erro no ponto certo do ciclo de desenvolvimento.

Formate antes de validar

Rode terraform fmt antes do validate em todo fluxo, local e de CI. A formatação canônica de HCL não é só estilo: evita casos-limite em que espaçamento ou posição de comentário inconsistentes escondem erros reais na saída da análise. O Formatador HCL do Aback Tools oferece a mesma normalização no navegador sem precisar do Terraform instalado, útil para revisões rápidas ou para editar em máquinas onde você não pode rodar terraform fmt.

Sempre rode init antes do validate no CI

Rodar o validate sem init dá apenas análise parcial: análise HCL e verificação de referências, mas sem validação do esquema do provedor. Pular as verificações de esquema significa que você pode fundir uma configuração que usa um nome de argumento com erro de digitação ou passa o tipo errado para um atributo de recurso. Os poucos segundos extras que o init -backend=false adiciona ao job de CI valem a cobertura.

Use -json para saída estruturada no CI

A saída legível padrão do validate é clara para depuração local, mas a saída JSON é muito mais útil em pipelines automatizados. Com -json, você pode analisar o array diagnostics para extrair caminhos de arquivo e números de linha, anotar diffs de pull request com comentários de erro na linha usando a API do GitHub Checks, ou enviar erros para uma notificação personalizada no Slack. Analise primeiro o booleano valid: se for true, o array diagnostics ainda pode conter avisos que valem a pena mostrar.

Valide todos os módulos independentemente

O terraform validate em um módulo raiz também verifica os módulos locais chamados, mas módulos remotos só são verificados depois que o init os baixa. Para repositórios de módulos, rode o validate separadamente em cada diretório de módulo durante o desenvolvimento. Isso revela erros de esquema no próprio módulo antes que consumidores cheguem a referenciá-lo.

Warning

Um equívoco comum é que o terraform validate cobre segurança. Ele não cobre. Uma configuração Terraform perfeitamente válida pode provisionar buckets de armazenamento acessíveis publicamente, bancos de dados sem criptografia ou papéis IAM permissivos demais. Rode sempre Checkov, tfsec ou um scanner de políticas semelhante como etapa separada depois do validate no seu pipeline de CI.

Mantenha os arquivos .tf formatados antes de commitar

Use um hook de pre-commit que rode terraform fmt -check e falhe se algum arquivo .tf não estiver no formato canônico. Isso mantém todo o código consistente, evita diffs apenas de estilo nas revisões e faz a saída do validate ser mais fácil de ler, porque o código tem estrutura limpa. Remova comentários de desenvolvimento das configurações de produção com o Removedor de comentários do Terraform HCL para manter os arquivos commitados limpos e legíveis.

Key takeaways

  • terraform validate verifica sintaxe HCL, conformidade com o esquema do provedor e referências cruzadas internas: não faz nenhuma chamada de API e não exige credenciais de nuvem.
  • Você precisa rodar terraform init antes do validate para habilitar as verificações de esquema do provedor; sem ele, o validate pula a validação de argumentos de recursos.
  • O validate não captura valores de argumento inválidos, desvio de estado, permissões ausentes nem violações de política de segurança: isso exige terraform plan e ferramentas de política dedicadas.
  • A flag -json gera diagnósticos estruturados (valid, error_count, diagnostics[]) ideais para análise em CI, anotações na linha em PRs e pipelines de relatório próprios.
  • O fluxo correto de CI é: terraform fmt -check → terraform init -backend=false → terraform validate → tflint → terraform plan (em staging e com credenciais).
  • Use o Formatador HCL e o Verificador de convenções de nomes de recursos do Terraform para higiene de estilo e nomes antes de validar.
  • Passar no terraform validate não significa que a configuração está pronta para aplicar: significa que está sintática e estruturalmente correta o bastante para seguir ao plan.

Perguntas frequentes

O terraform validate verifica três coisas: correção da sintaxe HCL (blocos válidos, sintaxe de atributo correta, sem erros de análise), conformidade com o esquema (se os atributos usados são reconhecidos pelo provedor e definidos com tipos compatíveis) e validade das referências internas (se cada variável, local, saída de módulo e referência de recurso está declarada em algum lugar da configuração). Ele não se conecta a nenhuma API de provedor, então não consegue verificar se um recurso com esses argumentos existe de fato ou pode ser criado.

Sim, para a validação completa. Executar terraform init baixa os plugins de provedor e suas definições de esquema; sem eles, o terraform validate não consegue verificar se os argumentos que você usou são válidos para determinado tipo de recurso. Desde o Terraform 0.13, rodar validate sem init produz erro em configurações que referenciam provedores. Se quiser pular totalmente as verificações de esquema (por exemplo, em uma checagem apenas de sintaxe), aceite essa limitação, mas o fluxo padrão é init e depois validate.

O terraform validate é uma etapa de análise puramente estática: lê seus arquivos .tf, verifica sintaxe e esquema e termina sem contatar nenhuma API de provedor. O terraform plan faz essas mesmas verificações e depois se conecta às APIs dos provedores para determinar quais mudanças seriam realmente aplicadas. O plan captura o que o validate não consegue: valores de argumento inválidos (como um nome de região inexistente), permissões ausentes, limites de cota e desvio de estado. O validate é rápido e seguro para CI; o plan exige credenciais e acesso real à infraestrutura.

Não. O terraform validate captura erros estruturais e de esquema, mas deixa passar uma classe importante de erros de execução. Ele não detecta um AMI ID inválido em uma instância AWS, um nome de bucket do GCS que viola regras de caracteres nem um recurso que conflita com outro já existente no estado. Também não valida a lógica das expressões count e for_each se elas dependerem de fontes de dados ou de valores remotos. Pense no validate como um primeiro filtro rápido: necessário, mas não suficiente para confiança total antes de aplicar.

Adicione um job de CI que rode terraform init e depois terraform validate. Use a action hashicorp/setup-terraform para instalar a versão correta do Terraform, rode init com -backend=false para pular a inicialização do state remoto (que exige credenciais) e em seguida validate. A etapa de validate termina com código diferente de zero em qualquer erro, o que faz o workflow falhar e bloqueia o pull request. Esse padrão detecta erros de sintaxe HCL e de esquema em cada commit sem exigir credenciais de nuvem no ambiente de CI.

A flag -json faz o terraform validate emitir um objeto JSON estruturado em vez de texto legível. O objeto tem um booleano valid (true ou false), um inteiro error_count e um array diagnostics. Cada entrada de diagnostics inclui uma severidade (error ou warning), um resumo, uma string de detalhe e um objeto range com filename, linha inicial e linha final. Esse formato é ideal para análise em scripts de CI, integração com painéis de relatório próprios ou alimentação de extensões de editor que exibem anotações na linha.

Sim, parcialmente. O terraform validate verifica se os blocos de chamada de módulo referenciam uma origem de módulo existente localmente ou resolvível, se as variáveis de entrada obrigatórias do módulo foram fornecidas e se os tipos passados às entradas do módulo são compatíveis com as declarações de variáveis do módulo. Ele não baixa módulos remotos no momento da validação, a menos que o terraform init já os tenha baixado. Depois do init, a origem do módulo baixado fica disponível localmente e pode ser totalmente verificada contra o esquema.

Um fluxo completo de qualidade em Terraform combina várias ferramentas. O terraform validate cobre sintaxe e esquema. O terraform plan cobre o comportamento em execução. O tflint adiciona verificações de regras específicas do provedor e regras de política próprias além do que o validate exige. Checkov e tfsec fazem varredura de políticas de segurança. Para formatação HCL e consistência de estilo antes disso tudo, o Formatador HCL do Aback Tools normaliza indentação e estrutura de blocos, e o Verificador de convenções de nomes de recursos do Terraform valida os rótulos segundo as convenções do seu time.

ShareXLinkedIn