Aller au contenu
Aback Tools Logo

Que vérifie réellement terraform validate ?

terraform validate vérifie la syntaxe HCL, la conformité au schéma du provider et les références internes, mais pas les valeurs des ressources, l'état ni les permissions. Voici son périmètre exact.

DH
Tutorials & How-Tos12 min de lecture2,700 mots

terraform validate est l'une des premières commandes que découvrent les utilisateurs de Terraform, mais aussi l'une des plus mal comprises. Il ne se connecte à aucun fournisseur cloud. Il ne vérifie pas si les valeurs de vos ressources sont valides dans le monde réel. Il ne regarde pas votre fichier d'état. Ce qu'il fait est rapide, sûr et essentiel, mais comprendre exactement où il s'arrête, c'est la différence entre un pipeline de CI fiable et un faux sentiment de sécurité avant terraform apply.

0Appels API effectuésanalyse statique entièrement hors ligne
3Catégories de contrôlesyntaxe, schéma, références
< 2 sDurée d'exécution typiquesur la plupart des configurations réelles

Ce qu'est terraform validate

terraform validate est une sous-commande intégrée de Terraform qui effectue une analyse statique de vos fichiers de configuration. Elle lit chaque fichier .tf et .tfvars du répertoire de travail courant (et récursivement les modules locaux), les analyse et vérifie si la configuration est cohérente en interne et structurellement valide.

De l'analyse statique, pas de l'exécution

La caractéristique clé de terraform validate est qu'il est entièrement statique. Aucune connexion réseau n'est établie, aucune API de provider n'est appelée et aucun fichier d'état n'est lu. Le contrôle se fait entièrement en mémoire, sur la machine qui exécute la commande. Il est donc sûr à exécuter dans n'importe quel environnement, y compris les runners de CI sans identifiants cloud, et il se termine en moins de deux secondes sur la plupart des configurations réelles.

C'est l'inverse de terraform plan, qui effectue tous ces contrôles statiques puis se connecte aux API des providers pour calculer un diff par rapport à l'infrastructure réelle. Validate est le premier filtre léger ; plan est le filtre complet avant application. Exécuter les deux à la suite offre la couverture la plus large avant de s'engager sur un changement d'infrastructure.

Note

terraform validate a été nettement amélioré dans Terraform 0.12, quand HCL2 est devenu le langage de configuration. Avant 0.12, la validation était superficielle et de nombreuses erreurs structurelles n'apparaissaient qu'au moment du plan. Depuis 0.12, validate dispose d'un système de types complet et d'une connaissance du schéma, ce qui le rend beaucoup plus utile comme contrôle autonome.

Les trois modes de fonctionnement

  • Mode par défaut : s'exécute après terraform init ; vérifie la syntaxe, le schéma par rapport aux plugins de provider téléchargés et les références entre fichiers
  • Sans init : si aucun répertoire .terraform n'existe, validate s'exécute quand même mais ignore les contrôles de schéma du provider et ne signale que les erreurs d'analyse HCL et les problèmes de référence qu'il peut résoudre sans métadonnées de provider
  • Mode JSON (-json) : produit un objet JSON structuré avec un booléen valid, un entier error_count et un tableau diagnostics adapté à l'analyse en CI et aux intégrations d'éditeur

Ce que terraform validate vérifie réellement

Comprendre les trois catégories couvertes par terraform validate permet de savoir exactement ce que garantit une validation réussie, et où cette garantie s'arrête.

1. La correction de la syntaxe HCL

La première passe analyse chaque fichier .tf à la recherche d'une syntaxe HCL2 valide. Elle détecte les accolades non fermées, les signes égal manquants dans les affectations d'attributs, les définitions de blocs invalides, un mauvais usage de la syntaxe heredoc et toute autre construction qui n'est pas du HCL valide. Un fichier qui échoue à ce contrôle ne peut pas être lu du tout par Terraform : plan et apply échoueraient aussi. Validate signale ces erreurs immédiatement avec le chemin du fichier et le numéro de ligne.

2. La conformité au schéma du provider

