Aller au contenu
Infrastructure as Code medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Aide-mémoire Associate : Terraform en un coup d'œil

10 min de lecture

logo terraform

Synthèse des concepts Terraform pour l’examen Associate (004). L’examen est un QCM : vous ne taperez pas ces commandes, mais vous devez comprendre ce que fait chaque commande, ses effets et les pièges classiques. Cette page est un condensé de révision, pas un guide d’apprentissage.

BesoinCommande
Initialiser un projetterraform init
Prévisualiser les changementsterraform plan
Appliquer les changementsterraform apply
Détruire toute l’infrastructureterraform destroy
Formater le code HCLterraform fmt
Valider la syntaxeterraform validate
Mettre à jour le lock fileterraform init -upgrade
Voir le stateterraform state list
Inspecter une ressourceterraform state show <addr>
Remplacer une ressourceterraform apply -replace=<addr>
Importer une ressource existanteterraform import <addr> <id>
Afficher les outputsterraform output
Afficher les provider requirements de la configurationterraform providers
Activer le debugTF_LOG=DEBUG terraform plan

CommandeCe qu’elle faitCe qu’elle ne fait pas
terraform initTélécharge providers/modules, configure le backend, crée .terraform/ et .terraform.lock.hclNe crée aucune ressource
terraform planCompare config + state + infra réelle, affiche les changements prévusNe modifie rien (read-only)
terraform applyExécute le plan : crée/modifie/supprime les ressources, met à jour le stateNe reformate pas le code
terraform destroyDétruit toutes les ressources du state (= apply -destroy)Ne supprime pas les fichiers .tf
terraform fmtReformate les .tf selon le style canonique HCLNe vérifie pas la logique
terraform validateVérifie syntaxe et cohérence HCLNe contacte pas le provider
terraform importIntègre une ressource existante dans le stateNe génère pas le code HCL (sauf bloc import {} + -generate-config-out)
terraform state listListe les ressources du stateNe contacte pas le provider


OptionCommandeEffet
-upgradeinitMet à jour providers/modules (ignore le lock file)
-reconfigureinitForce la reconfiguration du backend
-migrate-stateinitMigre le state vers un nouveau backend
-out=tfplanplanSauvegarde le plan dans un fichier binaire
-auto-approveapply/destroySupprime la confirmation interactive
-replace=<addr>applyForce la recréation d’une ressource (remplace taint)
-target=<addr>plan/applyCible une seule ressource (dépannage uniquement)
-refresh-onlyplan/applyMet à jour le state et les outputs pour refléter les changements faits hors Terraform, sans modifier les objets distants
-var / -var-fileplan/applyPasse des variables en ligne de commande
-checkfmtVérifie sans modifier (code d’erreur si non formaté)

BlocRemplaceEffet
moved {}terraform state mvMet à jour l’adresse d’une ressource dans le state sans la détruire — déclaratif, versionné
removed {}terraform state rmPar défaut, retire du state et détruit la ressource réelle. Pour ne pas détruire l’infra, ajouter lifecycle { destroy = false }
import {}terraform importImport déclaratif d’une ressource existante (Terraform 1.5+). Peut générer la config avec terraform plan -generate-config-out=...

PrioritéSource
1 (haute)-var et -var-file sur la ligne de commande (et variables HCP Terraform)
2*.auto.tfvars / *.auto.tfvars.json (ordre alphabétique)
3terraform.tfvars.json
4terraform.tfvars
5Variables d’environnement TF_VAR_*
6 (basse)default dans variable {}

Aspectcountfor_each
RéférenceIndex numérique : [0], [1]Clé de map/set : ["web-1"]
SuppressionDécale les index suivantsNe décale rien
UsageRessources identiquesRessources avec identité distincte
RecommandationNombre fixe, ressources simplesDès qu’une clé identifie chaque instance

OptionEffet
create_before_destroyCrée la nouvelle ressource avant de détruire l’ancienne
prevent_destroyErreur si Terraform tente de détruire cette ressource
ignore_changesIgnore les modifications manuelles sur les attributs listés

BlocEffet
preconditionDans lifecycle {}Vérifie une condition avant l’opération — bloque si faux
postconditionDans lifecycle {}Vérifie une condition après l’opération — bloque si faux
check {}Au niveau racineAssertion continue — affiche un warning sans bloquer le plan


ConceptDétail
sensitive = trueMasque la valeur dans les logs de plan/apply — ne chiffre pas le state
State en clairLe state contient toutes les valeurs sensibles en texte brut
Provider VaultPermet de lire les secrets depuis HashiCorp Vault au lieu de les stocker dans le code
Backend sécuriséStockez le state dans un backend chiffré (S3 + encryption, HCP Terraform)

VariableEffet
TF_LOGActive les logs — niveaux : TRACE > DEBUG > INFO > WARN > ERROR
TF_LOG_PATHRedirige les logs vers un fichier

AspectCLI (terraform workspace)HCP Terraform
StateFichiers séparés dans le même backendState dédié par workspace
VariablesMêmes fichiers tfvarsVariables par workspace + variable sets
ExécutionLocaleDistante (runners HCP)
GouvernanceAucunePolicies, cost estimation, audit
CollaborationManuelleUI, VCS, notifications, approbations

Affirmation piègeBonne réponse
init met à jour automatiquement les providersNon — il faut init -upgrade
validate vérifie que les ressources existent dans le cloudNon — syntaxe HCL uniquement, pas de contact provider
taint est la méthode recommandée pour recréerNon-replace remplace taint (déprécié)
Le state est chiffré par défautNon — tout est en clair, y compris les données sensibles
plan modifie l’infrastructureNon — read-only, seul apply modifie
TF_VAR_* a la plus haute prioritéNon-var/-var-file gagnent. TF_VAR_* est en dessous des fichiers tfvars
Les workspaces CLI et HCP sont identiquesNon — concepts très différents
moved {} détruit et recrée la ressourceNon — met à jour l’adresse dans le state sans toucher à l’infra
removed {} retire du state sans conséquenceAttention — par défaut removed {} détruit aussi la ressource réelle. lifecycle { destroy = false } pour un simple retrait
sensitive = true chiffre la valeur dans le stateNon — masque les logs uniquement, le state reste en clair
count et for_each sont interchangeablesNon — count = index numérique, for_each = clé stable
terraform import génère automatiquement le code HCLNon — il faut écrire le bloc resource (sauf bloc import {} + -generate-config-out)
  • Le workflow fondamental est init → plan → apply → destroy
  • init -upgrade met à jour les providers, init seul respecte le lock file
  • validate = syntaxe, plan = faisabilité — ce n’est pas la même chose
  • -replace remplace taint, moved {} remplace state mv, removed {} remplace state rm (attention : removed {} détruit par défaut — lifecycle { destroy = false } pour garder l’infra)
  • Priorité des variables : -var/-var-file > *.auto.tfvars > terraform.tfvars.json > terraform.tfvars > TF_VAR_* > default
  • Le state contient les valeurs sensibles en clair — protégez-le avec un backend sécurisé
  • Les workspaces CLI ≠ workspaces HCP Terraform
  • Les custom conditions (precondition, postcondition, check) sont des nouveautés testées en (004)
  • Le provider Vault peut gérer les secrets — ne stockez jamais de credentials dans le code

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn