Load-balancing et auto-scaling avec Amazon EC2
Tribune Glob'codeurExplication pas à pas du paramétrage de EC2 et Elastic Load Balancer.
Tout d'abord, parlons de load balancing, tout le monde doit connaitre le principe mais une piqure de rappel ne fait pas de mal : plutôt que d'avoir un serveur qui absorbe toutes les requêtes entrantes, on a plusieurs serveurs et les requêtes sont dispatchées sur ces derniers par le load balancer :
Avec Amazon Elastic Load Balancer on n'a pas besoin d'affecter une machine à ce travail spécifique de routage des requêtes, AWS s'en occupe pour nous.
Cependant un problème subsiste : oui on a plusieurs machines qui nous permettent d'avoir une répartition de charge et un failover important mais combien faut-il exactement de machines et que fait-on si l'on a mal dimensionné notre architecture (l'architecture ne tient pas ou on a 10 fois trop de machines) ?
Et bien la solution c'est l'auto-scaling :
Effectivement Amazon propose des "Auto Scaling Group" qui permettent de gérer des règles spécifiques pour scale-in ou scale-out notre nombre de machines là où sans amazon il faudrait surveiller manuellement ou avec des scripts pour adapter notre nombre de machines.
Maintenant passons à la pratique : comment peut-on bien faire ça dans notre console Amazon ?
C'est un poil fastidieux puisque pour monter tout cela nous allons avoir besoin de :
- 1 Virtual Private Cloud (VPC)
- 1 VPC Internal Gateway
- 1 VPC Subnet
- 1 VPC Security Group
- 1 VPC Route Table
- 1 EC2 Key Pair
- 1 EC2 Elastic Load Balancer
- 1 EC2 Amazon Machine Image (AMI)
- 1 EC2 Auto Scaling Launch Configuration
- 1 EC2 Auto Scaling Group
- 2 CloudWatch Alarms
- 2 Scaling Policies
Heureusement rien de bien compliqué, cela prend juste un peu de temps et il faut faire attention à ses configurations.
J'ai effectué ces différentes étapes plusieurs fois dans la même journée pour arriver à bien tout détailler avec un compte amazon tout neuf bénéficiant de la première année gratuite sur beaucoup de services AWS et je n'ai pas été facturé. L'intégralité de la procédure peut donc être testée sans aucun frais.
1 Créer le VPC
name: lucas vpc
CIDR block: 172.31.0.0/16
tenancy: default
2 Editer ce VPC
DNS hostnames:yes
3 Créer une Internet Gateway
name tag: lucas internet gateway
4 Attacher l'Internet Gateway au VPC
attach to VPC: lucas vpc
5 Créer le Subnet
name: lucas subnet
VPC: lucas vpc
Availability Zone: No Preference
CIDR block: 172.31.0.0/20
6 Editer ce Subnet
Modify Auto-Assign Public IP: enable
7 Editer la "default" Security Group créée automatiquement pour notre VPC
7.1 Editer les Inbound Rules
type: ALL Traffic
protocol: ALL
Port Range: ALL
Source: 0.0.0.0/0
7.2 Editer les Outbound Rules
type: ALL Traffic
protocol: ALL
Port Range: ALL
Destination: 0.0.0.0/0
7.3 Changer le nom dans l'onglet Tags
name: lucas security group
8 Editer la Route Table créée automatiquement pour notre VPC
8.1 Rajouter notre Internet Gateway dans les Routes
Destination: 0.0.0.0/0
Target: lucas internet gateway
Status: Active
Propagated: No
8.2 Changer le nom dans l'onglet Tags
Key:Name
Value: lucas route table
9 Importer une clé SSH
10 Créer le Load Balancer
10.0 Choisir le Load Balancer
Classic Load Balancer
10.1 Définir le Load Balancer
Load Balancer name: lucasloadbalancer
Create LB Inside: lucas vpc
Create an internal load balancer: no
Listener Configuration:
- Load Balancer Protocol: HTTP
- Load Balancer Port: 80
- Instance Protocol: HTTP
- Instance Port: 80
SELECT SQL_NO_CACHE SQL_NO_CACHE SQL_NO_CACHE SQL_NO_CACHE SQL_NO_CACHE SQL_NO_CACHE SQL_NO_CACHE SQL_NO_CACHE SQL_NO_CACHE Subnets
- Selected subnets: lucas subnet
Note : c'est le seul endroit où notre nom ne doit pas avoir d'espaces
10.2 Assigner le Security Group
Select an existing security group: lucas security group
10.3 Configurer les paramètres de sécurité
Note : Rien à faire ici comme on ne fait que du simple HTTP.
10.4 Configurer le Health Check
Note : les paramètres par défaut sont suffisants, on peut juste changer le index.html en index.php en fonction du type d'application
10.5 Ajout des instances EC2
Note : cela ne nous intéresse pas car c'est l'auto scaling qui s'occupera de mettre des machines
10.6 Ajout de tags
Note : Pas d'intérêt d'en ajouter pour la suite
10.7 Vérification et validation
11 Créer Auto Scaling Launch Configuration
11.1 Choisir une Amazon Machine Image
Note : Dans le cadre de mon étude, j'ai créé ma propre image qui contenait php7 et nginx pour faire un serveur web, mais ce n'est pas forcément le but de ce "cluster" de machines. De nombreuses images gratuites existent et sont fournies par Amazon : https://aws.amazon.com/marketplace/search/results?searchTerms=ami
11.2 Choisir le gabarit des machines
Note : ici j'ai choisi le gabarit qui rentrait dans le compte gratuit mais ça marche avec n'importe lequel (attention aux tarifs).
11.3 Configuration
Basic :
Name: lucas launch configuration
Purchasing option: no
IAM role: None
Monitoring: no
Avanced :
Kernel ID: use default
RAM Disk ID: use default
User data: as text, empty
IP Address Type: Assign a public IP address to every instance.
Note : attention à IP Address Type, ce paramètre secondaire est très important sinon votre machine sera innacessible
11.4 Choix du stockage
Note : mon image était basée sur une machine de 8GB donc j'ai laissé comme ça
11.5 Choix du Security Group
Select an existing security group: lucas security group
11.6 Vérification et validation
11.7 Choix de clé SSH
Choose existing pair key : lucas ssh key
12 Création de l'Auto Scaling Group
12.1 Configuration des détails
Basic :
launch configuration: lucas launch configuration
group name: lucas auto scaling group
group size: 3
network: lucas vpc
subnet: lucas subnet
Advanced :
load balancing: yes
classic load balancers: lucasloadbalancer
target group:
health check type: EC2
Health Check Grace Period: 60
Monitoring:
Instance protection:
12.2 Configuration de la politique de scaling
C'est un peu difficile de montrer la configuration avec des screenshots car beaucoup de fenêtres s'ouvrent à cette étape.
Il faut d'abord cliquer sur "Use scaling policies to adjust the capacity of this group" puis "add a new alarm" pour voir apparaitre le choix des alarmes ci-dessous.
12.2.1 Création de l'alarme CloudWatch de scale-in
Whenever Average of CPU Utilization Is >= 10 Percent
For at least 1 consecutive period(s) of 1 Minute
Name of alarm: awsec2-lucas-launch-configuration-CPU-Utilization
12.2.2 Création de l'alarme CloudWatch de scale-out
Whenever Average of CPU Utilization Is <= 5 Percent
For at least 1 consecutive period(s) of 1 Minute
Name of alarm: awsec2-lucas-launch-configuration-High-CPU-Utilization
12.2.3 Paramètres d'augmentation et diminution
Scale between 2 and 4 instances.
Increase Group Size > Create a simple scaling policy
Name: Increase Group Size
Execute policy when > add a new alarm
Take the action: Add 1 instances
And then wait: 60 seconds
Decrease Group Size > Create a simple scaling policy
Name: Decrease Group Size
Execute policy when > add a new alarm
Take the action: Remove 1 instances
And then wait: 60 seconds
12.3 Configuration des notifications
Note : Je n'ai pas mis de notification car ce n'était pas le but ici, mais ça peut permettre de suivre l'évolution de notre cluster
12.4 Configurations des tags
Note : Idem pour les tags, pas d'intérêt ici
12.5 Vérification et validation
Et voilà c'est terminé ! Notre groupe est configuré et lié à notre load-balancer : selon les réglages que l'on a mis (ici le CPU) leur évolution, Amazon rajoutera ou enlèvera le nombre de machines automatiquement dans l'intervalle défini.
Si tout s'est bien passé, on peut voir notre groupe dans l'interface :
J'ai volontairement fait démarrer le cluster avec 3 machines sous exploitées, on constate donc qu'au bout de 5 minutes ce nombre est réduit au minimum de l'intervalle défini (entre 2 et 4) :
Tout fonctionne donc comme prévu. On peut récupérer le nom DNS de notre load balancer et le taper dans un navigateur pour vérifier que tout se passe comme prévu :
- le nombre de machines oscille entre 2 et 4
- lorsque la moyenne de CPU passe au dessus de 10% sur 1min on rajoute une machine
- lorsque la moyenne de CPU passe en dessous de 5% sur 1min on rajoute une machine
Ce billet est déjà suffisamment long, et pourtant je ne suis pas rentré dans les détails de configuration : ici on a juste le minimum pour faire fonctionner le cluster avec des règlages artitraires. C'est toujours mieux de pouvoir adapter les règlages sur une configuration que l'on sait stable plutôt que de partir de 0.
Ce qu'il resterait à faire pour configurer une vraie application : faire des règles plus précises que "accepter tout le trafic sur tous les ports", en théorie seul le load balancer devrait être accessible de l'extérieur, rajouter le système de certificat pour gérer le HTTPS, étudier les solutions pour mettre à jour le code source de notre application.
L'avantage est que l'on peut tester tout cela sans aucun frais (il suffit de créer un nouveau compte amazon).
N'hésitez pas à essayer, c'est formateur et cela fait plaisir de voir son petit cluster fonctionner à la fin (j'ai simulé des pics de charge avec siege pour voir l'effet du scale in, c'est relativement épanouissant).