Amazon Web service - Mon infrastructure

Construction d’une infrastructure serveur avec AWS

Bonjour, Bonsoir, vous allez bien ?

Il y a quelques semaines de cela, j’ai eu l’occasion de m’intéresser de plus près au service web d’amazone: Amazon Web Service (AWS).

J’avais besoin de pouvoir migrer une application web vers un système offrant une meilleur sécurité en terme de disponibilité, je me suis donc atteler à mettre une place l’infrastructure suivante :

  • Deux serveurs virtuel EC2 avec volumes de stockage synchronisé entre eux
  • Une instance RDS Mysql avec Déploiements multi-AZ pour une haute disponibilité
  • Un Load Balancer ELB permettant de passer d’un EC2 à l’autre en fonction de la charge et de la disponibilité

AWS-shema-Ec2-load-balancer

Au premier abord cela peut sembler assez compliqué (nouveau dans l’univers AWS, j’ai du chercher mon chemin), il faut monter toutes nos briques en commençant par un VPC (Virtual private cloud) qui est notre réseau privé dans lequel on va monter notre infrastructure et on la connectera ensuite à « l’internet mondial ».

Mise en place du Virtual Private Cloud ( VPC ) sur AWS

Pour commencer, rendez vous sur le dashboard VPC.
Par défaut, j’ai travaillé dans la zone « Frankfurt ». Vous pouvez en changer dans le menu en haut à droite, mais veillez alors à conserver la même partout.

On va donc lancer la création de notre vpc directement depuis cette page en cliquant sur « Create Vpc ».

Le name tag est un nom qui vous permettra de l’identifier ensuite.
le CIDR block est la plage d’ip disponible pour votre VPC, pour ma pars j’ai utilisé simplement ce qu’AWS conseil, c.à.d. 10.0.0.0/16.

De cette manière j’ai choisi de ne pas passer par le Wizard Aws. Nous allons faire les choses une à une de cette façon. Toutefois, rien ne vous empêche d’utiliser le Wizard et d’ensuite vérifier votre configuration en suivant la suite de cet article.

Garder cette page avec ce Vpc créer dans un onglet, vous pourriez trouver utile de revenir voir les noms assigné. Ouvrez ensuite un nouvel onglet avec « Subnets » (dans le menu à gauche). Nous allons ajouter deux sous réseaux, un pour chacun de nos EC2 dans des zones de disponibilités différentes (permettant que si l’une des zones crash, l’autre restera disponible).

Cliquez donc sur « Create Subnet »

Name tag : comme pour le vpc, c’est un nom pour le distinguer. Je lui ai mis le même nom que celui du VPC avec la lettre A en plus pour le premier et B pour le second.
VPC : sélectionnez votre Vpc fraichement créer
Availability Zone : Choisissez la zone 1a pour le premier subnet, et 1b pour le second subnet que vous créerai juste après.
CIDR block : Pour ma pars j’ai utilisé 10.0.2.0/24 pour le A et 10.0.3.0/24 pour le B.

Une fois les subnets créer, on passe le plus simplement du monde à l’élément suivant : « Route Tables« . Normalement une route existe déjà (Name vide), si ce n’est pas le cas cliquez sur « Create Route Table« . Entrez y un nom et sélectionné votre Vpc.

Cliquez ensuite sur la route créée et rendez vous dans l’onglet « Subnet Associations« . Il s’agit là d’éditer afin d’associer vos deux subnet à cette route.

On continue ensuite en se rendant dans « Internet Gateways« , cliquez sur « Create Internet Gateway » et donnez donc un nom à cette belle chose.
Cliquez ensuite sur votre gateways et cliquez sur le bouton « Attach to VPC » en haut. Sélectionné le Vpc que vous aviez crée tout à l’heure.
Notez l’id de votre Gateway (commençant par igw) et revenez sur « Route Tables », cliquez sur votre route et dans l’onglet en bas allez sur « Routes ». CLiquez sur Edit et ajouter