Après l'analyse, validate vérifie chaque bloc de ressource, bloc de source de données et configuration de provider par rapport au schéma défini par le plugin de provider concerné. Les schémas précisent quels arguments sont valides, lesquels sont requis ou facultatifs et quel type chaque argument attend (string, number, bool, list, map, object). Validate détecte un argument qui n'existe pas pour un type de ressource, un argument du mauvais type (par exemple une chaîne là où un nombre est requis) et un argument obligatoire totalement absent.

Tip

Pour que validate puisse contrôler les schémas de provider, vous devez exécuter terraform init dans le répertoire de travail. Init télécharge les plugins de provider et les stocke dans le répertoire .terraform. Sans cela, validate n'a aucun schéma à comparer et ignore la validation au niveau des ressources. Le workflow CI standard est toujours init → validate → plan.

3. La validité des références internes

La troisième catégorie est la vérification des références croisées dans la configuration. Les configurations Terraform référencent régulièrement d'autres ressources, variables, locals, sorties de modules et sources de données par leur nom. Validate vérifie que chaque référence (par exemple var.region, local.common_tags, aws_vpc.main.id, module.networking.subnet_ids) pointe vers quelque chose de réellement déclaré dans la configuration. Une variable non déclarée, une faute de frappe dans une référence de ressource ou une sortie de module manquante seront toutes détectées ici.

Catégorie de contrôleExemple d'erreurInit requis ?
Erreur d'analyse HCLAccolade non fermée ligne 14Non
Argument inconnu"region" n'est pas un argument valide pour aws_s3_bucketOui
Type d'argument incorrectValeur inappropriée pour l'attribut - nombre attenduOui
Argument obligatoire manquantL'argument "bucket" est obligatoireOui
Variable non déclaréeUne ressource managée ne peut référencer que des variables déclaréesNon
Référence de ressource non déclaréeRéférence à la ressource non déclarée "aws_vpc.typo"Non
Entrée de module manquanteL'argument "vpc_id" est obligatoire pour module.networkOui

Ce que terraform validate ne vérifie pas

Les limites de terraform validate sont aussi importantes que ce qu'il couvre. Beaucoup de développeurs les découvrent après qu'une configuration validée échoue au moment de l'application. Chacune de ces catégories nécessite terraform plan, des tests d'intégration ou des outils de politique comme tflint ou Checkov.

Les valeurs réelles des arguments de ressources

Validate vérifie qu'un argument existe et a le bon type, mais il ne peut pas vérifier si la valeur est valide dans le monde réel. Une ressource aws_instance peut avoir un argument ami de type chaîne (correct en type), mais validate n'a aucun moyen de savoir si cet AMI ID précis existe dans votre compte ou votre région AWS. Un AMI invalide, un ID de groupe de sécurité inexistant ou un nom de zone de disponibilité incorrect passeront validate et n'échoueront qu'au plan ou à l'apply.

Fichier d'état et infrastructure existante

Validate ne lit jamais votre fichier d'état Terraform. Il ne peut pas détecter qu'une ressource que vous définissez entre en conflit avec une ressource existante, qu'une ressource a été supprimée hors de Terraform (dérive de l'état) ou qu'un changement prévu enfreint une contrainte évaluable uniquement par rapport à l'infrastructure réelle actuelle. Tout cela relève des phases de plan et d'apply.

Expressions dynamiques dépendant de sources de données

Les expressions count, for_each et conditionnelles sont du HCL valide et validate les analyse sans problème. Mais si leurs valeurs dépendent d'une source de données (par exemple for_each = toset(data.aws_availability_zones.available.names)), l'expression ne peut pas être entièrement évaluée au moment de la validation, car la source de données n'a pas été interrogée. Validate confirme que la syntaxe de l'expression est correcte ; il ne peut pas confirmer le résultat à l'exécution.

Authentification et permissions du provider

Validate n'effectue aucun appel API. Il ne détectera pas que vos identifiants AWS sont expirés, que votre compte de service n'a pas les permissions IAM requises ou que la configuration de votre provider pointe vers la mauvaise région ou le mauvais projet. Toutes les erreurs d'authentification n'apparaissent qu'au plan ou à l'apply, quand le client du provider est réellement initialisé et que des appels sont effectués.

