Dans un monde où le cloud computing est devenu la norme, gérer manuellement des infrastructures via des interfaces graphiques ou des scripts ad hoc n'est plus viable. Les équipes DevOps et les ingénieurs cloud ont besoin d'outils puissants, reproductibles et versionnables pour déployer et maintenir leurs environnements. C'est exactement là qu'intervient Terraform, l'outil d'Infrastructure as Code (IaC) open source développé par HashiCorp. Dans cet article, nous allons explorer en profondeur ce qu'est Terraform, pourquoi il est devenu un standard de l'industrie, et comment il peut transformer votre manière de gérer l'infrastructure.
Workflow Terraform en un coup d'oeil

Qu'est-ce que l'Infrastructure as Code (IaC) ?
Avant de plonger dans Terraform, il est essentiel de comprendre le concept fondamental sur lequel il repose : l'Infrastructure as Code (IaC). L'IaC est une pratique qui consiste à définir et gérer l'infrastructure informatique — serveurs, réseaux, bases de données, load balancers, etc. — à l'aide de fichiers de configuration lisibles par une machine, plutôt que par des processus manuels.
Concrètement, au lieu de cliquer dans la console AWS pour créer une instance EC2, vous écrivez un fichier de configuration qui décrit cette instance. Ce fichier peut ensuite être versionné dans Git, relu par vos collègues, testé automatiquement et appliqué de manière reproductible.
Les avantages de l'IaC
- Reproductibilité : le même code produit toujours le même résultat, quel que soit l'environnement (dev, staging, production).
- Versionnement : comme tout code, l'infrastructure peut être versionnée avec Git, permettant de suivre les changements et de revenir en arrière si nécessaire.
- Automatisation : les déploiements manuels sujets aux erreurs humaines sont remplacés par des pipelines automatisés.
- Documentation vivante : le code est la documentation de votre infrastructure. Il décrit exactement ce qui est déployé.
- Collaboration : les équipes peuvent travailler ensemble sur l'infrastructure avec les mêmes outils et workflows que pour le code applicatif (pull requests, code reviews, CI/CD).
Qu'est-ce que Terraform ?
Terraform est un outil d'IaC open source créé par HashiCorp en 2014. Il permet de définir, provisionner et gérer l'infrastructure cloud et on-premise à l'aide d'un langage de configuration déclaratif appelé HCL (HashiCorp Configuration Language).
La philosophie de Terraform est simple : vous décrivez l'état désiré de votre infrastructure dans des fichiers .tf, et Terraform se charge de calculer les actions nécessaires pour atteindre cet état, puis de les exécuter. C'est ce qu'on appelle l'approche déclarative : vous dites ce que vous voulez, pas comment l'obtenir.
Les caractéristiques clés de Terraform
- Multi-cloud : Terraform supporte des dizaines de fournisseurs cloud (AWS, Azure, GCP, OVH, DigitalOcean, etc.) ainsi que des services SaaS (Cloudflare, Datadog, GitHub, etc.).
- Déclaratif : vous décrivez l'état final souhaité, Terraform calcule le plan d'exécution.
- Idempotent : exécuter le même code plusieurs fois produit toujours le même résultat sans effets de bord.
- Planification : avant d'appliquer des changements, Terraform génère un plan détaillé que vous pouvez examiner.
- Graphe de dépendances : Terraform comprend automatiquement les dépendances entre les ressources et les crée/modifie/supprime dans le bon ordre.
- Modulaire : vous pouvez créer des modules réutilisables pour standardiser vos déploiements.
Terraform vs les autres outils d'IaC
Terraform n'est pas le seul outil d'IaC sur le marché. Voyons comment il se compare aux alternatives les plus populaires.
Terraform vs Ansible
Ansible est un outil de gestion de configuration et d'automatisation. Bien qu'il puisse provisionner de l'infrastructure, ce n'est pas son cœur de métier. Ansible excelle dans la configuration des serveurs (installer des paquets, configurer des services), tandis que Terraform excelle dans le provisionnement de l'infrastructure (créer des VMs, des réseaux, des bases de données). En pratique, les deux outils sont souvent utilisés ensemble : Terraform crée l'infrastructure, Ansible la configure.
Terraform vs CloudFormation
AWS CloudFormation est l'outil d'IaC natif d'Amazon Web Services. Il est puissant et bien intégré à l'écosystème AWS, mais il est limité à AWS. Terraform, en revanche, est multi-cloud : vous pouvez gérer AWS, Azure, GCP et des dizaines d'autres providers avec le même outil et le même langage. De plus, le langage HCL de Terraform est souvent considéré comme plus lisible et plus expressif que les templates JSON/YAML de CloudFormation.
Terraform vs Pulumi
Pulumi est un concurrent plus récent qui permet d'écrire de l'IaC avec des langages de programmation classiques (Python, TypeScript, Go, C#). L'avantage est de pouvoir utiliser la logique conditionnelle, les boucles et les structures de données de ces langages. Cependant, Terraform bénéficie d'une communauté beaucoup plus large, d'un écosystème de modules plus riche et d'une maturité éprouvée en production depuis des années.
Tableau comparatif
| Critère | Terraform | CloudFormation | Ansible | Pulumi |
|---|---|---|---|---|
| Multi-cloud | Oui | Non (AWS uniquement) | Oui | Oui |
| Langage | HCL | JSON/YAML | YAML | Python, TS, Go... |
| Approche | Déclarative | Déclarative | Impérative/Déclarative | Impérative |
| Gestion d'état | Fichier state | Géré par AWS | Sans état | Fichier state |
| Communauté | Très large | Large (AWS) | Très large | En croissance |
L'architecture de Terraform
Pour bien utiliser Terraform, il faut comprendre ses composants fondamentaux. L'architecture de Terraform repose sur plusieurs concepts clés qui interagissent ensemble.
Le Terraform Core
Le Terraform Core est le moteur principal. C'est un binaire unique écrit en Go qui lit vos fichiers de configuration, construit un graphe de dépendances des ressources, calcule le plan d'exécution et communique avec les providers pour appliquer les changements. C'est le cerveau de Terraform.
Les Providers
Les providers sont des plugins qui permettent à Terraform d'interagir avec des APIs externes. Chaque provider est responsable de comprendre les interactions avec un service spécifique. Par exemple :
- Le provider
awspermet de gérer les ressources AWS (EC2, S3, RDS, Lambda, etc.). - Le provider
azurermpermet de gérer les ressources Azure. - Le provider
googlepermet de gérer les ressources Google Cloud. - Le provider
cloudflarepermet de gérer les DNS et les règles Cloudflare.
Il existe plus de 3000 providers disponibles dans le Terraform Registry, couvrant un nombre immense de services et d'APIs.
Les Resources
Les resources sont les briques de base de Terraform. Chaque resource représente un composant d'infrastructure : une instance de serveur, un réseau virtuel, un enregistrement DNS, un bucket de stockage, etc. Voici un exemple de resource AWS :
resource "aws_instance" "web_server" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
tags = {
Name = "WebServer"
Environment = "production"
}
}Dans cet exemple, aws_instance est le type de resource (une instance EC2), et web_server est le nom logique que nous lui donnons dans notre configuration.
Le State (état)
Le state est un fichier JSON (par défaut terraform.tfstate) qui enregistre l'état actuel de votre infrastructure telle que Terraform la connaît. C'est grâce à ce fichier que Terraform peut déterminer les différences entre l'état désiré (votre code) et l'état réel (ce qui existe dans le cloud), et calculer les changements à appliquer.
Le state est un composant critique. En équipe, il doit être stocké dans un backend distant (S3, Azure Blob Storage, Terraform Cloud, etc.) pour éviter les conflits et permettre la collaboration.
Le Plan d'exécution
Avant d'appliquer des changements, Terraform génère un plan d'exécution qui montre exactement ce qui va être créé, modifié ou supprimé. C'est une fonctionnalité de sécurité essentielle qui vous permet de valider les changements avant de les appliquer.
Cas d'usage concrets de Terraform
Terraform est utilisé dans de nombreux scénarios en entreprise. Voici les cas d'usage les plus courants.
Provisionnement d'infrastructure cloud
Le cas d'usage le plus évident : créer et gérer des ressources cloud. Avec Terraform, vous pouvez déployer des architectures complètes incluant des réseaux (VPC, sous-réseaux, groupes de sécurité), des serveurs (instances EC2, Azure VMs), des bases de données (RDS, Cloud SQL), des services de stockage (S3, Blob Storage) et bien plus encore.
Gestion multi-cloud
De plus en plus d'entreprises adoptent une stratégie multi-cloud pour éviter le vendor lock-in. Terraform est l'outil idéal pour cela, car il permet de gérer AWS, Azure et GCP avec le même langage et les mêmes workflows. Vous pouvez même créer des modules qui abstraient les différences entre les providers.
Environnements éphémères
Terraform est parfait pour créer des environnements temporaires de test ou de développement. Un développeur peut lancer terraform apply pour créer un environnement complet, faire ses tests, puis terraform destroy pour tout supprimer et arrêter les coûts.
Déploiement d'applications Kubernetes
Terraform peut provisionner des clusters Kubernetes (EKS, AKS, GKE) et même déployer des ressources Kubernetes (namespaces, deployments, services) grâce au provider kubernetes. Cela permet d'avoir une seule source de vérité pour l'ensemble de votre stack.
Gestion des services SaaS
Au-delà du cloud, Terraform permet de gérer des services SaaS comme GitHub (repositories, teams, webhooks), Cloudflare (DNS, règles de firewall), Datadog (monitors, dashboards), PagerDuty (services, escalation policies), et bien d'autres.
Le workflow de base de Terraform
Le workflow standard de Terraform suit quatre étapes principales. Comprendre ce cycle est fondamental pour travailler efficacement avec l'outil.
1. terraform init
La commande terraform init initialise le répertoire de travail. Elle télécharge les providers nécessaires, configure le backend de state et prépare l'environnement. C'est toujours la première commande à exécuter dans un nouveau projet Terraform ou après avoir ajouté un nouveau provider.
$ terraform init
Initializing the backend...
Initializing provider plugins...
- Finding hashicorp/aws versions matching "~> 5.0"...
- Installing hashicorp/aws v5.31.0...
- Installed hashicorp/aws v5.31.0 (signed by HashiCorp)
Terraform has been successfully initialized!2. terraform plan
La commande terraform plan compare l'état désiré (votre code) avec l'état actuel (le fichier state) et affiche les changements qui seront effectués. Aucune modification n'est appliquée à ce stade — c'est un mode lecture seule.
$ terraform plan
Terraform will perform the following actions:
# aws_instance.web_server will be created
+ resource "aws_instance" "web_server" {
+ ami = "ami-0c55b159cbfafe1f0"
+ instance_type = "t2.micro"
+ tags = {
+ "Name" = "WebServer"
+ "Environment" = "production"
}
}
Plan: 1 to add, 0 to change, 0 to destroy.3. terraform apply
La commande terraform apply applique effectivement les changements. Par défaut, elle affiche d'abord le plan et demande une confirmation avant de procéder. Vous pouvez passer l'option -auto-approve pour sauter la confirmation (utile en CI/CD, mais à utiliser avec précaution).
$ terraform apply
# ... affiche le plan ...
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
aws_instance.web_server: Creating...
aws_instance.web_server: Still creating... [10s elapsed]
aws_instance.web_server: Creation complete after 35s [id=i-0abc123def456789]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.4. terraform destroy
La commande terraform destroy supprime toutes les ressources gérées par Terraform dans le répertoire courant. Comme apply, elle affiche un plan de destruction et demande confirmation avant de procéder.
$ terraform destroy
# ... affiche le plan de destruction ...
Do you want to destroy all resources?
Enter a value: yes
aws_instance.web_server: Destroying... [id=i-0abc123def456789]
aws_instance.web_server: Destruction complete after 30s
Destroy complete! Resources: 1 destroyed.Exemple concret : votre premier projet Terraform
Mettons tout cela en pratique avec un exemple concret. Nous allons créer un fichier main.tf qui déploie une instance EC2 sur AWS avec un groupe de sécurité autorisant le trafic HTTP.
# Configuration du provider AWS
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
required_version = ">= 1.0"
}
provider "aws" {
region = "eu-west-3" # Paris
}
# Groupe de sécurité autorisant HTTP et SSH
resource "aws_security_group" "web_sg" {
name = "web-server-sg"
description = "Autoriser le trafic HTTP et SSH"
ingress {
description = "HTTP"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
description = "SSH"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "web-server-sg"
}
}
# Instance EC2
resource "aws_instance" "web_server" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.web_sg.id]
user_data = <<-EOF
#!/bin/bash
sudo apt update -y
sudo apt install -y nginx
sudo systemctl start nginx
echo "<h1>Deploye avec Terraform!</h1>" | sudo tee /var/www/html/index.html
EOF
tags = {
Name = "WebServer"
Environment = "dev"
ManagedBy = "Terraform"
}
}
# Afficher l'IP publique après le déploiement
output "public_ip" {
description = "L'adresse IP publique du serveur web"
value = aws_instance.web_server.public_ip
}Cet exemple illustre plusieurs concepts clés : la configuration du provider, la définition de ressources avec des dépendances (le groupe de sécurité est référencé dans l'instance), l'utilisation de user_data pour configurer le serveur au démarrage, et les output pour afficher des informations utiles après le déploiement.
Bonnes pratiques pour démarrer avec Terraform
Avant de conclure, voici quelques bonnes pratiques essentielles pour bien commencer avec Terraform :
Organisez vos fichiers
Séparez votre configuration en plusieurs fichiers logiques plutôt qu'un seul fichier monolithique :
main.tf: les ressources principalesvariables.tf: les déclarations de variablesoutputs.tf: les valeurs de sortieproviders.tf: la configuration des providersterraform.tfvars: les valeurs des variables (à ne pas commiter si elles contiennent des secrets)
Utilisez un backend distant pour le state
Ne conservez jamais votre fichier de state en local en production. Utilisez un backend distant comme S3 avec DynamoDB pour le verrouillage, Terraform Cloud, ou Azure Blob Storage. Cela permet la collaboration et protège contre la perte de données.
Versionnez vos providers
Spécifiez toujours les versions de vos providers avec des contraintes de version. Cela évite les surprises lors des mises à jour et garantit la reproductibilité de vos déploiements.
Utilisez des modules
Dès que vous identifiez des patterns répétitifs dans votre code, encapsulez-les dans des modules réutilisables. Le Terraform Registry propose des milliers de modules communautaires prêts à l'emploi.
Ajoutez le fichier .gitignore adapté
Veillez à exclure les fichiers sensibles de votre dépôt Git :
# Fichier .gitignore pour Terraform
*.tfstate
*.tfstate.*
.terraform/
*.tfvars
crash.logConclusion
Terraform est un outil incontournable pour quiconque travaille avec l'infrastructure cloud moderne. Sa capacité à gérer des environnements multi-cloud avec un langage déclaratif simple, son écosystème riche de providers et de modules, et son workflow clair (init, plan, apply, destroy) en font un choix de premier ordre pour l'Infrastructure as Code.
Que vous soyez développeur, administrateur système ou ingénieur DevOps, maîtriser Terraform est un investissement qui paiera rapidement. La courbe d'apprentissage est raisonnable, et les bénéfices en termes de reproductibilité, d'automatisation et de collaboration sont immenses.
Dans le prochain article de cette série, nous verrons comment installer et configurer Terraform sur Linux, macOS et Windows pour que vous puissiez commencer à pratiquer immédiatement. Restez connectés !
Cet article fait partie d'une série dédiée à Terraform. Suivez CodeClan pour ne manquer aucun épisode et progresser dans votre maîtrise de l'Infrastructure as Code.