Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| eadl:bloc4:fm4:td2 [2026/06/14 16:10] – jcheron | eadl:bloc4:fm4:td2 [2026/06/14 17:07] (Version actuelle) – [6. Correction – restriction du backend] jcheron | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ====== | + | ====== |
| ===== Objectifs ===== | ===== Objectifs ===== | ||
| - | * Comprendre | + | * Comprendre la segmentation réseau dans AWS avec VPC et subnets |
| - | * Mettre en place une architecture 3 tiers (ALB / backend / DB) | + | * Identifier les mauvaises pratiques de sécurité |
| + | * Mettre en place un point d' | ||
| * Contrôler les flux réseau avec les Security Groups | * Contrôler les flux réseau avec les Security Groups | ||
| - | * Éviter l’exposition directe des services internes | + | * Appliquer le principe du moindre privilège sur chaque couche |
| - | * Corriger une infrastructure existante non sécurisée | + | |
| ===== Contexte ===== | ===== Contexte ===== | ||
| - | Vous intervenez | + | Vous intervenez |
| - | L’équipe a amélioré le réseau (VPC, subnets), mais l’application | + | L'équipe |
| - | Architecture actuelle : | + | Le déploiement a été fait rapidement pour respecter un délai. |
| - | * une instance backend accessible publiquement | + | Résultat : |
| - | * une base de données mal isolée | + | |
| - | * aucun point d’entrée centralisé | + | |
| - | Un audit impose : | + | * l' |
| + | * mais toute l' | ||
| - | * suppression des accès directs au backend | + | Un audit de sécurité interne a identifié trois problèmes critiques : |
| - | * mise en place d’un point d’entrée unique | + | |
| - | * isolation stricte | + | |
| - | ===== Objectif technique ===== | + | * le port applicatif du backend est ouvert à Internet |
| + | * le port de la base de données est ouvert à Internet | ||
| + | * aucun point d' | ||
| - | Mettre en place une architecture sécurisée | + | Votre mission |
| - | * Internet → ALB (public) | + | ===== Architecture cible ===== |
| - | | + | |
| - | | + | L' |
| + | |||
| + | | ||
| + | | ||
| + | |||
| + | L' | ||
| + | |||
| + | | ||
| ===== Contraintes ===== | ===== Contraintes ===== | ||
| - | * Le backend ne doit plus être accessible depuis Internet | + | |
| - | * La base de données ne doit jamais | + | |
| - | * Utiliser uniquement | + | * La base de données ne doit être accessible que depuis le backend |
| - | * Ne pas casser l’accès à l’application | + | * Tout le code est en Terraform |
| - | ===== Infrastructure existante | + | ===== Pré-requis |
| - | Fichier : `network/ | + | * Terraform installé et configuré |
| + | * Credentials AWS valides | ||
| + | * Notions de base : VPC, subnet, Security Group | ||
| + | |||
| + | ===== Infrastructure de départ ===== | ||
| + | |||
| + | L' | ||
| + | |||
| + | Lire le code attentivement avant de l' | ||
| + | |||
| + | Fichier : `td2/network/ | ||
| <sxh js> | <sxh js> | ||
| provider " | provider " | ||
| Ligne 50: | Ligne 66: | ||
| } | } | ||
| + | # VPC principal | ||
| + | resource " | ||
| + | cidr_block | ||
| + | enable_dns_hostnames = true | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # Passerelle Internet | ||
| + | resource " | ||
| + | vpc_id = aws_vpc.main.id | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # Subnet public – AZ a | ||
| + | resource " | ||
| + | vpc_id | ||
| + | cidr_block | ||
| + | availability_zone | ||
| + | map_public_ip_on_launch = true | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # Subnet public – AZ b (requis par l'ALB) | ||
| + | resource " | ||
| + | vpc_id | ||
| + | cidr_block | ||
| + | availability_zone | ||
| + | map_public_ip_on_launch = true | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # Subnet privé – DB | ||
| + | resource " | ||
| + | vpc_id | ||
| + | cidr_block | ||
| + | availability_zone = " | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # Table de routage publique | ||
| + | resource " | ||
| + | vpc_id = aws_vpc.main.id | ||
| + | |||
| + | route { | ||
| + | cidr_block = " | ||
| + | gateway_id = aws_internet_gateway.igw.id | ||
| + | } | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | resource " | ||
| + | subnet_id | ||
| + | route_table_id = aws_route_table.public.id | ||
| + | } | ||
| + | |||
| + | resource " | ||
| + | subnet_id | ||
| + | route_table_id = aws_route_table.public.id | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Fichier : `td2/ | ||
| + | <sxh js> | ||
| + | # Security Group backend – PROBLEME VOLONTAIRE | ||
| + | # Ce fichier sera modifié au cours du TD | ||
| resource " | resource " | ||
| name = " | name = " | ||
| + | vpc_id = aws_vpc.main.id | ||
| ingress { | ingress { | ||
| + | description = "HTTP depuis Internet" | ||
| from_port | from_port | ||
| to_port | to_port | ||
| protocol | protocol | ||
| cidr_blocks = [" | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | egress { | ||
| + | from_port | ||
| + | to_port | ||
| + | protocol | ||
| + | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| } | } | ||
| } | } | ||
| + | # Security Group DB – PROBLEME VOLONTAIRE | ||
| resource " | resource " | ||
| - | name = " | + | name |
| + | vpc_id = aws_vpc.main.id | ||
| ingress { | ingress { | ||
| + | description = " | ||
| from_port | from_port | ||
| to_port | to_port | ||
| protocol | protocol | ||
| cidr_blocks = [" | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | egress { | ||
| + | from_port | ||
| + | to_port | ||
| + | protocol | ||
| + | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| } | } | ||
| } | } | ||
| </ | </ | ||
| - | ===== Ressources | + | Fichier : `td2/ |
| + | <sxh js> | ||
| + | resource " | ||
| + | ami | ||
| + | instance_type | ||
| + | subnet_id | ||
| + | vpc_security_group_ids | ||
| + | |||
| + | user_data | ||
| + | # | ||
| + | yum install -y python3 | ||
| + | python3 -m http.server 80 & | ||
| + | EOF | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | resource " | ||
| + | identifier | ||
| + | engine | ||
| + | engine_version | ||
| + | instance_class | ||
| + | allocated_storage | ||
| + | username | ||
| + | password | ||
| + | db_subnet_group_name | ||
| + | vpc_security_group_ids = [aws_security_group.db_sg.id] | ||
| + | skip_final_snapshot | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | resource " | ||
| + | name = " | ||
| + | subnet_ids = [aws_subnet.private.id, | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== Commandes Terraform | ||
| - | Fichier : `commandes/ | + | Fichier : `td2/commandes/ |
| <sxh bash> | <sxh bash> | ||
| + | # Initialiser le projet | ||
| terraform init | terraform init | ||
| + | |||
| + | # Vérifier le plan sans appliquer | ||
| terraform plan | terraform plan | ||
| + | |||
| + | # Appliquer la configuration | ||
| terraform apply | terraform apply | ||
| + | |||
| + | # Récupérer les outputs | ||
| + | terraform output | ||
| + | |||
| + | # Détruire l' | ||
| terraform destroy | terraform destroy | ||
| </ | </ | ||
| - | ===== 1. Compréhension de l’existant | + | ===== 1. Lecture du code ===== |
| + | |||
| + | Lire les trois fichiers avant toute manipulation. | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Quels composants sont exposés sur Internet ? | + | Lister les ressources présentes dans le code. |
| - | Quels flux sont actuellement autorisés ? | + | Pour chaque ressource, indiquer : |
| + | * son rôle | ||
| + | * le subnet dans lequel elle est placée | ||
| + | * les ports ouverts en entrée | ||
| </ | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Pourquoi | + | Pourquoi |
| - | Quels sont les risques immédiats | + | Quelle contrainte AWS cela reflète-t-il |
| </ | </ | ||
| - | ===== 2. Analyse | + | <WRAP round question> |
| + | La base de données est une instance RDS et non une instance EC2. | ||
| + | |||
| + | Quelle est la différence en termes de gestion et de sécurité ? | ||
| + | </ | ||
| + | |||
| + | ===== 2. Identification | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Identifier dans `security_groups.tf` les deux règles les plus dangereuses. | ||
| + | |||
| + | Pour chaque règle : | ||
| + | * expliquer ce qu' | ||
| + | * expliquer ce qu'un attaquant pourrait faire avec cet accès | ||
| + | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Identifier les problèmes | + | Le mot de passe de la base de données est en clair dans le fichier Terraform. |
| - | * backend | + | Quel problème cela pose-t-il ? |
| - | * base de données | + | |
| + | Ce problème sera traité dans un TD ultérieur sur la gestion des secrets. | ||
| </ | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Quelle | + | La base de données RDS est placée |
| - | Pourquoi ? | + | Est-ce un problème ? Pourquoi ? |
| </ | </ | ||
| - | ===== 3. Mise en pratique – ajout d’un ALB ===== | + | ===== 3. Déploiement de l' |
| - | Objectif | + | <WRAP round todo> |
| + | Appliquer la configuration telle quelle | ||
| - | * introduire un point d’entrée unique | + | |
| + | |||
| + | Relever les outputs suivants : | ||
| + | | ||
| + | * endpoint de la base RDS | ||
| + | </ | ||
| + | |||
| + | Fichier : `td2/ | ||
| + | <sxh js> | ||
| + | output " | ||
| + | value = aws_instance.backend.public_ip | ||
| + | description = "IP publique du backend" | ||
| + | } | ||
| + | |||
| + | output " | ||
| + | value = aws_db_instance.db.endpoint | ||
| + | description = " | ||
| + | } | ||
| + | </ | ||
| <WRAP round todo> | <WRAP round todo> | ||
| + | Tester l' | ||
| - | Créer | + | curl http://< |
| - | * un Security Group pour l’ALB | + | Tenter une connexion à la base de données |
| - | * autoriser HTTP (80) depuis | + | |
| + | psql -h < | ||
| + | |||
| + | Noter le résultat de chaque test. | ||
| + | </ | ||
| + | |||
| + | <WRAP round question> | ||
| + | Le backend répond-il ? | ||
| + | |||
| + | La connexion à la base de données est-elle possible depuis votre poste ? | ||
| + | |||
| + | Pourquoi ce comportement est-il problématique dans un contexte de production ? | ||
| + | </ | ||
| + | |||
| + | ===== 4. Mise en place de l'ALB ===== | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Créer le fichier suivant sans modifier les Security Groups existants. | ||
| </ | </ | ||
| - | Fichier : `network/ | + | Fichier : `td2/network/ |
| <sxh js> | <sxh js> | ||
| + | # Security Group de l'ALB | ||
| resource " | resource " | ||
| - | name = " | + | name |
| + | vpc_id = aws_vpc.main.id | ||
| ingress { | ingress { | ||
| + | description = "HTTP depuis Internet" | ||
| from_port | from_port | ||
| to_port | to_port | ||
| protocol | protocol | ||
| cidr_blocks = [" | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | egress { | ||
| + | from_port | ||
| + | to_port | ||
| + | protocol | ||
| + | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| } | } | ||
| } | } | ||
| - | </ | ||
| - | <WRAP round question> | + | # Application Load Balancer |
| - | Pourquoi l’ALB peut-il être exposé publiquement ? | + | resource " |
| - | </ | + | name = "td2-alb" |
| + | internal | ||
| + | load_balancer_type = " | ||
| + | security_groups | ||
| + | | ||
| - | ===== 4. Erreur volontaire – faux sentiment de sécurité ===== | + | tags = { |
| + | Name = " | ||
| + | } | ||
| + | } | ||
| - | L’ALB est en place. | + | # Target Group |
| + | resource " | ||
| + | name = " | ||
| + | port = 80 | ||
| + | protocol = " | ||
| + | vpc_id | ||
| - | Mais le backend | + | health_check { |
| + | path = "/" | ||
| + | healthy_threshold | ||
| + | unhealthy_threshold = 2 | ||
| + | interval | ||
| + | } | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| + | } | ||
| + | } | ||
| + | |||
| + | # Attachement du backend au Target Group | ||
| + | resource " | ||
| + | target_group_arn = aws_lb_target_group.backend.arn | ||
| + | target_id | ||
| + | port = 80 | ||
| + | } | ||
| + | |||
| + | # Listener HTTP | ||
| + | resource " | ||
| + | load_balancer_arn = aws_lb.main.arn | ||
| + | port = 80 | ||
| + | protocol | ||
| + | |||
| + | default_action { | ||
| + | type = " | ||
| + | target_group_arn = aws_lb_target_group.backend.arn | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| <WRAP round todo> | <WRAP round todo> | ||
| + | Ajouter l' | ||
| - | Tester : | + | output " |
| + | value = aws_lb.main.dns_name | ||
| + | description = "DNS public de l' | ||
| + | } | ||
| - | * accès via ALB | + | Appliquer : |
| - | * accès direct au backend | + | |
| + | terraform apply | ||
| + | |||
| + | Tester l' | ||
| + | |||
| + | curl http://< | ||
| + | |||
| + | Tester également l' | ||
| + | |||
| + | curl http://< | ||
| </ | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Peut-on contourner l’ALB | + | Les deux accès fonctionnent-ils ? |
| - | Pourquoi | + | Qu'est-ce |
| + | |||
| + | L'ALB est-il suffisant seul pour sécuriser le backend | ||
| </ | </ | ||
| - | ===== 5. Correction | + | ===== 5. Erreur courante |
| - | Objectif : | + | L'ALB est en place mais le Security Group du backend n'a pas été modifié. |
| - | * autoriser uniquement le trafic provenant de l’ALB | + | Le port 80 du backend est toujours ouvert sur `0.0.0.0/ |
| - | <WRAP round todo> | + | <WRAP round question> |
| + | Pourquoi ajouter un ALB ne suffit-il pas à protéger le backend ? | ||
| - | Modifier le Security Group du backend | + | Quel composant contrôle réellement les accès réseau sur une instance AWS ? |
| + | </ | ||
| + | |||
| + | ===== 6. Correction – restriction | ||
| + | <WRAP round todo> | ||
| + | Modifier `security_groups.tf`. | ||
| + | |||
| + | Remplacer la règle ingress du Security Group `backend_sg` : | ||
| + | * supprimer l' | ||
| + | * autoriser uniquement le trafic depuis le Security Group de l'ALB | ||
| </ | </ | ||
| - | Fichier : `network/backend_sg.tf` | + | Fichier : `td2/network/security_groups.tf` |
| <sxh js> | <sxh js> | ||
| resource " | resource " | ||
| - | name = " | + | name |
| + | vpc_id = aws_vpc.main.id | ||
| ingress { | ingress { | ||
| + | description | ||
| from_port | from_port | ||
| to_port | to_port | ||
| Ligne 190: | Ligne 508: | ||
| security_groups = [aws_security_group.alb_sg.id] | security_groups = [aws_security_group.alb_sg.id] | ||
| } | } | ||
| - | } | ||
| - | </ | ||
| - | <WRAP round question> | + | egress { |
| - | Pourquoi utilise-t-on un Security Group comme source plutôt qu’une IP ? | + | |
| - | </WRAP> | + | to_port |
| + | protocol | ||
| + | | ||
| + | } | ||
| - | ===== 6. Correction – sécurisation de la base de données ===== | + | tags = { |
| + | Name = " | ||
| + | } | ||
| + | } | ||
| - | Objectif : | ||
| - | |||
| - | * autoriser uniquement le backend | ||
| - | |||
| - | <WRAP round todo> | ||
| - | |||
| - | Modifier le Security Group de la base de données | ||
| - | |||
| - | </ | ||
| - | |||
| - | Fichier : `network/ | ||
| - | <sxh js> | ||
| resource " | resource " | ||
| - | name = " | + | name |
| + | vpc_id = aws_vpc.main.id | ||
| ingress { | ingress { | ||
| + | description | ||
| from_port | from_port | ||
| to_port | to_port | ||
| protocol | protocol | ||
| security_groups = [aws_security_group.backend_sg.id] | security_groups = [aws_security_group.backend_sg.id] | ||
| + | } | ||
| + | |||
| + | egress { | ||
| + | from_port | ||
| + | to_port | ||
| + | protocol | ||
| + | cidr_blocks = [" | ||
| + | } | ||
| + | |||
| + | tags = { | ||
| + | Name = " | ||
| } | } | ||
| } | } | ||
| </ | </ | ||
| - | <WRAP round question> | + | <WRAP round todo> |
| - | Que se passe-t-il si un attaquant accède au backend ? | + | Appliquer les modifications : |
| - | Peut-il accéder à la base de données ? | + | terraform apply |
| - | </ | + | |
| - | ===== 7. Apparition d’un problème ===== | + | Tester les deux accès : |
| - | Après sécurisation | + | # Via l'ALB – doit fonctionner |
| + | curl http://< | ||
| - | | + | |
| + | curl http://< | ||
| + | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Quelles sont les causes possibles | + | L' |
| + | |||
| + | L' | ||
| - | Quels éléments faut-il vérifier ? | + | Que se passe-t-il si le Health Check de l'ALB échoue ? |
| + | Comment | ||
| </ | </ | ||
| - | ===== 8. Analyse | + | ===== 7. Problème potentiel – Health Check ===== |
| + | |||
| + | Après modification des Security Groups, l'ALB peut afficher le backend comme " | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Vérifier : | + | Expliquer ce qu'est un Health Check d'ALB. |
| - | * ports autorisés | + | Quel flux réseau le Health Check génère-t-il ? |
| - | * association des Security Groups | + | |
| - | * configuration de l’ALB | + | |
| - | * health checks | + | |
| - | Quel élément est souvent oublié | + | Depuis quelle source arrive ce flux sur le backend |
| </ | </ | ||
| - | ===== 9. Correction ===== | + | <WRAP round question> |
| + | Si le backend est " | ||
| - | <WRAP round todo> | + | Le service devient indisponible même si le backend fonctionne. |
| - | Corriger : | + | Quelle règle dans le Security Group du backend pourrait causer ce blocage ? |
| - | + | </ | |
| - | * les règles nécessaires | + | |
| - | * la connectivité ALB → backend | + | |
| + | <WRAP round todo> | ||
| + | Vérifier dans la console AWS : | ||
| + | * aller dans EC2 > Target Groups | ||
| + | * vérifier le statut de l' | ||
| + | * lire le message d' | ||
| </ | </ | ||
| - | ===== 10. Extension | + | ===== 8. Diagnostic et correction |
| <WRAP round todo> | <WRAP round todo> | ||
| + | Si le Health Check échoue, identifier la cause : | ||
| - | Ajouter : | + | * le port 80 est-il bien ouvert depuis le Security Group de l'ALB ? |
| + | * le service python3 est-il démarré sur l' | ||
| + | * la règle egress de l'ALB permet-elle les réponses ? | ||
| - | * HTTPS (port 443) sur l’ALB | + | Corriger la règle manquante et réappliquer. |
| - | * redirection HTTP → HTTPS | + | </ |
| + | |||
| + | ===== 9. Vérification finale ===== | ||
| + | |||
| + | <WRAP round todo> | ||
| + | Réaliser les tests suivants et noter les résultats dans un tableau : | ||
| + | * accès HTTP via l'ALB → attendu : 200 | ||
| + | * accès HTTP direct au backend → attendu : timeout ou refus | ||
| + | * connexion PostgreSQL depuis votre poste → attendu : timeout ou refus | ||
| + | * connexion PostgreSQL depuis le backend → attendu : possible | ||
| </ | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Pourquoi HTTPS est-il indispensable | + | Comment vérifier qu'un flux est bien bloqué et non juste lent ? |
| + | |||
| + | Quelle différence entre un timeout et un Connection refused | ||
| </ | </ | ||
| - | ===== Bonnes pratiques | + | ===== 10. Extension – déplacement du backend en subnet privé |
| - | <WRAP round question> | + | Le backend a une IP publique car il est dans un subnet public. |
| - | Pourquoi faut-il : | + | |
| - | * un point d’entrée unique ? | + | Ce n'est pas nécessaire si l'ALB gère tout le trafic entrant. |
| - | * ne jamais exposer | + | |
| - | * isoler la base de données ? | + | |
| + | <WRAP round todo> | ||
| + | Modifier `instances.tf` pour déplacer le backend dans le subnet privé : | ||
| + | |||
| + | subnet_id = aws_subnet.private.id | ||
| + | |||
| + | Supprimer également le `map_public_ip_on_launch` implicite. | ||
| + | |||
| + | Appliquer et vérifier que l'ALB continue de fonctionner. | ||
| </ | </ | ||
| - | ===== Challenge final ===== | + | <WRAP round question> |
| + | Le backend n'a plus d'IP publique. | ||
| - | Objectif : | + | Est-il encore accessible depuis Internet ? |
| - | * seul l’ALB est exposé à Internet | + | Comment |
| - | * le backend est accessible uniquement depuis l’ALB | + | |
| - | * la base de données est accessible uniquement depuis le backend | + | |
| - | < | + | Quel composant réseau manque pour que le backend puisse faire des appels sortants (mises à jour, appels API externes) ? |
| + | </WRAP> | ||
| - | Implémenter : | + | ===== Challenge final ===== |
| - | * 3 Security Groups | + | Objectif : valider l' |
| - | * règles strictes entre chaque couche | + | |
| + | <WRAP round todo> | ||
| + | Dessiner l' | ||
| + | * les subnets (public_a, public_b, private) | ||
| + | * les composants dans chaque subnet | ||
| + | * les Security Groups et leurs règles | ||
| + | * les flux autorisés avec les ports | ||
| </ | </ | ||
| - | <WRAP round question> | + | <WRAP round todo> |
| - | Dessiner les flux réseau autorisés dans votre architecture | + | Répondre aux questions suivantes par écrit : |
| + | |||
| + | * Quel composant est le seul point d' | ||
| + | * Quelles ressources ne sont plus accessibles directement depuis Internet ? | ||
| + | * Quel principe de sécurité est appliqué sur chaque Security Group ? | ||
| + | * Que se passe-t-il si l'ALB est supprimé ? L' | ||
| </ | </ | ||
| Ligne 315: | Ligne 675: | ||
| <WRAP round todo> | <WRAP round todo> | ||
| + | Ajouter une seconde instance backend dans `public_b` : | ||
| - | Ajouter : | + | resource " |
| - | + | | |
| - | * une deuxième instance backend | + | |
| - | | + | subnet_id |
| + | vpc_security_group_ids = [aws_security_group.backend_sg.id] | ||
| + | ... | ||
| + | | ||
| + | Attacher cette instance au même Target Group. | ||
| </ | </ | ||
| <WRAP round question> | <WRAP round question> | ||
| - | Quel est l’intérêt | + | Quels sont les avantages d' |
| + | |||
| + | Répondre selon deux axes : | ||
| + | * disponibilité : que se passe-t-il si une instance tombe ? | ||
| + | * sécurité : l' | ||
| </ | </ | ||