Destination: 0.0.0.0/0
Target: igw-…

Et sauvegarder.

Ensuite, quelques vérification :
Rendez vous à nouveaudans le menu de gauche, dans la partie « Security » et « Networdk ACLs« . Normalement une entrée existe déjà pour votre Vpc. Vérifier qu’en cliquant dessus et en allant dans Subnet Associations vous ayez les subnets créer. Si ce n’est pas le cas cliquez sur Edit pour le modifier.

Vous pouvez également lire la doc officiel et éventuellement utiliser le Wizard.

Ajout des instances EC2

Nous allons maintenant créer nos instance EC2, rendez vous sur le dashboard EC2.

EC2-instance

Cliquez sur « Launch Instance« . La première étape consiste à choisir votre type de distribution. Etant un fan de Debian, il faut aller la chercher dans « AWS Marketplace » et utiliser le moteur de recherche. Après une recherche sur Debian j’ai donc choisis/Select « Debian GNU/Linux 8 (Jessie) ».

L’étape suivante consiste à choisir la puissance du serveur voulu. Choisissez judicieusement (le changement est pas évident) et cliquez ensuite sur « Next: Configure Instance Details« .

Il faut maintenant configurer les petite joyeuseté qu’on a pris soin de préparé avant: notre Vpc dans Network et le subnet sur lequel l’instance dois tourner (Subnet A pour la première instance, et le B pour la seconde que vous allez créer ensuite).
Pour le champ « Auto-assign Public Ip« , choisissez « Enable » (contrairement au screen ci-dessous)

ec2-configure

Next: Add storage

Nous allons ici ajouter un espace de stockage pour notre EC2. Il sera possible ensuite de le réadapter si nécessaire (ça nécessite de couper l’EC2 et faire un snapshot de l’instance, compter ~30 minutes)

Next: Tag Instance
On s’en fout un peut 🙂

Next: Configure Security Group

C’est ici que l’on va autoriser l’accès à l’EC2 de l’extérieur (port autorisé, …)

Pour ma pars j’ai ceci (ouais y a pas mal de choses d’ouverte, notamment All TCP, à cause de ce joyeux filezilla qui ne vous permettra pas de vous connecter en Ftp sinon)

sg

Ensuite vous avez une étape de Review et finalement vous pouvez faire un « Launch » de l’instance.

Pour lancer la seconde instance, vous pouvez vous rendre dans « Instances » > « Instances » dans le menu de gauche, sélectionner votre instance puis en haut dans Actions choisir « Launch More Like This »

Capture d’écran 2015-11-24 à 22.54.29

Veillez en particulier à adapter « Instance Details » en cliquant sur « Edit Instance Details » pour modifier le Subnet.

L’étape final consiste à rendre ce serveur accessible depuis l’extérieur et pour cela rendez vous via le menu de gauche dans « Network & Security » > « Elastic IPS » et cliquez sur « Allocate New Address« .
Cliquez ensuite sur cette ip et dans le menu Actions choisissez « Associate Address »

Capture d’écran 2015-11-24 à 22.58.31

Sélectionnez votre instance EC2 créer et sauver. Répétez l’opération pour la seconde instance EC2.

Cela vous permettra d’accéder au serveur depuis le web, pour des accès ssh, ftp, …

Ajout de l’instance RDS Mysql pour la base de données

Cette partie est assez simple en comparaison de l’étape précédente. Rendez vous sur la page des instances de RDS ici et cliquez sur le bouton « Launch Db Instance« .
Choisissez ensuite votre modèle de base de données, pour ma pars il me fallait une base de type Mysql.
Cochez ensuite « Yes, use Multi-AZ Deployment and Provisioned IOPS Storage as defaults while creating this instance » (Multi-AZ Deployment permet de rendre la base de données disponible dans plusieurs zone de disponibilités)

En continuant, nous arrivons donc sur un écran de configuration plus précis
aws-rds-mysql

