Exercice 03 : Créer ses premières ressources
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Écrire un bloc
resource "type" "nom"complet - ✅ Distinguer les attributs obligatoires des attributs optionnels
- ✅ Référencer une ressource via
type.nom.attribut - ✅ Utiliser
terraform validateetterraform console
Durée estimée : 20 minutes
Difficulté : ⭐⭐☆☆☆ (Débutant+)
Prérequis : Terraform installé, Docker en cours d'exécution, exercice 02 terminé
📖 Contexte
Une ressource Terraform décrit un objet d'infrastructure : un conteneur Docker, un bucket S3, une VM. Chaque type de ressource a des attributs obligatoires (requis pour créer l'objet) et des attributs optionnels. Les ressources peuvent se référencer entre elles pour créer des dépendances implicites.
📋 Énoncé
Vous allez créer une image Docker et un conteneur qui l'utilise, en établissant une référence entre les deux ressources.
Résultat attendu :
- Une image nginx téléchargée et un conteneur nginx en cours d'exécution, gérés par Terraform
🧭 Déroulement de l'exercice
Tâche 1 : Créer une ressource docker_image
Déclarez une ressource docker_image qui télécharge l'image nginx:1.25.
Indice : Le type de ressource est
docker_image, le nom est libre (nginxpar convention). L'attribut obligatoire estname.
Vérification : terraform validate retourne Success!.
Tâche 2 : Créer une ressource docker_container
Déclarez une ressource docker_container qui crée un conteneur depuis l'image précédente.
Indice : Référencez l'image avec
docker_image.nginx.image_id. L'attributnameest le nom du conteneur.
Vérification : terraform validate retourne Success!. La référence entre ressources crée une dépendance implicite.
Tâche 3 : Ajouter des attributs optionnels
Ajoutez un mapping de port au conteneur : le port 80 du conteneur mappé sur le port 8080 de l'hôte.
Indice : Le bloc
ports {}a les attributsinternal(port du conteneur) etexternal(port de l'hôte).
Vérification : terraform validate retourne Success!.
Tâche 4 : Explorer avec terraform console
Lancez terraform console et explorez les références aux ressources (avant l'apply, les attributs auront des valeurs null ou estimées).
Indice :
terraform consoleouvre un REPL interactif. Tapezdocker_image.nginxpour voir la structure.
Vérification : La console affiche la structure de la ressource sans erreur.
Tâche 5 : Vérifier les attributs disponibles
Dans la documentation du provider Docker (registry.terraform.io/kreuzwerker/docker), repérez quels attributs sont "Required", "Optional" et "Read-Only" (computed).
Indice : Les attributs "Read-Only" sont remplis par Terraform APRÈS la création de la ressource (ex:
id,image_id).
Vérification : Vous identifiez au moins 2 attributs computed sur docker_container.
🗂️ Mini-Projet : Stack nginx complète
# main.tf
terraform {
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "~> 3.0"
}
}
}
provider "docker" {}
resource "docker_image" "nginx" {
name = "nginx:1.25"
keep_locally = false
}
resource "docker_container" "web" {
name = "nginx-terraform"
image = docker_image.nginx.image_id
ports {
internal = 80
external = 8080
}
labels {
label = "managed-by"
value = "terraform"
}
}
output "container_id" {
value = docker_container.web.id
}
output "container_ip" {
value = docker_container.web.network_data[0].ip_address
}Checkpoints :
terraform validateretourneSuccess!terraform fmt -checkretourne 0 (code bien formaté)terraform consolepuisdocker_image.nginx.nameaffichenginx:1.25- La référence
docker_image.nginx.image_idest utilisée dansdocker_container.web terraform applycrée le conteneur accessible surhttp://localhost:8080