Nous allons mettre en place le mécanisme permettant une redondance en cas de panne d’une des zones de disponibilité dans AWS. Pour cela, nous avons besoin :
Au minimum de deux machines, une dans chaque zone de disponibilité.
D'un équilibreur de charge permettant de distribuer la charge sur les machines “saines”.
D'un mécanisme de redémarrage automatique en cas de crash d’une machine.
Créez une image disque
Nous avons installé notre blog sur une machine, et nous aimerions pouvoir avoir plusieurs instances avec la même configuration. Pour cela, il nous faut créer une image du disque, afin de pouvoir dupliquer les instances. Nous allons utiliser la machine que nous avons installée dans le chapitre précédent comme source.
En premier lieu, il est préférable que le disque soit au repos pour faire une image de la machine. Ce n’est pas obligatoire, mais vous aurez l’assurance que le démarrage se fera correctement. Pour cela, dans l’interface EC2, cliquez sur votre instance, et dans le menu déroulant Actions, sélectionnez Instance State puis Stop. Cette action arrête votre machine, mais sans la détruire.
Nous allons à présent créer un Snapshot du disque principal de la machine.
Dans la configuration de l’instance, au niveau de Root device, cliquez sur /dev/xvda puis sur le mot vol-xxxxxx à côté de EBS volume. Dans le panneau de gestion du disque qui s’affiche, Cliquez sur Actions, puis sur Create Snapshot.
Sur la gauche, cliquez sur Snapshots et vous verrez votre sauvegarde du disque en cours de création comme ci-dessous :
Une fois terminé, le statut passe au vert :
Cliquez ensuite sur le menu Actions et choisissez Create Image.
Vous avez la possibilité de créer une image associée à deux types de virtualisation :
Paravirtual : les instances démarrent avec un chargeur de démarrage spécial qui chargera votre système ;
Hardware-assisted virtualization : les instances démarrent de manière standard, et peuvent profiter des optimisations matérielles permettant un accès rapide au matériel du système hôte.
Ici, nous allons choisir Hardware-assisted virtualization.
Laissez les autres paramètres par défaut, puis cliquez sur Create. Cliquez sur le nom de l’image pour la voir dans l’interface :
Vous allez maintenant pouvoir lancer des machines avec cette image ; mais avant ça, nous allons détruire notre machine précédente, car nous en avons une copie de sauvegarde et nous n’en avons plus besoin. En la supprimant, vous évitez tout risque de confusion avec celle que vous vous apprêtez à créer.
Pour détruire la machine, allez dans la partie Instances, sélectionnez votre machine, puis cliquez sur Action, puis Instance State, et enfin Terminate.
Créez une Launch Configuration
Afin de créer plusieurs machines sur le même modèle, vous avez besoin de donner à AWS un “patron” qui correspondra à la forme de la machine à créer. Ce patron s’appelle une Launch Configuration.
Dans le service EC2, cliquez sur Launch Configurations et Create Launch Configuration. Vous vous retrouvez devant la même interface que si vous lanciez une machine EC2, mais cette fois, nous n’allons pas prendre une machine Amazon Linux, mais nous allons prendre l’image que nous avons créée précédemment. Cliquez sur My AMIs sur la gauche et choisissez votre image comme ci-dessous :
Choisissez comme type d’instance t2.micro, cliquez sur Next et suivez les étapes :
une fois le type d’instance sélectionné, donnez un nom à votre configuration et cliquez sur Next ;
laissez le disque comme il est, et cliquez encore sur Next ;
dans la partie Configure Security Group, choisissez Select an existing security group et choisissez le groupe de sécurité qui avait été créé précédemment : launch-wizard-1 ;
vérifiez bien que le groupe de sécurité sélectionné autorise le HTTP et le SSH ;
cliquez sur Next et enfin sur Create Launch Configuration ;
Choisissez la même paire de clés que précédemment, et cliquez sur Create Launch Configuration.
Votre configuration de lancement est créée !
Vous avez fait beaucoup de choses, mais ne perdez pas de vue l’objectif qui nous était donné au départ : pouvoir lancer plusieurs machines hébergeant notre blog, dans plusieurs zones de disponibilité. Pour cela, AWS fournit un service de mise à l’échelle automatique.
Créez un Auto-Scaling Group
À présent, nous allons dire à Amazon de créer plusieurs machines à partir de notre Launch Configuration. C’est ce qu’on appelle l’auto-scaling, ou la mise à l’échelle automatique. Prêt ?
Dans le service EC2, cliquez sur Auto Scaling Groups, puis Create Auto Scaling Group. Cliquez sur Use an existing launch configuration et choisissez votre configuration. Cliquez sur Next. Donnez un nom à votre groupe de mise à l’échelle et laissez le nombre d’instances à 1 pour le moment. Sélectionnez votre VPC et vos sous-réseaux publics.
J’ai un gros message d’erreur : No public IP addresses will be assigned ; c'est normal ?
C’est tout à fait normal, nous n’avons pas demandé au cours de la création du groupe d’assigner des adresses IP publiques aux machines. Le message est important, car cela pourrait vous empêcher d’y accéder plus tard. Dans le cas présent, vous allez brancher un équilibreur de charge en frontal sur Internet, donc vous pouvez laisser cette configuration “privée”.
Choisissez ensuite Keep this group at its initial size, afin de ne pas créer de mise à l’échelle automatique. Ce qui nous intéresse pour le moment est de maintenir le nombre de machines constant en cas de panne, et non de s’adapter à la charge.
Cliquez sur Review et enfin Create Auto Scaling Group. Attendez quelques secondes et le groupe va détecter qu’il faut créer une machine :
Dans la partie Instances, vous verrez votre machine apparaître comme par magie :
Il faut à présent tester si en cas de crash le service est bien restauré. Afin de simuler un crash, nous allons manuellement détruire la machine. Pour cela, rendez-vous dans la partie Instances, sélectionnez votre machine et cliquez sur Actions. Choisissez Instance State puis Terminate en prononçant à haute voix et d’un air grave les mots Tu es terminée. Cliquez sur Yes, Terminate et l’instance sera détruite.
Attendez quelques instants et soudain, une autre instance redémarre :
Mais c’est de la sorcellerie !?
Presque ! En réalité, votre groupe de mise à l’échelle a détecté qu’une machine avait disparu de son radar, et a donc décidé d’en démarrer une autre, car vous lui aviez indiqué qu’il devait s’assurer qu’il y en ait toujours une de démarrée. Vous pouvez consulter l’activité du groupe de mise à l’échelle dans l’onglet Activity.
Cela veut dire que je ne peux plus jamais arrêter mes machines ?
Si, bien sûr ! Pour cela, il ne faut plus agir au niveau de l’instance, mais au niveau du groupe de mise à l’échelle : vous devrez le supprimer, ou bien passer sa taille à 0.
Bien ! Notre machine tourne à présent et est autonome ; il est temps d’ajouter un équilibreur de charge pour accéder à vos machines.
Créez un Load Balancer
AWS fournit un service d’équilibrage de charge ou Load Balancer, c’est-à-dire un composant qui va distribuer les requêtes réseau vers différentes machines, afin de répartir la charge sur plusieurs éléments de l’infrastructure, permettant de paralléliser les traitements.
Il existe trois types d’équilibrage de charge dans AWS.
Le Load Balancer applicatif, ou Application Load Balancer
Ce composant est adapté pour équilibrer le trafic HTTP ou HTTPS, et permet une configuration du routage des requêtes. Par exemple, vous pourrez décider que les personne accédant à http://example.com/premium accèdent à un certain groupe de machines, et les personnes accédant à http://example.com/vanilla accèdent à un autre groupe de machines.
Le Load Balancer réseau, ou Network Load Balancer
Ce composant est adapté pour équilibrer le trafic de bas niveau comme le TCP ou les trames TLS. Il est particulièrement efficace lorsqu’une grande performance est requise.
Le Load Balancer classique, ou Classic Load Balancer
Ce Load Balancer est un des tout premiers existant dans AWS ; il permet un équilibrage de charge entre plusieurs machines, aussi bien aux niveaux requête (HTTP, HTTPS) que connexion (TCP, TLS). Il est plutôt recommandé pour le réseau EC2-Classic, et donc à éviter pour les nouveaux projets.
Comment cela fonctionne ?
Dans AWS, l’équilibreur de charge agit de concert avec un élément appelé Target Group.
Allez, on y va ! Les étapes sont :
dans le service EC2, cliquez sur Load Balancers ;
dans la section Load Balancing, cliquez sur Create Load Balancer ;
choisissez Application Load Balancer et cliquez sur Create ;
afin que l’équilibreur de charge soit accessible de l’extérieur, choisissez internet-facing ;
afin de diriger le trafic du site web en HTTP, prenez un listener HTTP ;
choisissez votre VPC dans la liste au niveau de Availability Zones, cochez les deux zones et sélectionnez les sous-réseaux publics pour les associer ;
cliquez sur Next ;
dans la partie Configure Security Groups, choisissez Create a new security group et laissez les paramètres comme ils sont proposés : cela va créer un nouveau groupe de sécurité autorisant le port 80 et appelé load-balancer-wizard-1 ;
cliquez sur Next. Dans la partie Configure Routing, devant Target group, choisissez New target group ;
assurez-vous que le type est réglé sur Instance, le protocole sur HTTP, le port sur 80 et cliquez Next ;
n’enregistrez pas votre instance pour le moment, et cliquez sur Create.
AWS a désormais créé :
un équilibreur de charge de type “Applicatif” ;
un Target Group vide.
Vous pouvez voir ces différents éléments dans les parties Target Groups et Load Balancers du service EC2 :
Comme vous le voyez, votre Target Group est vide, car je vous avais indiqué de ne pas enregistrer les machines. En effet, elles ne seront pas toujours les mêmes en fonction de ce que décidera le groupe de mise à l’échelle.
Comment l’équilibreur de charge peut-il savoir vers quelles machines il faut diriger l’utilisateur ?
Nous allons associer le groupe de mise à l’échelle et le Target Group de l’équilibreur de charge. Pour cela, revenez sur l’écran Auto Scaling Groups et cliquez sur votre équilibreur de charge. Cliquez sur Actions puis Edit. Au niveau de la configuration Target Groups, choisissez le Target Group que vous avez créé précédemment et cliquez sur Save.
En revenant dans l’écran Target Groups, vous verrez que votre groupe a désormais l’instance de notre groupe de mise à l’échelle à l’intérieur :
Il est temps de voir si tout fonctionne.
Testez l’accès depuis le Load Balancer
Rendez-vous dans l’écran Load Balancers, et cliquez sur votre équilibreur de charge. Dans la partie Description, devant DNS, copiez le nom de domaine qui ressemble à website-1234567.eu-west-1.elb.amazonaws.com et collez-le dans votre navigateur.
Ça marche pas ! J’ai une erreur 502 Bad Gateway. Que faire ?
Zut ! Il doit y avoir un problème sur notre instance. En effet, je ne vous ai pas dit, mais tout à l’heure, nous avions démarré le serveur Apache à la main avec
sudo systemctl start httpd
Mais cette configuration n’est pas persistante au démarrage !
Ça veut dire qu’il faut refaire l’image ?
Heureusement, non ! AWS permet de spécifier des commandes à lancer lorsque notre instance démarre au sein d’un groupe de mise à l’échelle. Pour cela, vous allez devoir renseigner des instructions au sein de la Launch Configuration.
Pour cela, allez dans l’écran Launch Configurations, cliquez sur votre configuration et dans Actions, choisissez Copy launch configuration. L’écran de saisie s’affiche, cliquez alors sur Configure details. En dessous de Advanced Details, cliquez dans la zone de texte devant User Data et collez-y la commande de démarrage du serveur Apache que vous avez abordé précédemment :
#!/bin/bash
sudo systemctl start httpd
Profitez-en pour sélectionner en dessous Do not assign a public IP address to any instances ; c’est un paramètre que nous n’avions pas configuré auparavant. Cliquez sur Review et enfin sur Create.
Vous avez désormais deux configurations, l’ancienne et la nouvelle :
Il faut désormais modifier notre groupe de mise à l’échelle pour pointer sur la nouvelle configuration. Dans Auto Scaling Groups, sélectionnez votre groupe de mise à l’échelle, puis Actions et Edit. Devant Launch Configuration, choisissez la nouvelle configuration comme ci-dessous et cliquez sur Save.
Afin de démarrer des machines avec la nouvelle configuration, détruisez la machine actuelle et attendez qu’elle soit redémarrée par le groupe de mise à l’échelle. Après quelques secondes, allez voir dans votre navigateur à l’adresse de votre équilibreur de charge qui ressemblera à : http://website-1234567.eu-west-1.elb.amazonaws.com/ et cela fonctionne !
Vous pouvez désormais augmenter la taille du groupe de mise à l’échelle à 2, pour avoir une machine dans chaque zone de disponibilité.
C’est fini ! Nous avons désormais une infrastructure qui redémarre toute seule, permettant de supporter du trafic réseau tout en communiquant avec une base de données au sein de notre réseau VPC.
En résumé
afin de créer une image utilisable pour démarrer des machines, il faut faire un snapshot d’un disque existant ;
pour pouvoir avoir un groupe de mise à l’échelle automatique, il faut créer une Launch Configuration ;
une Launch Configuration est une configuration générique qui détaille le type de machines et leurs paramètres ;
un groupe de mise à l’échelle permet de maintenir un nombre fixe de machines, ou bien de s’adapter à la charge en rajoutant des machines à l’infrastructure ;
un équilibreur de charge distribue le trafic entre plusieurs instances EC2 ;
il existe trois services d’équilibrage de charge dans AWS, adaptés à des usages différents ;
pour que l’équilibreur de charge puisse savoir quelles machines il doit cibler, celles-ci doivent être dans un Target Group ;
il est possible d’associer un Target Group à un groupe de mise à l’échelle pour que, de manière automatique, toutes les machines gérées par le groupe de mise à l’échelle soient associées au Target Group.
Il est temps désormais de passer à l’ère industrielle. En effet, tout ce que nous avons réalisé jusqu’à présent n’est pas automatisé ! Nous allons donc encore une fois dégainer nos super-pouvoirs de développement, et travailler avec CloudFormation pour automatiser la création de toute cette infrastructure.