Menu
Menu

Nous contacter

01 82 83 51 70 infos@globalis-ms.com

6B rue Auguste Vitu

75015 Paris, France

Load-balancing et auto-scaling avec Amazon EC2

Tribune Glob'codeur

Le 11 janvier 2017 par Lucas Delcroix

« Retour

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

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC

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 :

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC

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

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 1

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

2 Editer ce VPC

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 2

DNS hostnames:yes

3 Créer une Internet Gateway

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 3

name tag: lucas internet gateway

4 Attacher l'Internet Gateway au VPC

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 4

attach to VPC: lucas vpc

5 Créer le Subnet

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 5

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

6 Editer ce Subnet

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 6

Modify Auto-Assign Public IP: enable

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

7.1 Editer les Inbound Rules
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 7.1

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

7.2 Editer les Outbound Rules
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 7.2

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

7.3 Changer le nom dans l'onglet Tags
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 7.3

name: lucas security group

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

8.1 Rajouter notre Internet Gateway dans les Routes
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 8.1
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 8.2

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

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape9

10 Créer le Load Balancer

10.0 Choisir le Load Balancer
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 10

Classic Load Balancer

10.1 Définir le Load Balancer
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 10.1

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
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 10.2

Select an existing security group: lucas security group

10.3 Configurer les paramètres de sécurité
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 10.3

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

10.4 Configurer le Health Check
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 10.4

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
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 10.5

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
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 10.6

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

10.7 Vérification et validation
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 10.7

11 Créer Auto Scaling Launch Configuration

11.1 Choisir une Amazon Machine Image
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 11.1

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
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 11.2

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
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 11.3

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
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 11.4

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

11.5 Choix du Security Group
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 11.5

Select an existing security group: lucas security group

11.6 Vérification et validation
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 11.6
11.7 Choix de clé SSH
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 11.7

Choose existing pair key : lucas ssh key

12 Création de l'Auto Scaling Group

12.1 Configuration des détails
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 12.1

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
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 12.2.1

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
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 12.2.2

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
Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 12.2.3

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

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 12.3

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

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 12.4

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

12.5 Vérification et validation

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 12.5

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 :

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 12.5

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

Globalis paramétrage  Load-balancing et auto-scaling avec Amazon EC Etape 12.5

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

Article précédent Article suivant