Bases
Flux de travail principal
terraform init # install providers & modules terraform plan # preview changes terraform apply # apply changes terraform destroy # tear down all resources
Commandes essentielles
terraform initInitialiser le répertoire de travail, télécharger les fournisseurs
terraform planAfficher le plan d'exécution sans appliquer
terraform applyAppliquer les modifications à l'infrastructure
terraform destroyDétruire toutes les ressources gérées
terraform fmtFormater les fichiers .tf selon le style canonique
terraform validateVérifier la syntaxe de la configuration
terraform showAfficher l'état actuel ou le plan
terraform outputAfficher les valeurs de sortie
Fournisseurs
Configuration du fournisseur
terraform { required_providers { aws = { source = "hashicorp/aws", version = "~> 5.0" } } } provider "aws" { region = "us-east-1" }
Notes sur les fournisseurs
sourceAdresse du registre (hashicorp/aws, hashicorp/google)
versionContrainte de version (~> 5.0, >= 3.0, < 4.0)
.terraform.lock.hclFichier de verrouillage — à valider dans le contrôle de version
aliasUtiliser plusieurs configurations pour le même fournisseur
Ressources
Blocs de ressources
resource "aws_instance" "web" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t3.micro" tags = { Name = "web-server" } }
Meta-arguments de ressource
depends_onDépendance explicite envers une autre ressource
countCréer plusieurs instances (count = 3)
for_eachCréer des instances depuis une map ou un ensemble
providerSélectionner un alias de fournisseur non par défaut
lifecyclePersonnaliser le comportement de création/mise à jour/destruction
Référencer les ressources
# type.name.attribute aws_instance.web.id aws_instance.web.public_ip aws_vpc.main.cidr_block
Variables
Déclarer des variables
variable "region" { type = string default = "us-east-1" } variable "instance_count" { type = number description = "Number of instances" }
Définir les valeurs de variables
-var 'region=us-west-2'Option en ligne de commande
-var-file=prod.tfvarsCharger depuis un fichier .tfvars
terraform.tfvarsChargé automatiquement si présent
TF_VAR_regionVariable d'environnement
Interactive promptDemandé au plan/apply si pas de valeur par défaut
Types de variables
string"us-east-1"
number42
booltrue / false
list(string)["a", "b"]
map(string){ key = "val" }
object({...})Type structuré avec attributs nommés
Sorties
Définir des sorties
output "instance_ip" { value = aws_instance.web.public_ip description = "Public IP of the web server" } output "db_password" { value = random_password.db.result sensitive = true }
Commandes de sortie
terraform outputAfficher toutes les sorties
terraform output instance_ipAfficher une sortie spécifique
terraform output -jsonFormat JSON pour les scripts
sensitive = trueMasquer la valeur dans la sortie CLI
module.vpc.vpc_idAccéder aux sorties d'un module enfant
État
Backend distant
terraform { backend "s3" { bucket = "my-tf-state" key = "prod/terraform.tfstate" region = "us-east-1" } }
Commandes d'état
terraform state listLister toutes les ressources dans l'état
terraform state show <addr>Afficher les attributs d'une ressource
terraform state mv <src> <dst>Renommer / déplacer une ressource dans l'état
terraform state rm <addr>Supprimer une ressource de l'état (garder l'infra)
terraform state pullTélécharger l'état distant vers stdout
terraform import <addr> <id>Importer une infra existante dans l'état
Modules
Utiliser des modules
module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "~> 5.0" cidr = "10.0.0.0/16" }
Sources de modules
"./modules/vpc"Chemin local
"terraform-aws-modules/vpc/aws"Registre Terraform
"github.com/org/repo//module"Dépôt GitHub
"s3::https://bucket/module.zip"Compartiment S3
Structure d'un module
modules/vpc/ main.tf # resources variables.tf # input variables outputs.tf # output values
Sources de données
Lire des ressources existantes
data "aws_ami" "ubuntu" { most_recent = true filter { name = "name" values = ["ubuntu/images/hvm-ssd/*"] } owners = ["099720109477"] }
Sources de données courantes
data.aws_amiRechercher une AMI par filtres
data.aws_vpcRechercher un VPC existant
data.aws_caller_identityIdentifiant de compte AWS actuel
data.aws_regionRégion AWS actuelle
data.terraform_remote_stateLire les sorties d'un autre fichier d'état
data.externalExécuter un programme externe pour des données
Cycle de vie
Règles de cycle de vie
resource "aws_instance" "web" { lifecycle { create_before_destroy = true prevent_destroy = true ignore_changes = [tags] } }
Options de cycle de vie
create_before_destroyCréer le remplacement avant de détruire l'ancien
prevent_destroyErreur si terraform destroy cible cette ressource
ignore_changesNe pas détecter la dérive sur les attributs listés
replace_triggered_byForcer le remplacement quand la ressource référencée change
preconditionValider les hypothèses avant l'application
postconditionValider les résultats après l'application
Modèles courants
Boucles et conditions
# for_each with a map resource "aws_iam_user" "users" { for_each = toset(["alice", "bob"]) name = each.value } # conditional resource count = var.create_db ? 1 : 0
Fonctions utiles
file("key.pub")Lire le contenu d'un fichier
join(", ", list)Joindre une liste en chaîne
lookup(map, key, default)Recherche dans une map avec valeur par défaut
length(list)Nombre d'éléments
toset(["a", "b"])Convertir une liste en ensemble (pour for_each)
try(expr, fallback)Retourner la valeur de repli si expr échoue
templatefile(path, vars)Rendre un fichier template