Students : DIALLO Samba & DIOP Mouhamed
Exercice 7: Recréation de Ressources après Destruction
Question
Que se passe-t-il si vous exécutez tofu apply après avoir détruit les ressources?
Réponse
Lorsque vous exécutez tofu destroy suivi de tofu apply, OpenTofu recrée toutes les ressources qui ont été détruites.
Séquence d’Événements
-
tofu destroysupprime toutes les ressources (instance, security group)- Le fichier d’état est mis à jour pour refléter l’état détruit
- Les ressources AWS sont supprimées
-
tofu applyaprès destruction:- Lit l’état Terraform actuel (maintenant vide)
- Lit les fichiers de configuration (main.tf, variables.tf, etc.)
- Compare l’état désiré (config) vs l’état actuel (AWS)
- Constate que les ressources manquent
- Crée de nouvelles ressources from scratch
Différences Clés par rapport au Premier Apply
- Nouvel Instance ID sera différent
- Nouvelle IP Publique sera assignée
- Nouvel ID de Security Group sera créé
- Même configuration, mais ressources fraîches
Exemple
Premier déploiement:
- Instance ID:
i-02538a44ef1b9c4d3 - IP Publique:
18.220.53.35 - Security Group:
sg-0a13eebec9656bbd1
Après destroy + apply:
- Instance ID:
i-XXXXXXXXXXXXXXXX(différent) - IP Publique:
X.X.X.X(différent - réassignée) - Security Group:
sg-XXXXXXXXXXXXX(différent)
Pourquoi Cela Se Produit
AWS génère de nouveaux identifiants pour les ressources. Le fichier d’état suit quelles ressources appartiennent à quels IDs de ressources. Après destruction, l’état est propre, donc un nouveau apply crée des ressources complètement nouvelles.
Exercice 8: Déploiement de Plusieurs Instances EC2
Solution 1: Utilisation de for_each (Recommandé)
Configuration
variable "instance_names" {
description = "Names for each instance"
type = list(string)
default = ["app-instance-1", "app-instance-2", "app-instance-3"]
}
resource "aws_instance" "sample_app_multi" {
for_each = toset(var.instance_names)
ami = var.ami_id
instance_type = "t3.micro"
vpc_security_group_ids = [aws_security_group.sample_app.id]
user_data = file("${path.module}/user-data.sh")
user_data_replace_on_change = true
tags = {
Name = each.value
}
}
output "instance_ips" {
description = "Public IPs of all instances"
value = {
for name, instance in aws_instance.sample_app_multi :
name => instance.public_ip
}
}Utilisation
tofu apply -var="ami_id=ami-07eb809c44dd0fcab" \
-var='instance_names=["prod-app-1", "prod-app-2"]'Solution 2: Utilisation de count
Configuration
variable "instance_count" {
description = "Number of instances to create"
type = number
default = 3
}
resource "aws_instance" "sample_app_count" {
count = var.instance_count
ami = var.ami_id
instance_type = "t3.micro"
vpc_security_group_ids = [aws_security_group.sample_app.id]
user_data = file("${path.module}/user-data.sh")
user_data_replace_on_change = true
tags = {
Name = "sample-app-${count.index + 1}"
}
}
output "instance_ips" {
description = "Public IPs of all instances"
value = aws_instance.sample_app_count[*].public_ip
}Utilisation
tofu apply -var="ami_id=ami-07eb809c44dd0fcab" -var="instance_count=3"Comparaison: for_each vs count
for_each
Avantages:
- Meilleur nommage/identification
- Plus sûr lors de la suppression d’éléments (pas de décalage d’index)
- Plus lisible pour l’itération basée sur des clés
Inconvénients:
- Fonctionne uniquement avec des maps ou des sets
- Syntaxe plus complexe
count
Avantages:
- Syntaxe plus simple
- Fonctionne pour l’itération numérique
- Bon pour les cas simples
Inconvénients:
- Fragile lors de la modification de listes (les indices se décalent)
- Moins lisible pour les scénarios complexes
Bonne Pratique
Recommandation: Utilisez for_each pour les déploiements de production avec des identifiants significatifs.
Test des Instances Multiples
Une fois déployées, testez toutes les instances:
for instance_ip in $(tofu output -json instance_ips | jq '.[]' -r); do
echo "Testing $instance_ip..."
curl http://$instance_ip:8080/
doneFichiers Disponibles
Les configurations complètes sont disponibles dans:
Cela démontre la capacité d’OpenTofu à gérer l’infrastructure as code à l’échelle.