Warning

Réussir terraform validate ne signifie pas que votre configuration est prête à être appliquée. Cela signifie qu'elle est syntaxiquement correcte et valide selon le schéma. Faites toujours suivre validate de terraform plan, dans un environnement de staging si possible, avant de lancer terraform apply en production.

Politique de sécurité et règles de conformité

Validate n'a aucune notion de politique de sécurité. Un bucket S3 configuré comme public, une instance EC2 sans chiffrement ou un groupe de sécurité avec une entrée 0.0.0.0/0 sur le port 22 passeront validate sans aucun avertissement. Les contrôles de sécurité et de conformité exigent des outils de politique dédiés comme Checkov, tfsec ou HashiCorp Sentinel.

terraform validate vs terraform plan

La principale source de confusion autour de terraform validate est sa différence avec terraform plan. Ils se recouvrent largement mais opèrent à des niveaux différents, et les deux sont nécessaires pour un workflow complet avant application.

terraform validate vérifie si une configuration est syntaxiquement valide et cohérente en interne, indépendamment des variables fournies ou de l'état existant.

- Documentation HashiCorp Terraform

Où ils se recouvrent

Les deux commandes analysent vos fichiers HCL et recherchent des erreurs de syntaxe. Les deux vérifient les schémas de provider lorsque les plugins sont disponibles. Les deux valident les références internes. Une erreur de configuration détectée par terraform validate serait aussi détectée par terraform plan : validate est simplement plus rapide et n'exige ni identifiants cloud ni backend d'état.

Où plan va plus loin

terraform plan initialise les clients de provider, s'authentifie auprès des API cloud, lit l'état actuel et interroge les sources de données. Cela lui permet de voir ce que validate ne peut pas : une valeur d'argument rejetée par l'API du provider, une requête de source de données aux résultats inattendus, des erreurs de quota ou de limitation de débit, et des conflits entre la configuration proposée et l'infrastructure existante suivie dans l'état.


Capacitéterraform validateterraform plan
Contrôle de syntaxe HCL✓ Oui✓ Oui
Contrôle du schéma du provider✓ Oui (après init)✓ Oui
Contrôle des références croisées✓ Oui✓ Oui
Contrôle des valeurs réelles des ressources✗ Non✓ Oui (via API)
Lecture du fichier d'état✗ Non✓ Oui
Interrogation des sources de données✗ Non✓ Oui
Contrôle d'authentification et de permissions✗ Non✓ Oui
Contrôle de politique de sécurité✗ Non✗ Non (nécessite tfsec/Checkov)
Identifiants cloud requis✗ Non✓ Oui
Durée d'exécution typique< 2 s5 s à plusieurs minutes

Note

Dans les pipelines de CI, validate et plan remplissent des fonctions différentes. Exécutez validate à chaque commit de pull request : c'est rapide, sans identifiants, et cela détecte tôt la majorité des erreurs d'écriture. Exécutez plan dans un job distinct disposant d'identifiants de staging, déclenché à la fusion ou comme étape d'approbation manuelle.

Comment exécuter terraform validate

Exécuter terraform validate est simple, mais les étapes qui l'entourent comptent pour en tirer le meilleur parti.

1

Exécutez terraform init pour télécharger les providers

Dans votre répertoire de travail Terraform, exécutez terraform init. Cela télécharge les plugins de provider définis dans votre bloc required_providers et les stocke dans le sous-répertoire .terraform. Sans init, validate ignore les contrôles de schéma du provider et n'effectue que l'analyse HCL et la validation des références. Utilisez terraform init -backend=false en CI pour ignorer la configuration du state distant quand les identifiants ne sont pas disponibles.

2

Exécutez terraform validate

Exécutez terraform validate dans le même répertoire. La commande renvoie le code 0 (succès) ou 1 (échec). En cas de succès, elle affiche « Success! The configuration is valid. ». En cas d'échec, elle affiche chaque erreur avec le chemin du fichier, le numéro de ligne et de colonne, et une description. Utilisez terraform validate -json pour une sortie structurée dans les scripts de CI.

