Skip to content

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