Terraform
Vue d'ensemble
Terraform est un outil open-source d'Infrastructure as Code (IaC) développé par HashiCorp qui permet de définir et provisionner l'infrastructure cloud de manière déclarative.
Philosophie
"Infrastructure as Code - Construire, changer et versionner l'infrastructure de manière sûre et efficace."
Avantages clés
Infrastructure as Code
- Déclaratif : Décrivez l'état désiré, Terraform s'occupe du reste
- Versionnable : Infrastructure dans Git avec historique complet
- Reproductible : Environnements identiques partout
- Collaborative : Équipes multiples sur même infrastructure
Multi-cloud natif
- Providers : 3000+ providers pour tous les clouds
- Abstraction : Syntaxe unifiée pour tous les fournisseurs
- Hybrid : Mélange AWS, Azure, GCP, on-premise
- Portabilité : Migration facilitée entre clouds
État et planification
- State management : Suivi précis des ressources
- Plan/Apply : Prévisualisation avant changements
- Graph de dépendances : Ordre optimal des opérations
- Rollback : Retour arrière sécurisé
Architecture
Composants principaux
- Configuration : Fichiers .tf définissant l'infrastructure
- State : Représentation actuelle des ressources
- Providers : Plugins pour chaque plateforme
- Modules : Composants réutilisables
Workflow typique
# 1. Initialisation
terraform init
# 2. Planification
terraform plan
# 3. Application
terraform apply
# 4. Destruction (si nécessaire)
terraform destroy
Exemple de configuration
Infrastructure basique AWS
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = var.aws_region
}
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
tags = {
Name = "main-vpc"
Environment = var.environment
}
}
resource "aws_subnet" "public" {
count = length(var.availability_zones)
vpc_id = aws_vpc.main.id
cidr_block = "10.0.${count.index + 1}.0/24"
availability_zone = var.availability_zones[count.index]
map_public_ip_on_launch = true
tags = {
Name = "public-subnet-${count.index + 1}"
Type = "public"
}
}
Intégration avec autres outils
HashiCorp Stack
- Nomad : Déploiement applications post-infrastructure
- Vault : Gestion secrets pour Terraform
- Consul : Service discovery et state backend
CI/CD Integration
- GitLab CI : Pipelines automatisés
- GitHub Actions : Workflows GitOps
- Jenkins : Intégration legacy
Cas d'usage typiques
Idéal pour
- Infrastructure complète : VPCs, réseaux, sécurité
- Multi-environnements : Dev, staging, production
- Compliance : Governance et policies
- Disaster recovery : Reconstruction rapide
Modules populaires
- Networking : VPC, subnets, routing
- Compute : EC2, Auto Scaling, Load Balancers
- Security : IAM, Security Groups, WAF
- Databases : RDS, DynamoDB, caches
Bonnes pratiques
Structure projet
terraform/
├── environments/
│ ├── dev/
│ ├── staging/
│ └── prod/
├── modules/
│ ├── networking/
│ ├── compute/
│ └── database/
└── shared/
├── variables.tf
└── outputs.tf
État distant
- S3 + DynamoDB : Backend AWS sécurisé
- Terraform Cloud : SaaS HashiCorp
- GitLab Terraform State : Intégré GitLab
Ressources
- Documentation : terraform.io
- Registry : registry.terraform.io
- Learn : learn.hashicorp.com/terraform