Terraform est l'outil d'Infrastructure as Code (IaC) le plus populaire du marché. Il vous permet de définir votre infrastructure cloud (VPS, bases de données, DNS, load balancers) dans des fichiers de configuration versionnés, reproductibles et auditables.
Pourquoi Terraform ?
Créer un serveur via l'interface web d'OVH ou AWS prend du temps, n'est pas reproductible, et toute modification manuelle peut créer une dérive entre l'état réel et la documentation. Avec terraform, votre infrastructure est du code dans git : versionné, reviewé, automatisé, et identique entre staging et production.
Concepts fondamentaux
Provider : plugin qui interagit avec une plateforme cloud (AWS, GCP, OVH, Cloudflare, etc.).
Resource : unité d'infrastructure (serveur, base de données, enregistrement DNS).
State : fichier terraform.tfstate qui mappe les ressources déclarées aux ressources réelles créées.
Plan : prévisualisation des changements à appliquer (terraform plan).
Premier projet Terraform : VPS OVH
# main.tf
terraform {
required_providers {
ovh = { source = "ovh/ovh", version = "~> 0.36" }
}
}
provider "ovh" {
endpoint = "ovh-eu"
}
resource "ovh_cloud_project_instance" "web_server" {
service_name = var.project_id
name = "web-production"
flavor_name = "b2-7"
image_name = "Ubuntu 22.04"
region = "GRA9"
network {
public = true
}
user_data = file("cloud-init.yaml")
}
resource "ovh_domain_zone_record" "www" {
zone = "monsite.fr"
fieldtype = "A"
subdomain = "www"
ttl = 3600
target = ovh_cloud_project_instance.web_server.public_ip
}
output "server_ip" {
value = ovh_cloud_project_instance.web_server.public_ip
}
Variables et modules
# variables.tf
variable "project_id" {
type = string
description = "OVH Project ID"
}
variable "environment" {
type = string
default = "production"
}
# Utiliser un module réutilisable
module "database" {
source = "./modules/mysql"
db_name = "mon_app"
environment = var.environment
}
Workflow Terraform
terraform init # Télécharger les providers
terraform plan # Prévisualiser les changements
terraform apply # Appliquer les changements
terraform destroy # Supprimer toutes les ressources
terraform output # Afficher les outputs
Remote State : collaboration en équipe
En équipe, le state terraform doit être partagé et verrouillé :
terraform {
backend "s3" {
bucket = "terraform-state-mon-projet"
key = "production/terraform.tfstate"
region = "eu-west-3"
dynamodb_table = "terraform-locks"
encrypt = true
}
}
Intégration CI/CD
Dans GitHub Actions, terraform peut provisionner automatiquement l'infrastructure sur chaque merge dans main. Atlantis est une solution open source dédiée aux workflows terraform en équipe avec des approbations de PR.
La documentation Terraform couvre tous les providers et fonctionnalités avancées comme les workspaces et les imports.
Conclusion
Terraform transforme la gestion d'infrastructure en pratique d'ingénierie logicielle : versioning, review, tests et automatisation. Pour tout projet dépassant un serveur unique, investir dans Terraform est la décision la plus sage pour la maintenabilité long terme.
Pour une utilisation professionnelle, organisez votre code Terraform en modules réutilisables versionnés dans des dépôts séparés. Adoptez Terraform Cloud ou Atlantis pour les workflows d'équipe avec plan automatique sur les Pull Requests et apply après approbation. La gestion du state est critique : utilisez toujours un backend distant (S3 + DynamoDB) avec locking pour éviter les conflits concurrents. Les outils tfsec et Checkov scannent votre infrastructure pour les mauvaises configurations de sécurité avant le déploiement. La documentation Terraform est exhaustive, et la certification HashiCorp Terraform Associate valide vos compétences d'Infrastructure as Code auprès des recruteurs et des clients.
Gestion des environnements
Structurez vos configurations Terraform par environnement (dev, staging, production) avec des workspaces ou des répertoires séparés partageant les mêmes modules. Les variables d'environnement (terraform.tfvars ou variables d'environnement TFVAR*) permettent de configurer chaque environnement sans dupliquer le code d'infrastructure. La promotion du code d'infrastructure suit le même processus que le code applicatif : Pull Request, review, merge.
Import de ressources existantes
Si vous avez une infrastructure existante créée manuellement, Terraform peut la prendre en charge avec terraform import RESOURCE_TYPE.NAME ID. Depuis Terraform 1.5, le bloc import {} déclaratif permet d'importer plusieurs ressources dans le code de configuration. Cette fonctionnalité est précieuse pour migrer progressivement vers l'IaC sans repartir de zéro. Générez automatiquement le code Terraform avec terraform plan -generate-config-out=generated.tf après l'import.