Terraform : définition, fonctionnement et exemple HCL
L'outil d'Infrastructure as Code de HashiCorp qui crée et fait évoluer des ressources Cloud à partir de fichiers HCL : providers, fichier d'état, plan et apply, exemple, licence BSL et fork OpenTofu.
Par Équipe Blent· Mis à jour le · 13 min de lecture· Niveau intermédiaire
Terraform en bref
- Type
- Outil d'Infrastructure as Code
- Éditeur
- HashiCorp, filiale d'IBM depuis 2025
- Lancement
- 2014 (version 1.0 en 2021)
- Langage de description
- HCL, déclaratif
- Licence
- BSL 1.1 depuis la version 1.6
- Écrit en
- Go
- Fork open source
- OpenTofu
Définition : Terraform
Terraform est un outil d'Infrastructure as Code créé par HashiCorp, qui permet de décrire des ressources Cloud (réseaux, machines, bases de données, clusters, droits d'accès) dans des fichiers écrits en HCL, un langage déclaratif. Un moteur compare ce code à un fichier d'état et aux ressources réelles, affiche un plan des changements prévus, puis appelle les API des fournisseurs par l'intermédiaire de plugins appelés providers. Le même outil et le même workflow couvrent AWS, Google Cloud, Azure, Kubernetes ou GitHub. Publié en 2014, Terraform est devenu la référence du provisionnement multi-cloud.
En une phrase : Terraform décrit votre infrastructure dans des fichiers HCL, calcule un plan des changements, puis les applique sur n'importe quel fournisseur Cloud via ses providers.
Dans cette définition
Qu'est-ce que Terraform ?
Terraform est l'outil le plus répandu pour appliquer l'Infrastructure as Code au Cloud. On y décrit dans des fichiers l'infrastructure souhaitée, et l'outil se charge de la créer, de la modifier ou de la supprimer en appelant les API des fournisseurs.
Il se distingue par son approche déclarative et son modèle de plugins. Le langage HCL (HashiCorp Configuration Language) exprime le résultat attendu, jamais la suite d'opérations. Les providers, des plugins distribués par un registre public, traduisent ces descriptions en appels d'API pour AWS, Azure, Google Cloud, Kubernetes et de nombreux services. Terraform n'est donc pas lié à un fournisseur, ce qui explique son adoption en entreprise.
Créé par Mitchell Hashimoto et publié par HashiCorp en 2014, Terraform a atteint la version 1.0 en 2021. En août 2023, HashiCorp a remplacé sa licence open source par la Business Source License, ce qui a conduit la communauté à créer le fork OpenTofu. HashiCorp a ensuite été rachetée par IBM, opération finalisée en 2025. Le code de Terraform s'intègre naturellement dans une démarche DevOps et dans les pipelines CI/CD.
À retenir : Terraform ne configure pas des serveurs, il provisionne des ressources. Il crée le réseau, la machine ou la base ; installer et configurer le logiciel dessus relève plutôt d'un outil comme Ansible.
Sous le capot : providers, état et graphe de dépendances
Les providers
Un provider est un binaire séparé du moteur, téléchargé à l'initialisation. Il déclare les types de ressources qu'il gère (par exemple aws_s3_bucket) et sait les créer, lire, modifier et supprimer. La version du provider se verrouille dans le fichier .terraform.lock.hcl, à versionner dans Git pour que toute l'équipe utilise les mêmes.
Le fichier d'état
Terraform conserve un fichier d'état qui associe chaque ressource du code à son identifiant réel. C'est grâce à lui qu'il sait ce qu'il doit créer, modifier ou détruire. Ce fichier peut contenir des valeurs sensibles : il se stocke dans un backend distant, chiffré et verrouillé pendant chaque exécution, jamais dans Git.
Le graphe de dépendances
Quand une ressource en référence une autre, par exemple l'identifiant d'un réseau utilisé par une machine, Terraform en déduit un ordre de création. Il construit un graphe de dépendances, puis parallélise tout ce qui est indépendant.
Exemple : un bucket versionné avec Terraform
Voici une configuration minimale qui crée un bucket S3 versionné sur AWS, paramétré par une variable, avec un état distant partagé.
terraform {
required_version = ">= 1.6"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
# État partagé et verrouillé pour toute l'équipe
backend "s3" {
bucket = "acme-terraform-state"
key = "production/donnees.tfstate"
region = "eu-west-3"
}
}
provider "aws" {
region = "eu-west-3"
}
variable "environnement" {
type = string
default = "production"
}
resource "aws_s3_bucket" "donnees" {
bucket = "acme-${var.environnement}-donnees"
}
resource "aws_s3_bucket_versioning" "donnees" {
bucket = aws_s3_bucket.donnees.id
versioning_configuration {
status = "Enabled"
}
}
output "nom_du_bucket" {
value = aws_s3_bucket.donnees.bucket
}
Le cycle d'exécution tient en quelques commandes :
terraform init # télécharge le provider et configure le backend
terraform fmt -check # vérifie le format du code
terraform validate # vérifie la cohérence de la configuration
terraform plan -out=plan.tfplan # affiche et enregistre les changements prévus
terraform apply plan.tfplan # applique exactement le plan relu
Le code ne dit jamais « crée » : il décrit le résultat. La ressource de versionnement référence le bucket par aws_s3_bucket.donnees.id, ce qui crée une dépendance et impose l'ordre de création. Relancer terraform plan sans changement n'annonce rien à faire ; si quelqu'un désactive le versionnement à la main, le plan suivant le détecte et propose de le réactiver.
Les principaux cas d'usage de Terraform
Terraform sert dès qu'une ressource Cloud doit être créée de façon répétable, relue et auditée.
Socle Cloud
Déployer comptes, réseaux, droits et règles de sécurité communs à toutes les équipes.
Environnements multiples
Créer développement, préproduction et production à partir du même code et de variables distinctes.
Clusters Kubernetes
Provisionner un cluster managé et ses dépendances de réseau, de stockage et d'identité.
Environnements éphémères
Monter un environnement complet pour tester une branche, puis le détruire.
Multi-cloud
Piloter AWS, Azure, Google Cloud et des services SaaS avec un seul langage.
Migration et reprise
Reconstruire une infrastructure dans une autre région ou importer des ressources existantes.
Quels sont les avantages de Terraform ?
Terraform doit son succès à un langage lisible, à un écosystème très large et à un workflow prévisible.
- Un seul workflow et un seul langage pour des centaines de fournisseurs, publics ou privés.
- Un plan d'exécution relisible avant toute modification de l'infrastructure.
- Un langage déclaratif, plus lisible qu'un script pour décrire un état cible.
- Une très large communauté, avec de nombreux providers et modules partagés.
- Un graphe de dépendances qui ordonne et parallélise automatiquement les opérations.
- Une intégration naturelle dans les pipelines CI/CD et les revues de code.
Quelles sont les limites de Terraform ?
Terraform n'est pas une garantie automatique de bonne infrastructure : l'outil exécute fidèlement le code, y compris ses erreurs.
- Un fichier d'état sensible, à partager, verrouiller, sauvegarder et protéger.
- Une licence BSL qui n'est plus open source, avec des restrictions pour certains usages commerciaux.
- Une dérive possible dès que des ressources sont modifiées à la main dans la console.
- Un HCL limité pour la logique complexe, malgré les boucles et les expressions conditionnelles.
- Des erreurs à fort impact : une suppression mal relue dans un plan peut toucher la production.
- Une dépendance aux providers, dont la couverture des nouveautés suit celle des API.
Terraform vs OpenTofu vs Pulumi : quelles différences ?
Ces trois outils répondent au même besoin de provisionnement, avec des choix différents de licence et de langage.
| Critère | Terraform | OpenTofu | Pulumi |
|---|---|---|---|
| Éditeur ou gouvernance | HashiCorp (IBM) | Linux Foundation, communauté | Pulumi |
| Licence | BSL 1.1 | Open source (MPL 2.0) | Apache 2.0 pour le moteur |
| Langage | HCL | HCL | TypeScript, Python, Go, C#, Java |
| Providers | Registre Terraform | Compatibles, registre OpenTofu | Providers Pulumi, dont des ponts vers Terraform |
| Fichier d'état | Backend au choix | Backend au choix, chiffrement natif | Service managé ou backend au choix |
| Écosystème | Le plus large | Hérité de Terraform, en croissance | Plus restreint, orienté développeurs |
OpenTofu a été annoncé en septembre 2023, puis publié en version stable début 2024. Pour un projet existant, la migration est le plus souvent simple, car le langage et les providers sont communs, mais les deux outils divergent peu à peu sur les nouvelles fonctionnalités.
Ce n'est pas un choix binaire. Le choix dépend moins de la technique que de la licence et des compétences : HCL pour les équipes d'exploitation, langage généraliste pour les équipes de développement.
Bonnes pratiques pour un projet Terraform en équipe
Pour passer d'un premier essai à un usage en équipe, quelques règles évitent la plupart des incidents :
- État distant : un backend partagé, verrouillé et chiffré, avec un état séparé par environnement.
- Modules : factoriser les blocs répétés, avec des versions explicites.
- Pipeline : exécuter
plandans la pull request,applyseulement après fusion, dans un pipeline CI/CD aux droits limités. - Contrôles : formater, valider, analyser avec Checkov ou Trivy, puis tester l'infrastructure.
- Dérive : lancer un plan planifié pour détecter les modifications manuelles, et limiter les droits d'écriture dans la console.
Pour aller plus loin, une approche GitOps applique le même principe : Git reste l'unique source de vérité, et l'application est automatique. Les ressources Cloud peuvent aussi se piloter depuis un cluster avec Crossplane.
Quand utiliser Terraform ?
Terraform convient bien au provisionnement de ressources Cloud. Il est moins adapté à la configuration fine de systèmes ou à des besoins très dynamiques.
Le besoin relève du provisionnement
- Vous créez des ressources Cloud qui doivent être reproductibles.
- Vous travaillez sur plusieurs fournisseurs ou plusieurs comptes.
- Vous voulez relire un plan avant chaque changement.
- Votre équipe a besoin d'une communauté et de modules éprouvés.
Un autre outil sera plus adapté
- Vous configurez surtout des serveurs existants, ce que fait mieux Ansible.
- Vous préférez écrire l'infrastructure dans un langage généraliste.
- Vous voulez piloter les ressources Cloud depuis Kubernetes.
- La licence BSL est incompatible avec votre usage ou votre politique open source.
Technologies et outils associés à Terraform
Autour du moteur, un écosystème d'outils couvre l'orchestration, les tests, la sécurité et l'automatisation.
- Fork open source
OpenTofu
Fork de Terraform hébergé par la Linux Foundation, resté sous licence open source et compatible avec HCL.
- Alternative
Pulumi
IaC écrite en langages généralistes : TypeScript, Python, Go, C# ou Java.
- Orchestration
Terragrunt
Surcouche de Gruntwork qui factorise la configuration et enchaîne plusieurs modules Terraform.
- Tests
Terratest
Bibliothèque Go pour tester du code d'infrastructure en déployant de vraies ressources.
- Sécurité
Checkov
Analyse statique du code Terraform pour détecter les configurations à risque.
- Automatisation
Atlantis
Serveur qui exécute plan et apply depuis les pull requests.
- Configuration
Ansible
Configuration des machines créées par Terraform, via des playbooks YAML.
- Alternative Kubernetes
Crossplane
Ressources Cloud gérées comme des objets Kubernetes et réconciliées en continu.
Les concepts à connaître autour de Terraform
Ces notions reviennent dans tout projet Terraform et dans les pratiques qui s'appuient dessus.
- Infrastructure as CodeLa pratique qui consiste à décrire l'infrastructure dans des fichiers versionnés.
- ProviderLe plugin qui traduit les ressources du code en appels à l'API d'un fournisseur.
- Fichier d'étatLa correspondance entre les ressources décrites et les ressources réelles.
- ModuleLe bloc de configuration réutilisable qui regroupe des ressources liées.
- GitOpsL'application continue du code d'infrastructure à partir de Git.
- CI/CDLa chaîne qui valide, planifie et applique les changements d'infrastructure.
Ressources pour approfondir Terraform
Trois articles du blog Blent pour écrire, tester et comparer son infrastructure en code.
- Tutoriel
Terraform : automatiser son infrastructure Cloud
Providers, ressources, état et modules : les bases de l'outil pas à pas.
Lire l'article - Guide
Terratest : tester son infrastructure
Écrire des tests automatisés qui déploient, vérifient puis détruisent l'infrastructure.
Lire l'article - Comparatif
Crossplane : infrastructure-as-code piloté depuis Kubernetes
Une approche alternative qui réconcilie les ressources Cloud depuis un cluster.
Lire l'article
Questions fréquentes
Questions fréquentes
Expertise
À propos de l'auteur
Équipe Blent
Les ingénieurs et mentors Blent conçoivent, automatisent et mettent en production des infrastructures Cloud, et forment chaque année des centaines de professionnels au Cloud et au DevOps.
Sources et méthodologie
- Documentation officielle de Terraform, HashiCorp
- Annonce du changement de licence de HashiCorp vers la BSL 1.1, août 2023
- Documentation officielle d'OpenTofu, Linux Foundation
- Retours d'expérience des projets et formations Blent
Comment fonctionne Terraform ?
Un projet Terraform suit toujours le même cycle, quel que soit le fournisseur Cloud visé.
Écrire la configuration
L'ingénieur décrit dans des fichiers .tf les providers, les ressources, les variables et les sorties. Les blocs réutilisables sont regroupés en modules.
Initialiser le projet
La commande terraform init télécharge les providers et les modules nécessaires et configure le backend où sera stocké le fichier d'état.
Planifier les changements
La commande terraform plan compare le code, l'état enregistré et les ressources réelles, puis liste les créations, modifications et suppressions prévues.
Appliquer le plan
La commande terraform apply appelle les API des fournisseurs dans l'ordre des dépendances, calculé à partir du graphe des ressources.
Enregistrer l'état
Terraform met à jour le fichier d'état, qui associe chaque ressource du code à son identifiant réel chez le fournisseur, pour préparer le plan suivant.