1. Pourquoi concevoir des modules Terraform ?

Dans une organisation d’envergure, copier-coller des blocs de configuration entre le projet de Genève et le projet de Lausanne viole le principe DRY (Don’t Repeat Yourself). Un module Terraform est un conteneur logique regroupant des ressources interdépendantes, configurable via des variables d’entrée et exposant des résultats via des sorties.

2. Architecture standardisée d’un module réutilisable

modules/reseau_vpc/
├── main.tf        # Déclaration des ressources (VPC, Subnets, Gateways)
├── variables.tf   # Paramètres d'entrée requis et optionnels avec typage strict
├── outputs.tf     # Valeurs exposées au reste de l'infrastructure
└── versions.tf    # Versions minimales des providers supportés

3. Typage strict et validation avancée des variables

Sécurisez l’utilisation de vos modules grâce aux blocs de validation personnalisés intégrés dans variables.tf :

# Fichier : variables.tf
variable "cidr_block" {
  type        = string
  description = "Plage CIDR principale du VPC"
  default     = "10.0.0.0/16"

  validation {
    condition     = can(cidrnetmask(var.cidr_block))
    error_message = "La valeur renseignée doit être un bloc CIDR IPv4 valide (ex: 10.0.0.0/16)."
  }
}

variable "environment" {
  type        = string
  description = "Nom de l'environnement de déploiement"

  validation {
    condition     = contains(["dev", "staging", "prod"], var.environment)
    error_message = "L'environnement doit être strictement égal à 'dev', 'staging' ou 'prod'."
  }
}

4. Consommation du module dans un projet d’infrastructure

# Fichier : dev/main.tf
module "mon_reseau_dev" {
  source      = "../modules/reseau_vpc"
  cidr_block  = "10.10.0.0/16"
  environment = "dev"
}

# Récupération de l'identifiant via les outputs du module
resource "aws_security_group" "sg_app" {
  name   = "sg-dev-app"
  vpc_id = module.mon_reseau_dev.vpc_id
}

Terraform Workspaces : Les espaces de travail (workspaces) permettent d’instancier un même code HCL pour plusieurs contextes avec des états séparés (ex: terraform workspace new dev puis terraform workspace select prod).