← Index
Infrastructure · As Code

terraform

Déclarer l'infra, jamais la modifier à la main. Le triptyque init → plan → apply couvre 90 % de l'usage.

VERSION · v1.7+
CONFIG · *.tf · *.tfvars
DOCS · terraform.io/docs

Workflow core 01

Le cycle quotidien.

terraform initinit backend + providers
terraform init -upgrademettre à jour les providers
terraform init -reconfigurereconfigurer le backend
terraform init -migrate-statemigrer l'état vers un autre backend
terraform planprévoir les changements
terraform plan -out=plan.binsauvegarder le plan
terraform plan -target=<addr>cibler une ressource
terraform plan -var='k=v'variable inline
terraform plan -var-file=prod.tfvarsfichier de variables
terraform applyappliquer (confirmation)
terraform apply plan.binappliquer un plan sauvegardé
terraform apply -auto-approvesans confirmation (CI)
terraform apply -replace=<addr>remplacer (ex-taint)
terraform destroytout détruire
terraform destroy -target=<addr>détruire une ressource

Validation · Format 02

Qualité du code avant commit.

terraform fmtformatter le dossier
terraform fmt -recursivesous-dossiers inclus
terraform fmt -check -diffvérif (CI), diff
terraform validatevérif syntaxique
terraform validate -jsonsortie JSON
terraform providersarbre des providers
terraform providers lockverrouiller hashes multi-OS
terraform versionversion CLI + providers
tflintlinter (externe, recommandé)
tfsec · trivyaudit sécurité (externe)

Output · Console 03

Lire l'état sans apply.

terraform outputtous les outputs
terraform output <name>output précis
terraform output -raw <name>sans guillemets
terraform output -jsonformat JSON
terraform consoleREPL HCL sur l'état
terraform graphgraphe DOT des dépendances
terraform showétat en lecture humaine
terraform show -jsonétat JSON
terraform show plan.bininspecter un plan binaire

State management 04

Toucher l'état — avec précaution.

terraform state listadresses gérées
terraform state list module.xdans un module
terraform state show <addr>détails d'une ressource
terraform state pulldump du state distant
terraform state pushpousser un state local
terraform state mv A Brenommer / déplacer
terraform state rm <addr>retirer du state (pas du cloud)
terraform state replace-provider <old> <new>switch de provider
terraform force-unlock <ID>casser un lock bloqué
terraform refreshresync (déprécié, utiliser plan -refresh-only)
terraform plan -refresh-onlyresync en plan

Import · Taint · Replace 05

Absorber ou recréer une ressource.

terraform import <addr> <id>adopter une resource
terraform plan -generate-config-out=gen.tfbloc import → génère HCL
terraform apply -replace=<addr>force la recréation
terraform taint <addr>⚠ déprécié (utiliser -replace)
terraform untaint <addr>annuler un taint legacy

# Bloc import (TF ≥ 1.5)

import {
  to = aws_s3_bucket.logs
  id = "my-bucket"
}

Workspaces 06

Isolations d'états légers.

terraform workspace listworkspaces disponibles
terraform workspace showworkspace courant
terraform workspace new <n>créer
terraform workspace select <n>basculer
terraform workspace delete <n>supprimer

# Dans le HCL

name = "app-${terraform.workspace}"

⚠ Pour des environnements lourds (prod vs stg), préférer des dossiers séparés avec des backends distincts.

Variables 07

Priorité (haut → bas gagne).

1. -var / -var-file (CLI)
2. *.auto.tfvars[.json]
3. terraform.tfvars[.json]
4. TF_VAR_<name>  # env
5. default   # dans le bloc variable

# Déclaration

variable "region" {
  type    = string
  default = "eu-west-3"
  validation {
    condition     = contains(["eu-west-3","eu-west-1"], var.region)
    error_message = "Region non supportée"
  }
}

# Types composés

list(string) · set(string)
map(string)  · object({ a=string, b=number })
tuple([string, number])

Modules 08

Composer plutôt que copier.

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "5.5.0"

  name = "prod"
  cidr = "10.0.0.0/16"
}

# Sources possibles

"./modules/app"                # local
"github.com/ns/repo//path?ref=v1" # git
"git::ssh://git@host/repo.git"   # SSH
"s3::https://…/mod.zip"         # archive
"ns/mod/aws"                   # registry
terraform gettélécharger les modules
terraform get -updateforcer la mise à jour

Meta-arguments 09

Modifient le comportement d'un bloc.

countN instances d'une ressource
for_eachmap/set → instances nommées
depends_ondépendance explicite
provideralias de provider
lifecyclecreate_before_destroy / prevent_destroy / ignore_changes

# Boucle for_each

resource "aws_iam_user" "u" {
  for_each = toset(["alice","bob"])
  name     = each.key
}

# Lifecycle

lifecycle {
  create_before_destroy = true
  prevent_destroy       = true
  ignore_changes        = [tags["last_deploy"]]
}

Fonctions utiles 10

Les plus rentables au quotidien.

concat(a,b)concat listes
merge(a,b)fusion de maps
lookup(m,k,def)map get avec défaut
coalesce(a,b,c)1er non-null
try(expr, def)fallback si erreur
length(x)taille liste/map/string
jsonencode · jsondecodeJSON ↔ HCL
yamlencode · yamldecodeYAML ↔ HCL
file("path")lire un fichier
templatefile("t.tpl", {})templating
format("%s-%d", n, i)printf-like
join("-", list)join
split("/", s)split
cidrsubnet · cidrhostarithmétique CIDR
base64encode · base64decodeencoding
sha256 · md5 · uuidhash / id
timestamp() · formatdate(…)dates

Debug · Logs 11

Variables d'environnement qui sauvent.

TF_LOG=DEBUG    # TRACE, DEBUG, INFO, WARN, ERROR
TF_LOG_PATH=tf.log
TF_LOG_CORE=TRACE
TF_LOG_PROVIDER=DEBUG

TF_INPUT=0          # pas d'input interactif
TF_IN_AUTOMATION=1  # sortie condensée (CI)
TF_CLI_ARGS_plan="-parallelism=30"
TF_DATA_DIR=./.tf   # déplacer .terraform/
TF_PLUGIN_CACHE_DIR=~/.tf/cache
terraform plan -parallelism=1linéariser pour tracer une erreur
terraform consoleinspecter une expression

Backends remote 12

Stockage de l'état partagé.

terraform {
  required_version = ">= 1.7"

  backend "s3" {
    bucket         = "my-tfstate"
    key            = "prod/terraform.tfstate"
    region         = "eu-west-3"
    encrypt        = true
    dynamodb_table = "tf-locks"
  }

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

# Autres backends courants

backend "gcs"      { bucket = "…" }
backend "azurerm"  { …storage_account }
backend "remote"   { hostname = "app.terraform.io" }
backend "http"     { address  = "…" }

CLI flags utiles 13

Transverses à plan/apply/destroy.

-target=<addr>cibler (debug only)
-replace=<addr>forcer la recréation
-refresh=falseskip refresh
-lock=falsedésactiver le lock (risqué)
-parallelism=Nnb de workers (def. 10)
-input=falsepas d'interactif
-no-colorsortie sans ANSI
-jsonsortie structurée (CI)
-detailed-exitcode0=no change · 2=diff