infra / terraform
Import de ressources existantes
Explication
Ce que vous allez apprendre
- Comprendre pourquoi importer une ressource plutôt que la recréer
- Utiliser
terraform importpuis vérifier la cohérence avecterraform plan - Préférer le bloc déclaratif
import(Terraform 1.5+) à la commande CLI historique - Générer un squelette de configuration HCL automatiquement depuis une ressource existante
- Anticiper les limites de l'import sur une infrastructure existante volumineuse
Dans quel contexte ?
Un bucket S3 a été créé manuellement dans la console AWS il y a plusieurs mois, avant même que l'équipe n'adopte Terraform (leçons précédentes). Il contient des données de production critiques qu'il est hors de question de recréer. L'équipe veut désormais que Terraform "prenne le relais" de la gestion de ce bucket, sans jamais y toucher physiquement.
D'abord, il faut comprendre ce que l'import fait réellement
Importer une ressource associe un ID réel du cloud à un bloc resource déjà écrit dans le code, en modifiant uniquement le STATE — jamais la ressource elle-même. Rien n'est recréé, rien n'est modifié dans le cloud : seule la "mémoire" de Terraform change pour refléter que cette ressource est désormais sous sa gestion.
C'est une nuance essentielle par rapport à un apply classique : l'import est une opération purement locale au state, sans le moindre appel de création ou de modification vers l'API cloud.
| Étape | Action | Risque si sautée |
|---|---|---|
1. Écrire le bloc resource | Décrire la ressource dans le code | Terraform ne sait pas où associer l'import |
2. Importer (CLI ou bloc import) | Associer l'ID réel au bloc | Sans ça, le state ignore la ressource |
3. Vérifier avec terraform plan | Confirmer l'absence de diff | Une config incomplète recréerait la ressource au prochain apply |
Prérequis
Une bonne compréhension du state Terraform (voir la leçon dédiée) est indispensable : l'import ne fait rien d'autre que manipuler ce fichier, de façon plus sûre qu'un terraform state push manuel.
Une fois l'import effectué, une étape ne doit JAMAIS être sautée
Piège fréquent
Après un import, si terraform plan affiche un diff, cela signifie que le bloc resource écrit dans le code ne décrit pas EXACTEMENT la ressource réelle. Au prochain apply, Terraform tenterait de "corriger" cet écart — ce qui peut aller jusqu'à recréer la ressource dans le pire des cas. Un plan sans diff après import est la seule confirmation fiable que tout est cohérent.
Maintenant, une amélioration notable depuis Terraform 1.5 : le bloc import déclaratif
Plutôt que de lancer une commande CLI séparée (facile à oublier, à mal cibler), le bloc import s'écrit directement dans un fichier .tf et s'exécute comme une étape normale du plan/apply, avec une visibilité complète AVANT toute application — bien plus sûr que la commande historique.
Astuce
terraform plan -generate-config-out=generated.tf va encore plus loin : il génère automatiquement une proposition de bloc resource correspondant à la ressource importée, évitant de deviner manuellement chaque attribut. Ce fichier généré doit toujours être relu et ajusté avant d'être utilisé tel quel — il s'agit d'un point de départ, pas d'un résultat final fiable à 100%.
Le piège à connaître avant de continuer
Importer une infrastructure existante volumineuse, ressource par ressource, devient vite un travail considérable si fait entièrement à la main. Des outils tiers comme terraformer peuvent accélérer ce travail en masse, mais nécessitent toujours une relecture attentive du résultat généré.
Maintenant que l'import de ressources isolées est maîtrisé, la prochaine leçon aborde un sujet complémentaire : comment Terraform détermine l'ORDRE dans lequel il crée, modifie et détruit ses ressources.
Commandes & code
Import de ressources existantes
# Cas courant : une ressource a été créée manuellement (console cloud) et doit être reprise par Terraform
# Objectif : faire correspondre le state Terraform à cette ressource, SANS la recréer# Étape 1 : écrire le bloc resource correspondant (attributs minimaux, à affiner ensuite)
resource "aws_s3_bucket" "bucket_existant" {
bucket = "mon-bucket-cree-manuellement"
}# Étape 2 : importer la ressource réelle dans le state (associe l'ID réel au bloc "resource")
terraform import aws_s3_bucket.bucket_existant mon-bucket-cree-manuellement
# Étape 3 : vérifier qu'il n'y a AUCUN diff entre la config écrite et l'état réel importé
terraform plan
# Si plan affiche des changements -> la config .tf doit être ajustée pour matcher l'existant EXACTEMENT# --- Depuis Terraform 1.5+ : bloc "import" déclaratif (préféré à la commande import) ---
# import.tf
import {
to = aws_s3_bucket.bucket_existant
id = "mon-bucket-cree-manuellement"
}
resource "aws_s3_bucket" "bucket_existant" {
bucket = "mon-bucket-cree-manuellement"
}# Le bloc "import" génère un plan visible AVANT application (plus sûr que la commande CLI)
terraform plan # montre "will be imported" pour la ressource concernée
terraform apply
# Générer automatiquement le squelette de configuration HCL depuis une ressource existante
terraform plan -generate-config-out=generated.tf
# Écrit une proposition de bloc "resource" dans generated.tf, à relire et ajuster avant de l'utiliser# Pièges fréquents de l'import :
# - Import du state seul : les attributs "hors state" (dépendances entre ressources) ne sont PAS déduits automatiquement
# - Toujours faire un "terraform plan" juste après import : tout diff signale une config .tf incomplète/incorrecte
# - Importer resource par resource peut être long sur une infra existante volumineuse -> outils tiers (ex: terraformer)Résumé
terraform import(ou le bloc déclaratifimport) associe une ressource réelle existante à un blocresourcedu code.- Après import, un
terraform plansans diff confirme que la config HCL décrit fidèlement l'état réel. -generate-config-outgénère un squelette HCL automatiquement, à toujours relire avant utilisation.
Exercices pratiques
Mission : reprendre un bucket créé manuellement sans le recréer
Objectif : Importer une ressource existante dans le state et vérifier que la configuration écrite correspond exactement à la réalité du cloud.
Contexte
Un bucket S3 nommé mon-bucket-cree-manuellement existe en production depuis plusieurs mois, créé à la main dans la console AWS. L'équipe a écrit un bloc resource "aws_s3_bucket" "bucket_existant" minimal et vient d'importer ce bucket dans le state. terraform plan affiche pourtant encore un changement : l'ajout d'une configuration de versioning absente du code.