DB Instance Class : le type de capacités du serveur
Storage Type : J’ai choisis magnetic, ma base de données étant petit et n’atteignant pas 5Go de taille. Pour de plus grosse base de données vous pouvez utiliser les propositions SSD.

Sur l’étape suivante, vous allez pouvoir configurer notamment les informations réseaux.

aws-rds-mysql-network

VPC : Sélectionner votre Vpc crée plus haut.
Publicly Accessible : Attention, vous ne pourrez plus changer ce paramètre ensuite. Il autorisera la base de donnée à être accessible en dehors de votre VPC. Dans tout les cas, vos instances EC2 qui sont dans le même VPC y auront accès, mais si vous choisissez NO une connection extérieur sera refusée.
Pour « publicly accessible » j’ai sélectionné YES dans mon cas car j’effectue une maintenance et un monitoring régulier qui nécessite une facilité d’accès à la base de données. Si vous n’en avez pas besoin, privilégié évidemment en DB isolé, c’est plus sécure 🙂
Le groupe de sécurité : Je réutilise déjà un existant, mais n’hésite pas à en créer un nouveau.

Le suite de la configuration est assez logique, type de db, nom, backups, …

Ajout du Load Balancer

Avec tout ce que nous avons déjà crée, cette opération devrait se dérouler assez facilement.

Rendez vous, via l’onglet de gauche dans la section Load Balancers et choisissez « Create Load Balancer »

Donnez lui un nom et choisissez le VPC pour lequel le Load balancer va agir. Il s’agira dès lors d’ajouter les subnets et instances pour lesquels le load balancer va répartir la charge. Le reste des opérations sont des choses par lesquelles vous êtes déjà passé, vous ne devriez pas avoir de mal.

Une fois le load balancer crée, voici quelques petite choses que vous pouvez créer/adapter en cliquant sur le load balancer via les onglets en bas.

Dans Health Check

  • Diminuer Interval et Timeout afin de réagir plus vite en cas de crash d’un serveur.
  • Ping Target : pour ma pars j’ai créer un fichier check.php sur mon serveur (dans /var/www, la zone accessible sans vhost) afin d’effectuer le check si le serveur est Up. Cela me permet également de vérifier que php tourne et également, si je veux désactiver le serveur sans le couper il me suffit de renommer le fichier pour que le load balancer passe sur l’autre serveur.
  • Dans Monitoring : Cliquez sur Create Alarm afin de recevoir un mail quand une instance plante et/ou quand le nombre d’Http 5xx est trop élevé (Sum HTTP 5xxs).

Vous allez ensuite devoir mettre en place un lien entre votre nom de domaine actuel et le nom de domaine de votre load balancer (NAMELB-0101010101.eu-central-1.elb.amazonaws.com). Amazon vous conseille de mettre en place un champ CName, en effet l’ip du load balancer changer et vous ne pourrez mettre un champs A avec l’ip.

Toutefois, cela nécessite une mise à jour rapide des Dns et des prestataires tel qu’Ovh ne le font pas assez rapidement. Je vois à cette problématique deux solutions : soit utiliser ISPConfig par exemple pour géré nos dns (via un serveur supplémentaire surement) ou alors, et c’est la solution que j’ai choisis, mettre en place le routing via le service Route 53 d’Amazon Web Service

Synchronisation des deux serveurs

Il va donc falloir synchroniser les deux serveurs, pour cela je vous renvoi à deux articles précédent, à savoir
Synchroniser deux serveur avec rsync (une fois par minute)
Et sa version améliorer permettant la synchro en temps réel avec Rsync et Inotify (un peu gourmande en cpu, mais avec un bon serveur ça tiens la route).

J’espère que ceci pourra vous aider.
A savoir que j’ai écris cette doc après la mise en place de mon infrastructure, j’espère ne rien avoir oublier mais si jamais vous pouvez toujours me poser vos questions dans la zone commentaire ci-dessous.

Laisser un commentaire

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