terminal
bash
# Validation de base
terraform validate

# Sortie JSON pour l'analyse en CI
terraform validate -json

# Exemple de structure de sortie 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

Examinez et corrigez les erreurs signalées

Chaque diagnostic comporte un chemin de fichier et un numéro de ligne. Ouvrez le fichier signalé et regardez la ligne indiquée ainsi que les 3 à 5 lignes précédentes : les erreurs HCL apparaissent parfois un peu après la véritable erreur. Les corrections courantes consistent à corriger des noms d'arguments (les fautes de frappe sont les plus fréquentes), à fournir un argument obligatoire manquant, à corriger une incompatibilité de type (mettre entre guillemets un nombre qui ne devrait pas l'être) ou à déclarer une variable référencée mais non définie.

4

Enchaînez avec terraform plan

Une fois validate réussi sans erreur, exécutez terraform plan dans un environnement disposant d'identifiants valides. C'est le second filtre, qui détecte les problèmes d'exécution invisibles pour validate : valeurs de ressources invalides, erreurs de permissions et conflits avec l'état de l'infrastructure. Les deux commandes couvrent ensemble toute la surface de validation avant application.

Formateur HCL

Normalisez l'indentation HCL, l'espacement des blocs et l'alignement des attributs dans vos fichiers Terraform avant de lancer validate - dans votre navigateur, sans inscription.

Open tool

terraform validate en CI/CD

terraform validate est parfaitement adapté aux pipelines de CI : il n'exige aucun identifiant cloud, s'exécute en quelques secondes et détecte la plupart des erreurs d'écriture avant qu'elles ne consomment une exécution de plan ou n'arrivent en revue de code. Le schéma standard est de l'exécuter à chaque pull request qui modifie des fichiers .tf.

Exemple GitHub Actions

Le workflow ci-dessous installe Terraform, lance init avec -backend=false pour éviter d'avoir besoin d'identifiants de state, puis lance validate. Si validate échoue, le workflow se termine avec un code non nul et bloque la fusion de la 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

Utiliser -backend=false signifie que terraform init télécharge les plugins de provider sans tenter d'initialiser le backend de state distant. C'est le bon schéma pour les jobs de CI de pull request qui ne doivent pas toucher au fichier d'état partagé et n'ont pas d'identifiants de backend.

Combiner validate avec tflint

