Passer au contenu principal

Organisation (Terraform)

Import et refactoring

Adopter Terraform sur une infrastructure existante ou refactoriser un projet qui a grandi de façon organique sont deux situations courantes. Sans les bons outils, ces opérations se soldent par des destroy/recreate non voulus. Terraform fournit des mécanismes précis pour gérer ces transitions sans coupure.

Import de ressources existantes

Deux méthodes selon la version de Terraform :

Méthode moderne (Terraform 1.5+) : import block

# Définir la ressource dans le code
resource "aws_vpc" "main" {
  # Les attributs seront remplis par terraform plan -generate-config-out
}

# Déclarer l'import
import {
  to = aws_vpc.main
  id = "vpc-0a1b2c3d4e5f"
}
# Générer la configuration depuis la ressource existante
terraform plan -generate-config-out=generated.tf

# Vérifier le plan (doit afficher 0 changements si la config est complète)
terraform plan

# Appliquer l'import
terraform apply

Méthode classique : terraform import

terraform import aws_vpc.main vpc-0a1b2c3d4e5f
terraform import aws_instance.web i-0123456789abcdef0
terraform import aws_s3_bucket.logs mon-bucket-logs

L'ID à passer dépend du provider et du type de ressource. Consulter la documentation du provider pour chaque ressource.

Moved blocks : refactoring sans destruction

Renommer une ressource ou la déplacer dans un module sans la recréer :

# Cas 1 : renommage simple
moved {
  from = aws_instance.web
  to   = aws_instance.web_server
}

# Cas 2 : passage à for_each
moved {
  from = aws_instance.web
  to   = aws_instance.web["web1"]
}

# Cas 3 : déplacement dans un module
moved {
  from = aws_instance.web
  to   = module.web_servers.aws_instance.this["web1"]
}
terraform plan    # doit afficher 0 destroy
terraform apply
# Supprimer le bloc moved après vérification

terraform state mv : manipulation directe

# Renommer une ressource dans le state (sans moved block)
terraform state mv aws_instance.web aws_instance.web_server

# Déplacer une ressource dans un module
terraform state mv aws_instance.web module.web.aws_instance.this

# Déplacer entre states (deux projets)
terraform state mv -state-out=../autre-projet/terraform.tfstate   aws_instance.legacy aws_instance.legacy

Remplacer une ressource

# Forcer la recréation d'une ressource spécifique
terraform apply -replace=aws_instance.web

Utile quand une instance est dans un état inconsistant ou qu'une modification d'AMI nécessite une recréation que Terraform ne détecte pas automatiquement.

Taint (déprécié) vs replace

terraform taint marquait une ressource pour recréation au prochain apply. Remplacé par terraform apply -replace depuis Terraform 0.15.2. Ne plus utiliser taint.