Load-balancing et auto-scaling avec Amazon EC2

Explication pas à pas du paramétrage de EC2 et Elastic Load Balancer.


Share on FacebookShare on Google+Share on LinkedInTweet about this on Twitter

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 :

Article Lucas 1

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 :

Article Lucas 2

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

Article Lucas 3

name: lucas vpc
CIDR block: 172.31.0.0/16
tenancy: default

2 Editer ce VPC

Article Lucas 4

DNS hostnames:yes

3 Créer une Internet Gateway

Article Lucas 5

name tag: lucas internet gateway

4 Attacher l’Internet Gateway au VPC

Article Lucas 6

attach to VPC: lucas vpc

5 Créer le Subnet

Article Lucas 7

name: lucas subnet
VPC: lucas vpc
Availability Zone: No Preference
CIDR block: 172.31.0.0/20

6 Editer ce Subnet

Article Lucas 8

Modify Auto-Assign Public IP: enable

7 Editer la « default » Security Group créée automatiquement pour notre VPC

7.1 Editer les Inbound Rules

Article Lucas 9

type: ALL Traffic
protocol: ALL
Port Range: ALL
Source: 0.0.0.0/0

7.2 Editer les Outbound Rules

Article Lucas 10

 

type: ALL Traffic
protocol: ALL
Port Range: ALL
Destination: 0.0.0.0/0

7.3 Changer le nom dans l’onglet Tags

Article Lucas 11

name: lucas security group

8 Editer la Route Table créée automatiquement pour notre VPC

8.1 Rajouter notre Internet Gateway dans les Routes

Article Lucas 12

Article Lucas 13

Destination: 0.0.0.0/0
Target: lucas internet gateway
Status: Active
Propagated: No

8.2 Changer le nom dans l’onglet Tags

Article Lucas 14

Key:Name
Value: lucas route table

9 Importer une clé SSH

Article Lucas 15

10 Créer le Load Balancer

10.0 Choisir le Load Balancer

Article Lucas 16

Classic Load Balancer

10.1 Définir le Load Balancer

Article Lucas 17

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 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

Article Lucas 18

Select an existing security group: lucas security group

10.3 Configurer les paramètres de sécurité

Article Lucas 19

Note : Rien à faire ici comme on ne fait que du simple HTTP.

10.4 Configurer le Health Check

Article Lucas 20

 

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

Article Lucas 21

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

Article Lucas 22

Note : Pas d’intérêt d’en ajouter pour la suite

10.7 Vérification et validation

Article Lucas 23

11 Créer Auto Scaling Launch Configuration

11.1 Choisir une Amazon Machine Image

Article Lucas 24

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

Article Lucas 25

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

Article Lucas 26

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

Article Lucas 27

Note : mon image était basée sur une machine de 8GB donc j’ai laissé comme ça

11.5 Choix du Security Group

Article Lucas 28

Select an existing security group: lucas security group

11.6 Vérification et validation

Article Lucas 29

11.7 Choix de clé SSH

Article Lucas 30

Choose existing pair key : lucas ssh key

12 Création de l’Auto Scaling Group

12.1 Configuration des détails

Article Lucas 31

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

Article Lucas 32

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

Article Lucas 33

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

Article Lucas 34

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

Article Lucas 34bis

 

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

Article Lucas 35

Note : Idem pour les tags, pas d’intérêt ici

12.5 Vérification et validation

Article Lucas 36

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 :

Article Lucas 37

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) :

Article Lucas 38

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).

Publié le par Lucas DELCROIX

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *