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:td4 [2026/06/25 02:21] – jcheron | eadl:bloc4:fm4:td4 [2026/06/25 13:14] (Version actuelle) – [8. Pourquoi systemd plutôt que nohup] jcheron | ||
|---|---|---|---|
| Ligne 37: | Ligne 37: | ||
| * Java 17 et Maven installés sur le poste de travail | * Java 17 et Maven installés sur le poste de travail | ||
| - | <WRAP round help> | ||
| Rappel sur les environnements d' | Rappel sur les environnements d' | ||
| - | * Le poste de travail et le runner CI/CD ont besoin de Java et Maven pour **compiler** l' | + | * Java et Maven sont nécessaires sur le **poste de travail** pour compiler |
| - | * L'instance | + | * Java est nécessaire sur **l' |
| * Maven n'a pas sa place sur l'EC2 : on y dépose uniquement le jar déjà compilé | * Maven n'a pas sa place sur l'EC2 : on y dépose uniquement le jar déjà compilé | ||
| - | </ | ||
| ===== 1. Compréhension de l' | ===== 1. Compréhension de l' | ||
| Ligne 61: | Ligne 59: | ||
| </ | </ | ||
| - | <WRAP round help> | + | <WRAP round question> |
| - | Questions de compréhension : | + | Ce fichier sera commité dans Git avec le reste du code source. |
| - | * Pourquoi le mot de passe en clair dans ce fichier | + | * Quelles sont les conséquences concrètes si un dépôt contenant |
| - | * Que se passe-t-il si ce fichier est commité dans Git ? | + | * Un attaquant qui récupère ce fichier a-t-il accès à la base de données directement ? Quels autres éléments lui manquent-il |
| - | * Quel service AWS permet de corriger cette situation | + | * Pourquoi externaliser ce secret dans Secrets Manager ne suffit pas si le code qui le récupère est lui-même mal sécurisé |
| </ | </ | ||
| Ligne 120: | Ligne 118: | ||
| <WRAP round todo> | <WRAP round todo> | ||
| - | Compiler l' | + | Compiler l' |
| <sxh bash> | <sxh bash> | ||
| Ligne 130: | Ligne 128: | ||
| </ | </ | ||
| - | <WRAP round help> | + | <WRAP round question> |
| - | Pourquoi utilise-t-on | + | Dans un pipeline CI/CD en production, ignorer les tests avec '' |
| - | Dans quel cas ne faudrait-il pas ignorer les tests ? | + | * Dans quelle situation précise serait-il acceptable de l' |
| + | * Quels types de tests seraient les plus critiques à conserver pour une application qui manipule une base de données | ||
| </ | </ | ||
| Ligne 139: | Ligne 138: | ||
| Avant d' | Avant d' | ||
| - | |||
| - | <WRAP round help> | ||
| - | Rappel : le jar est compilé sur le poste de travail. L'EC2 n'a besoin que de Java pour l' | ||
| - | </ | ||
| <WRAP round todo> | <WRAP round todo> | ||
| - | Étape 1 : Vérifier que Java est disponible sur l' | + | Copier le jar sur l' |
| - | + | ||
| - | Se connecter à l' | + | |
| - | + | ||
| - | <sxh bash> | + | |
| - | ssh -i ~/ | + | |
| - | </ | + | |
| - | + | ||
| - | Vérifier Java depuis l' | + | |
| - | + | ||
| - | <sxh bash> | + | |
| - | java -version | + | |
| - | </ | + | |
| - | + | ||
| - | Si Java n'est pas installé, l' | + | |
| - | + | ||
| - | <sxh bash> | + | |
| - | sudo yum install -y java-17-amazon-corretto | + | |
| - | + | ||
| - | # Vérifier l' | + | |
| - | java -version | + | |
| - | </ | + | |
| - | + | ||
| - | Quitter la session SSH : | + | |
| - | + | ||
| - | <sxh bash> | + | |
| - | exit | + | |
| - | </ | + | |
| - | + | ||
| - | Étape 2 : Copier le jar sur l' | + | |
| <sxh bash> | <sxh bash> | ||
| Ligne 182: | Ligne 148: | ||
| </ | </ | ||
| - | Étape 3 : Se connecter à l' | + | Se connecter à l' |
| <sxh bash> | <sxh bash> | ||
| Ligne 195: | Ligne 161: | ||
| </ | </ | ||
| - | <WRAP round help> | + | <WRAP round question> |
| - | Questions d'analyse : | + | Sur un système Linux, les arguments passés à un processus sont visibles via ''ps aux'' |
| - | * Quels sont les problèmes concrets | + | * Quelle est la conséquence concrète |
| - | * Que se passe-t-il si l' | + | * Cette méthode de déploiement crée une dépendance forte entre le déploiement et la présence d'un opérateur humain. Quels risques cela introduit-il à l' |
| - | * Pourquoi | + | |
| </ | </ | ||
| Ligne 211: | Ligne 176: | ||
| </ | </ | ||
| - | <WRAP round help> | + | <WRAP round question> |
| - | Analysez l' | + | Avant de chercher la solution |
| - | * Pourquoi l'application ne peut-elle pas se connecter à '' | + | * L'erreur indique |
| - | * Quelle valeur devrait remplacer | + | * Listez les couches réseau à vérifier |
| - | * Comment | + | |
| - | Commande utile pour tester la connectivité réseau : | + | Commande utile pour tester la connectivité réseau |
| <sxh bash> | <sxh bash> | ||
| - | # Depuis l' | ||
| nc -zv RDS_HOST 5432 | nc -zv RDS_HOST 5432 | ||
| </ | </ | ||
| Ligne 231: | Ligne 194: | ||
| On automatise maintenant le déploiement pour qu'il soit reproductible. | On automatise maintenant le déploiement pour qu'il soit reproductible. | ||
| - | |||
| - | Ansible se connecte à l'EC2 via SSH depuis le poste de travail. Il installe Java si nécessaire, | ||
| Fichier : '' | Fichier : '' | ||
| - | < | + | < |
| [web] | [web] | ||
| EC2_IP ansible_user=ec2-user ansible_ssh_private_key_file=~/ | EC2_IP ansible_user=ec2-user ansible_ssh_private_key_file=~/ | ||
| Ligne 241: | Ligne 202: | ||
| Fichier : '' | Fichier : '' | ||
| - | < | + | < |
| [defaults] | [defaults] | ||
| host_key_checking = False | host_key_checking = False | ||
| Ligne 289: | Ligne 250: | ||
| Lancer le playbook : | Lancer le playbook : | ||
| - | <sxh bash> | + | <sxh bash; |
| ansible-playbook -i ansible/ | ansible-playbook -i ansible/ | ||
| </ | </ | ||
| Ligne 295: | Ligne 256: | ||
| Vérifier que le jar est bien présent sur l' | Vérifier que le jar est bien présent sur l' | ||
| - | <sxh bash> | + | <sxh bash; |
| ssh -i ~/ | ssh -i ~/ | ||
| </ | </ | ||
| - | </ | ||
| - | |||
| - | <WRAP round help> | ||
| - | Ansible installe Java automatiquement si nécessaire. C'est l'un des avantages de l' | ||
| - | |||
| - | * Qu' | ||
| - | * Que se passe-t-il si on rejoue le playbook alors que Java est déjà installé ? | ||
| </ | </ | ||
| Ligne 311: | Ligne 265: | ||
| Le jar est déployé mais l' | Le jar est déployé mais l' | ||
| - | <WRAP round help> | + | <WRAP round question> |
| Avant de regarder la section suivante : | Avant de regarder la section suivante : | ||
| - | * Quel élément manque dans le playbook | + | * Le playbook |
| - | * Comment | + | * Ansible peut exécuter des commandes |
| - | * Pourquoi ne doit-on pas mettre | + | * Quelle différence y a-t-il entre stocker |
| </ | </ | ||
| Ligne 416: | Ligne 370: | ||
| </ | </ | ||
| - | <WRAP round help> | + | <WRAP round question> |
| - | Questions | + | * '' |
| + | * Le service systemd démarre l' | ||
| + | * Si Secrets Manager retourne le secret sous forme de JSON '' | ||
| + | </ | ||
| + | |||
| + | ===== 8. Pourquoi systemd plutôt que nohup ===== | ||
| + | |||
| + | <WRAP round question> | ||
| + | Comparez les deux approches du point de vue opérationnel : | ||
| + | |||
| + | <sxh bash; | ||
| + | # Approche nohup – à ne pas utiliser en production | ||
| + | nohup java -jar demo.jar & | ||
| + | </ | ||
| - | * Pourquoi utilise-t-on | + | * Un processus lancé avec '' |
| - | * Pourquoi le fichier | + | * systemd expose des métriques sur les redémarrages successifs d'un service. En quoi cette information est-elle utile pour distinguer un bug applicatif d'un problème d'infrastructure |
| - | * Pourquoi ne jamais stocker ce secret dans le dépôt Git, même dans un fichier de variables Ansible | + | |
| </ | </ | ||
| - | ===== 8. Mise en place CI/CD ===== | + | ===== 9. Mise en place du pipeline |
| - | <WRAP round help> | + | On automatise maintenant |
| - | Pourquoi | + | |
| - | Pistes | + | Fichier : '' |
| + | <sxh yaml> | ||
| + | name: Build and Deploy | ||
| + | |||
| + | on: | ||
| + | push: | ||
| + | branches: [ " | ||
| + | |||
| + | jobs: | ||
| + | build-and-deploy: | ||
| + | runs-on: ubuntu-latest | ||
| + | |||
| + | steps: | ||
| + | - name: Récupérer le code | ||
| + | uses: actions/ | ||
| + | |||
| + | - name: Configurer Java 17 | ||
| + | uses: actions/ | ||
| + | with: | ||
| + | distribution: | ||
| + | java-version: | ||
| + | |||
| + | - name: Compiler l' | ||
| + | run: | | ||
| + | cd app | ||
| + | mvn clean package -DskipTests | ||
| + | |||
| + | - name: Configurer les credentials AWS | ||
| + | uses: aws-actions/ | ||
| + | with: | ||
| + | aws-access-key-id: | ||
| + | aws-secret-access-key: | ||
| + | aws-region: eu-west-1 | ||
| + | |||
| + | - name: Préparer la clé SSH | ||
| + | run: | | ||
| + | mkdir -p ~/.ssh | ||
| + | echo "${{ secrets.EC2_SSH_KEY }}" > ~/ | ||
| + | chmod 600 ~/ | ||
| + | |||
| + | - name: Installer Ansible | ||
| + | run: | | ||
| + | sudo apt-get update -q | ||
| + | sudo apt-get install -y ansible | ||
| + | |||
| + | - name: Déployer avec Ansible | ||
| + | run: | | ||
| + | ansible-playbook \ | ||
| + | -i ansible/ | ||
| + | ansible/ | ||
| + | -e " | ||
| + | </ | ||
| + | |||
| + | ===== 10. Problème volontaire – Le pipeline échoue ===== | ||
| + | |||
| + | En l' | ||
| + | |||
| + | <WRAP round question> | ||
| + | Identifiez les problèmes avant de passer à la section suivante | ||
| - | * accès SSH | + | * Le runner GitHub Actions est une machine éphémère hébergée chez GitHub. Quelles contraintes réseau cela implique-t-il pour joindre une instance EC2 dans un sous-réseau public ? |
| - | * credentials AWS | + | * L' |
| + | * Si la vérification de la clé SSH hôte est active, le pipeline se bloque en attente d'une confirmation interactive. Pourquoi ce comportement est-il particulièrement problématique dans un contexte CI/CD ? | ||
| </ | </ | ||
| - | ===== 10. Correction | + | ===== 11. Correction |
| <WRAP round todo> | <WRAP round todo> | ||
| - | Configurer dans GitHub | + | Dans le dépôt |
| - | * clé SSH privée | + | Créer les secrets suivants : |
| - | * credentials AWS | + | |
| - | Modifier le workflow pour les utiliser. | + | * '' |
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Mettre à jour l' | ||
| </ | </ | ||
| - | ===== 11. Vérification ===== | + | Fichier : '' |
| + | <sxh ini> | ||
| + | [web] | ||
| + | EC2_IP_REELLE ansible_user=ec2-user ansible_ssh_private_key_file=~/ | ||
| + | </ | ||
| + | |||
| + | Fichier : '' | ||
| + | <sxh ini> | ||
| + | [defaults] | ||
| + | host_key_checking = False | ||
| + | stdout_callback = yaml | ||
| + | remote_user = ec2-user | ||
| + | </ | ||
| + | |||
| + | <WRAP round question> | ||
| + | * Les secrets GitHub sont chiffrés au repos et masqués dans les logs. Malgré cela, un secret GitHub n' | ||
| + | * Ce pipeline utilise une clé d' | ||
| + | </ | ||
| + | |||
| + | ===== 12. Vérification | ||
| <WRAP round todo> | <WRAP round todo> | ||
| - | Valider | + | Vérifier que l' |
| + | |||
| + | <sxh bash> | ||
| + | ssh -i ~/ | ||
| + | |||
| + | # Vérifier le statut du service | ||
| + | sudo systemctl status demo | ||
| + | |||
| + | # Consulter les logs de l' | ||
| + | sudo journalctl -u demo -n 50 --no-pager | ||
| + | </ | ||
| + | |||
| + | Vérifier que l' | ||
| + | |||
| + | <sxh bash> | ||
| + | curl http:// | ||
| + | </ | ||
| + | </ | ||
| - | | + | <WRAP round question> |
| - | * connexion RDS OK | + | |
| - | * déploiement | + | * Dans une architecture avec plusieurs instances EC2 derrière l'ALB, pourquoi le fait de vérifier uniquement une instance ne suffit-il pas à valider le déploiement |
| </ | </ | ||
| - | ===== 12. Amélioration sécurité – Remplacer SSH par Session Manager ===== | + | ===== 13. Amélioration sécurité – Remplacer SSH par Session Manager ===== |
| - | Objectif : | + | Objectif |
| * supprimer le port 22 du Security Group | * supprimer le port 22 du Security Group | ||
| Ligne 464: | Ligne 528: | ||
| * améliorer la traçabilité des connexions | * améliorer la traçabilité des connexions | ||
| - | ===== 12.1 Configuration IAM pour Session Manager ===== | + | ===== 13.1 Configuration IAM pour Session Manager ===== |
| Fichier : '' | Fichier : '' | ||
| Ligne 505: | Ligne 569: | ||
| </ | </ | ||
| - | ===== 12.2 Test de connexion via Session Manager ===== | + | ===== 13.2 Test de connexion via Session Manager ===== |
| <WRAP round todo> | <WRAP round todo> | ||
| Tester la connexion sans clé SSH : | Tester la connexion sans clé SSH : | ||
| - | <sxh bash> | + | <sxh bash; |
| aws ssm start-session --target INSTANCE_ID | aws ssm start-session --target INSTANCE_ID | ||
| </ | </ | ||
| Ligne 517: | Ligne 581: | ||
| </ | </ | ||
| - | <WRAP round help> | + | <WRAP round question> |
| - | Comparez les deux méthodes de connexion : | + | * SSH ouvre un port entrant sur l' |
| - | + | * Un administrateur se connecte via SSM et exécute des commandes sensibles. | |
| - | * Quelle différence y a-t-il entre une session | + | * SSM améliore la traçabilité, |
| - | * Où sont enregistrées les sessions | + | |
| - | * Quel service | + | |
| </ | </ | ||
| - | ===== 12.3 Suppression du port SSH ===== | + | ===== 13.3 Suppression du port SSH ===== |
| <WRAP round todo> | <WRAP round todo> | ||
| Ligne 535: | Ligne 597: | ||
| Vérifier qu'une connexion SSH directe est bien refusée : | Vérifier qu'une connexion SSH directe est bien refusée : | ||
| - | <sxh bash> | + | <sxh bash; |
| ssh -i ~/ | ssh -i ~/ | ||
| # Attendu : Connection refused ou timeout | # Attendu : Connection refused ou timeout | ||
| Ligne 542: | Ligne 604: | ||
| Vérifier que Session Manager fonctionne toujours : | Vérifier que Session Manager fonctionne toujours : | ||
| - | <sxh bash> | + | <sxh bash; |
| aws ssm start-session --target INSTANCE_ID | aws ssm start-session --target INSTANCE_ID | ||
| </ | </ | ||
| </ | </ | ||
| - | ===== 12.4 Limite actuelle ===== | + | ===== 13.4 Limite actuelle |
| - | <WRAP round help> | + | <WRAP round question> |
| - | Pourquoi | + | * Le playbook |
| - | + | * Dans une architecture sans SSH, deux alternatives à Ansible sont envisageables : le plugin de connexion SSM d' | |
| - | Pourquoi | + | * Plus largement, |
| </ | </ | ||
| Ligne 558: | Ligne 620: | ||
| <WRAP round todo> | <WRAP round todo> | ||
| - | Améliorer : | + | L' |
| - | * redémarrage propre de l' | + | Point 1 : Rotation automatique du secret |
| - | * logs | + | |
| - | * sécurisation globale | + | |
| - | </ | + | |
| - | <WRAP round help> | + | Configurer Secrets Manager pour effectuer une rotation automatique du mot de passe RDS tous les 30 jours. |
| - | Quels sont les derniers points faibles | + | |
| - | </ | + | |
| - | ===== Bonus ===== | + | Point 2 : Inventaire Ansible dynamique |
| - | <WRAP round todo> | + | Remplacer le fichier '' |
| - | Mettre en place : | + | |
| - | * systemd | + | Point 3 : Notifications de déploiement |
| + | |||
| + | Ajouter une étape dans le pipeline GitHub Actions | ||
| </ | </ | ||
| - | <WRAP round help> | + | <WRAP round question> |
| - | Pourquoi systemd | + | Questions de synthèse : |
| + | |||
| + | * La rotation automatique du secret en point 1 résout un problème de sécurité, mais crée un risque opérationnel. Lequel, et comment le playbook Ansible doit-il être adapté pour y faire face ? | ||
| + | * Si l' | ||
| + | * Ce pipeline déploie en continu sur la branche '' | ||
| </ | </ | ||
| Ligne 584: | Ligne 646: | ||
| <WRAP round todo> | <WRAP round todo> | ||
| - | Mettre en place un déploiement sans interruption de service | + | Mettre en place un déploiement sans interruption de service. |
| Modifier le playbook Ansible pour : | Modifier le playbook Ansible pour : | ||
| Ligne 635: | Ligne 697: | ||
| </ | </ | ||
| - | <WRAP round help> | + | <WRAP round question> |
| - | * Pourquoi | + | * Ce déploiement réduit l' |
| - | * Comment modifier | + | * Le lien symbolique est basculé avant le redémarrage du service. Si le redémarrage échoue, dans quel état se trouve l' |
| - | * Quelle est la différence entre ce déploiement et un vrai Blue/ | + | * Sans politique de nettoyage, les répertoires de releases s' |
| </ | </ | ||