tflint est un linter qui détecte les problèmes que terraform validate laisse passer : contrôles de règles propres au provider (comme des types d'instances AWS invalides), déclarations inutilisées et règles de politique personnalisées. Exécuter tflint après validate dans le même job de CI offre une couverture d'analyse statique plus large. tflint dispose de plugins de règles propres à AWS, Azure et GCP qui vérifient les valeurs d'arguments par rapport à des options valides connues, détectant des erreurs que le contrôle générique de schéma de validate ne peut pas voir.

  • terraform fmt -check : vérifie que le code respecte les conventions de style Terraform (échoue si un fichier doit être reformaté)
  • terraform validate : vérifie la syntaxe, la conformité au schéma et les références internes
  • tflint : règles propres au provider, détection des variables inutilisées, application de politiques personnalisées
  • Checkov ou tfsec : analyse des politiques de sécurité et de conformité
  • terraform plan : validation à l'exécution dans un environnement de staging avec de vrais identifiants

Vérificateur de conventions de nommage des ressources Terraform

Validez les libellés de ressources, modules, variables et sorties Terraform pour un style de nommage cohérent et le respect des politiques - entièrement dans votre navigateur.

Open tool

Bonnes pratiques pour une validation complète

terraform validate est une fondation, pas un plafond. Un workflow Terraform mature empile plusieurs techniques de validation pour détecter différentes classes d'erreurs au bon moment du cycle de développement.

Formatez avant de valider

Exécutez terraform fmt avant validate dans tous les workflows, locaux comme en CI. Le formatage HCL canonique n'est pas qu'une question de style : il évite les cas limites où un espacement ou un placement de commentaire incohérent masque de vraies erreurs dans la sortie d'analyse. Le formateur HCL d'Aback Tools offre la même normalisation dans votre navigateur sans avoir Terraform installé - utile pour des revues rapides ou pour éditer sur des machines où vous ne pouvez pas lancer terraform fmt.

Toujours init avant validate en CI

Exécuter validate sans init ne donne qu'une analyse partielle : analyse HCL et vérification des références, mais pas de validation du schéma du provider. Ignorer les contrôles de schéma signifie que vous pouvez fusionner une configuration qui utilise un nom d'argument mal orthographié ou passe le mauvais type à un attribut de ressource. Les quelques secondes que init -backend=false ajoute au job de CI valent la couverture obtenue.

Utilisez -json pour une sortie structurée en CI

La sortie lisible par défaut de validate est claire pour le débogage local, mais la sortie JSON est bien plus utile dans des pipelines automatisés. Avec -json, vous pouvez analyser le tableau diagnostics pour extraire chemins de fichiers et numéros de ligne, annoter les diffs de pull request avec des commentaires d'erreur en ligne via l'API GitHub Checks, ou envoyer les erreurs dans une notification Slack personnalisée. Analysez d'abord le booléen valid : s'il vaut true, le tableau diagnostics peut encore contenir des avertissements qu'il vaut la peine de signaler.

Validez chaque module indépendamment

terraform validate dans un module racine vérifie aussi les modules locaux appelés, mais les modules distants ne sont contrôlés qu'après leur téléchargement par init. Pour les dépôts de modules, exécutez validate séparément dans chaque répertoire de module pendant le développement. Cela fait apparaître les erreurs de schéma du module lui-même avant que les consommateurs ne le référencent.

Warning

Une idée fausse courante est que terraform validate couvre la sécurité. Ce n'est pas le cas. Une configuration Terraform parfaitement valide peut provisionner des buckets de stockage accessibles publiquement, des bases de données non chiffrées ou des rôles IAM trop permissifs. Exécutez toujours Checkov, tfsec ou un scanner de politiques similaire comme étape distincte après validate dans votre pipeline de CI.

Gardez les fichiers .tf formatés avant de committer

Utilisez un hook pre-commit qui exécute terraform fmt -check et échoue si un fichier .tf n'est pas au format canonique. Cela garde tout le code cohérent, évite les diffs purement stylistiques en revue de code et rend la sortie de validate plus lisible grâce à une structure de code propre. Supprimez les commentaires de développement des configurations de production avec le suppresseur de commentaires Terraform HCL pour garder les fichiers committés propres et lisibles.

Key takeaways

  • terraform validate vérifie la syntaxe HCL, la conformité au schéma du provider et les références croisées internes : il n'effectue aucun appel API et n'exige aucun identifiant cloud.
  • Vous devez exécuter terraform init avant validate pour activer les contrôles de schéma du provider ; sans cela, validate ignore la validation des arguments de ressources.
  • Validate ne peut pas détecter des valeurs d'arguments invalides, une dérive de l'état, des permissions manquantes ni des violations de politique de sécurité : cela nécessite terraform plan et des outils de politique dédiés.
  • L'option -json produit des diagnostics structurés (valid, error_count, diagnostics[]) idéaux pour l'analyse en CI, les annotations en ligne dans les PR et des pipelines de reporting personnalisés.
  • Le workflow CI correct est : terraform fmt -check → terraform init -backend=false → terraform validate → tflint → terraform plan (en staging avec identifiants).
  • Utilisez le formateur HCL et le vérificateur de conventions de nommage des ressources Terraform pour l'hygiène de style et de nommage avant validation.
  • Réussir terraform validate ne signifie pas que la configuration est prête à être appliquée : cela signifie qu'elle est suffisamment correcte sur le plan syntaxique et structurel pour passer à plan.

Questions fréquentes

terraform validate vérifie trois choses : la correction de la syntaxe HCL (blocs valides, syntaxe d'attribut correcte, aucune erreur d'analyse), la conformité au schéma (si les attributs utilisés sont reconnus par le provider et définis avec des types compatibles) et la validité des références internes (si chaque variable, local, sortie de module et référence de ressource est déclarée quelque part dans la configuration). Il ne se connecte à aucune API de provider : il ne peut donc pas vérifier qu'une ressource avec ces arguments existe réellement ou peut être créée.

Oui, pour une validation complète. Exécuter terraform init télécharge les plugins de provider et leurs définitions de schéma ; sans eux, terraform validate ne peut pas vérifier si les arguments utilisés sont valides pour un type de ressource donné. Depuis Terraform 0.13, exécuter validate sans init produit une erreur pour les configurations qui référencent des providers. Si vous voulez ignorer entièrement les vérifications de schéma (par exemple pour un contrôle de syntaxe pur), acceptez cette limite, mais le flux standard reste init puis validate.

terraform validate est une étape d'analyse purement statique : il lit vos fichiers .tf, vérifie la syntaxe et le schéma, puis se termine sans contacter aucune API de provider. terraform plan effectue ces mêmes vérifications puis se connecte aux API des providers pour déterminer les changements qui seraient réellement appliqués. Plan détecte ce que validate ne peut pas voir : valeurs d'arguments invalides (comme un nom de région inexistant), permissions manquantes, limites de quota et dérive de l'état. Validate est rapide et sûr en CI ; plan exige des identifiants et un accès réel à l'infrastructure.

Non. terraform validate détecte les erreurs structurelles et de schéma, mais laisse passer une classe importante d'erreurs d'exécution. Il ne détectera pas un AMI ID invalide dans une instance AWS, un nom de bucket GCS qui enfreint les règles de caractères, ni une ressource en conflit avec une ressource existante dans l'état. Il ne valide pas non plus la logique des expressions count et for_each lorsqu'elles dépendent de sources de données ou de valeurs distantes. Voyez validate comme un premier filtre rapide : nécessaire, mais pas suffisant pour une confiance totale avant application.

Ajoutez un job de CI qui exécute terraform init puis terraform validate. Utilisez l'action hashicorp/setup-terraform pour installer la bonne version de Terraform, lancez init avec -backend=false pour éviter l'initialisation du state distant (qui exige des identifiants), puis validate. L'étape validate se termine avec un code non nul en cas d'erreur, ce qui fait échouer le workflow et bloque la pull request. Ce schéma détecte les erreurs de syntaxe HCL et de schéma à chaque commit sans nécessiter d'identifiants cloud dans l'environnement de CI.

L'option -json fait produire à terraform validate un objet JSON structuré au lieu d'un texte lisible. L'objet contient un booléen valid (true ou false), un entier error_count et un tableau diagnostics. Chaque entrée de diagnostics comporte une sévérité (error ou warning), un message de synthèse, une chaîne de détail et un objet range avec filename, ligne de début et ligne de fin. Ce format est idéal pour l'analyse dans des scripts de CI, l'intégration dans des tableaux de bord de reporting ou l'alimentation d'extensions d'éditeur qui affichent des annotations en ligne.

Oui, partiellement. terraform validate vérifie que les blocs d'appel de module référencent une source de module existant localement ou résoluble, que les variables d'entrée requises du module sont fournies et que les types passés aux entrées du module sont compatibles avec les déclarations de variables du module. Il ne récupère pas les modules distants au moment de la validation, sauf s'ils ont déjà été téléchargés par terraform init. Après init, la source du module téléchargée est disponible localement et peut être entièrement vérifiée par rapport au schéma.

Un workflow Terraform complet empile plusieurs outils. terraform validate couvre la syntaxe et le schéma. terraform plan couvre le comportement à l'exécution. tflint ajoute des vérifications de règles propres au provider et des règles de politique personnalisées au-delà de ce qu'impose validate. Checkov et tfsec réalisent l'analyse des politiques de sécurité. Pour le formatage HCL et la cohérence de style avant tout cela, le formateur HCL d'Aback Tools normalise l'indentation et la structure des blocs, et le vérificateur de conventions de nommage des ressources Terraform valide les libellés selon les conventions de votre équipe.

ShareXLinkedIn