Exercice 03 : Importer des ressources existantes dans Terraform
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Identifier l'ID d'une ressource existante à importer
- ✅ Utiliser
terraform importpour l'ajouter au state - ✅ Écrire la configuration HCL correspondante jusqu'à obtenir 0 changements
- ✅ Utiliser le bloc
import {}déclaratif (Terraform 1.5+)
Durée estimée : 35 minutes
Difficulté : ⭐⭐⭐⭐☆ (Avancé)
Prérequis : Terraform installé, Docker en cours d'exécution, exercices avancés 01-02 terminés
📖 Contexte
Dans la réalité, une infrastructure existante n'a pas été créée par Terraform. Pour la gérer avec Terraform sans la recréer, il faut l'importer : Terraform va enregistrer la ressource dans son state et la gérer à partir de ce moment. L'enjeu est d'écrire une configuration HCL qui correspond exactement à l'état réel, sinon le prochain apply va créer des diffs indésirables.
📋 Énoncé
Vous allez créer manuellement un conteneur Docker (hors Terraform), puis l'importer dans un projet Terraform et aligner la configuration jusqu'à obtenir 0 changes.
Résultat attendu :
- Un conteneur existant intégré dans Terraform sans recréation
terraform planafficheNo changes.
🧭 Déroulement de l'exercice
Tâche 1 : Créer une ressource hors Terraform
Créez manuellement un conteneur Docker avec la commande docker run.
Indice :
docker run -d --name nginx-existant -p 8090:80 nginx:1.25
Vérification : docker ps affiche le conteneur nginx-existant en cours d'exécution.
Tâche 2 : Obtenir l'ID de la ressource
Récupérez l'ID complet du conteneur Docker pour l'utiliser dans la commande terraform import.
Indice :
docker inspect nginx-existant --format='{{.Id}}'oudocker ps -q --filter name=nginx-existant
Vérification : L'ID est un hash de 64 caractères hexadécimaux.
Tâche 3 : Écrire le bloc resource dans main.tf
Avant d'importer, écrivez un bloc resource "docker_container" "existant" dans main.tf avec les attributs minimaux.
Indice :
terraform importa besoin que la ressource existe dans la configuration HCL. Commencez avec les attributs obligatoires seulement.
Vérification : terraform validate retourne Success!.
Tâche 4 : Importer la ressource
Lancez terraform import docker_container.existant <ID_DU_CONTENEUR>.
Indice : L'import ne modifie pas l'infrastructure. Il ajoute seulement la ressource dans le state.
Vérification : terraform state list affiche docker_container.existant. terraform state show docker_container.existant montre tous les attributs.
Tâche 5 : Aligner la configuration pour 0 changements
Lancez terraform plan. Il affichera des diffs. Mettez à jour main.tf pour correspondre exactement à l'état réel jusqu'à obtenir No changes.
Indice : Copiez les attributs affichés par
terraform state showdans votre resource block. Ignorez les attributs computed (ils sont gérés par Terraform).
Vérification : terraform plan affiche No changes. Your infrastructure matches the configuration.
🗂️ Mini-Projet : Import avec le bloc natif (Terraform 1.5+)
Depuis Terraform 1.5, un bloc import {} déclaratif permet de définir l'import dans le code HCL (plutôt qu'en ligne de commande), compatible avec GitOps.
# import.tf
import {
id = "abc123...64chars" # ID du conteneur à importer
to = docker_container.existant
}
# main.tf - resource à créer (générée ou écrite manuellement)
resource "docker_container" "existant" {
name = "nginx-existant"
image = docker_image.nginx.image_id
ports {
internal = 80
external = 8090
}
}# Génération automatique du code HCL depuis l'état importé (TF 1.5+)
terraform plan -generate-config-out=generated.tfCheckpoints :
docker runcrée le conteneur,docker psle confirmeterraform import docker_container.existant <ID>sans erreurterraform state show docker_container.existantliste tous les attributs- Après alignement HCL :
terraform planafficheNo changes terraform plan -generate-config-out=generated.tfgénère le code HCL (TF 1.5+)