Vers une Résilience Multi-AZ Globale
Étape A : Remplacer le bloc resource "aws_instance" "wordpress_server" par un Launch Template + un Auto Scaling Group
(pour avoir nos 2 instances WordPress réparties sur private_subnets[0] et private_subnets[1]).
1. Le Launch Template (Le moule de mon WordPress)
On crée d’abord le gabarit qui définit à quoi ressemble chaque serveur WordPress.
resource "aws_launch_template" "wordpress_template" {
name_prefix = "wordpress-template-"
image_id = data.aws_ami.ubuntu.id
instance_type = var.wordpress_instance_type
key_name = aws_key_pair.ansible_keypair.key_name
# On associe le Security Group du WordPress
vpc_security_group_ids = [aws_security_group.wordpress_sg.id]
# Configuration du disque dur (22 Go gp3 comme tu avais configuré)
block_device_mappings {
device_name = "/dev/sda1"
ebs {
volume_size = 22
volume_type = "gp3"
delete_on_termination = true
}
}
tag_specifications {
resource_type = "instance"
tags = {
Name = "wordpress-asg"
}
}
lifecycle {
ignore_changes = [image_id]
}
}
2. L’Auto Scaling Group (Le gestionnaire Multi-AZ)
C’est ici qu’on active la magie du Multi-AZ. On crée le groupe qui va utiliser le modèle ci-dessus et on lui demande explicitement de se déployer sur tous mes sous-réseaux privés (Zone A et Zone B) :
resource "aws_autoscaling_group" "wordpress_asg" {
name_prefix = "wordpress-asg-"
desired_capacity = 2 # 🚀 AWS va maintenir TOUJOURS 2 serveurs allumés
max_size = 4 # Il pourra monter à 4 si besoin
min_size = 1 # Au minimum 1 serveur
# 🌟 LA CLÉ DU MULTI-AZ : On donne la LISTE de tes sous-réseaux privés
vpc_zone_identifier = module.vpc.private_subnets
launch_template {
id = aws_launch_template.wordpress_template.id
version = "$Latest"
}
# Optionnel mais propre : AWS attendra que l'instance soit saine
health_check_type = "EC2"
health_check_grace_period = 300
}
Ce que ça change concrètement :
Au lieu d’avoir un seul serveur figé dans private_subnets[0], AWS va lire module.vpc.private_subnets (qui contient la liste de tes zones). Comme on a demandé une capacité de 2, l’ASG va automatiquement démarrer une instance dans la zone A et une instance dans la zone B.
Étape B : Administration et CI/CD (Approche Serverless / No-Bastion)
: Plutôt que de maintenir un serveur Ansible permanent dans un ASG — ce qui imposerait de gérer la persistance des playbooks ou l’usage de coffres-forts de clés (Secrets Manager) —, l’architecture cible supprime complètement la VM Ansible. C’est le GitLab Runner qui exécute directement les commandes terraform apply puis ansible-playbook de manière éphémère et stateless. Cela réduit à zéro la surface d’attaque externe d’administration, élimine le coût d’une VM inutile et supprime le besoin d’une Elastic IP dédiée.
Etape C: Stockage et Persistance Stateful :
> * Données structurées : La base de données Amazon RDS passe en multi_az = true pour une réplication synchrone entre les zones.
- Données non structurées (Médias/Plugins) : Afin d’éviter les désynchronisations entre les deux instances WordPress, le répertoire
wp-contentest déporté sur un système de fichiers partagé Amazon EFS, garantissant que les deux nœuds lisent et écrivent sur la même source de vérité.
Étape D : Déploiement d’un GitLab Runner Privé et Managé
Pour permettre à GitLab CI d’exécuter nos playbooks Ansible et nos commandes Terraform sans aucune exposition sur Internet, nous créons un exécuteur privé.