Contactez-nous : 01 71 18 39 73 | contact@thecodingmachine.com
Suivez-nous sur Facebook

Déployer une application PHP/MySQL dans le cloud avec Amazon EC2 - Deuxième partie

Dans cette deuxième partie, nous allons voir pas à pas comment faire pour migrer une application PHP/MySQL dans le cloud.

Si vous avez raté la première partie, elle aborder le sujet: pourquoi migrer une application vers le cloud. Elle présente brièvement la solution Amazon EC2 et vous devriez la lire pour vous familiariser avec les termes utilisés dans ce tutorial.
La troisième partie aborde les options "d'autoscaling" qui permettent d'ajuster le nombre de serveurs dynamiquement en fonction de la charge.

Commander une instance

La première étape consiste évidemment à s'inscrire aux services Amazon.
Une fois l'inscription effectuée, vous pouvez accéder à l'"AWS management console" qui permet de créer des instances.

Première étape importante: choisir la région. Amazon permet d'installer son serveur dans l'un de ses 4 datacenter (2 aux Etats-unis, un en Irlande, un dans le Pacifique). Dans notre cas, nous choisirons l'Irlance pour être le plus proche possible de la France et donc bénéficier du meilleur ping possible.

Un clic sur "Launch instance" nous permet de sélectionner le type de machine virtuelle qui va accueillir notre serveur. Nous sélectionnons ici une image Ubuntu, mais vous pouvez choisir votre distribution préférée.
On peut vite être submergé par le nombre de distributions disponibles, et surtout les différentes versions. Pour Ubuntu, la liste des images "officielles" peut être trouvée ici: http://uec-images.ubuntu.com/
A partir de cette liste, on peut retrouver l'identifiant AMI et sélectionner la bonne machine virtuelle:

A savoir lorsque vous choisissez une AMI:
Si vous prenez une AMI 64 bits, vous ne pourrez pas prendre un serveur virtuel bas de gamme. Si vous n'avez pas besoin de la puissance d'une machine 64 bits, choisissez donc une image 32 bits.
Il existe 2 types de stockage chez Amazon: EBS et instance.
Avec un stockage EBS, le disque dur de votre machine virtuelle est "dans le cloud". Vous pouvez arrêter la machine virtuelle, la redémarrer sur un autre serveur et retrouver le contenu de votre disque dur.
A l'opposé, le stockage instance est temporaire. Le contenu du disque dur disparait dès que l'instance est arrêtée. On évitera évidemment de stocker une base de données sur ce type d'instance. Par contre, ce type d'instance peut être parfaitement adapté au démarrage d'un serveur web de soutien.

Pour notre serveur MySQL, nous allons donc choisir une instance AMI Ubuntu Lucid Lynx 32 bits EBS. Le code est "ami-0c87ad78", nous pouvons chercher cette instance dans Amazon:

En cliquant sur "Select", on accède à la création d'instances. Nous choisissons la création d'une instance de type "Small".

La page suivante permet de sélectionner des options supplémentaires, notamment l'utilisation de CloudWatch. CloudWatch est une option Amazon permettant de surveiller l'activité sur les serveurs. CloudWatch est indispensable pour disposer de l'AutoScaling, qui est la fonctionnalité permettant de créer de nouvelles instances à la volée. CloudWatch est donc indispensable pour les serveurs PHP, mais optionnel pour le serveur MySQL. Pour surveiller son activité, nous le prenons quand même pour le serveur MySQL (attention, CloudWatch représente environ 10% du prix du serveur, l'option n'est donc pas donnée!)

La page suivante permet de créer une paire clef publique/clef privée. Contrairement à une machine Linux classique, vous ne pourrez pas vous logguer sur une instance EC2 avec un login et un mot de passe. A la place, il faudra utiliser un couple clef publique/clef privée (fichier .pem) pour effectuer un SSH sur la machine.

L'étape suivante consiste à gérer le pare-feu de la machine virtuelle.
Pour la machine MySQL nous allons ouvrir les ports SSH et MySQL. Les ports MySQL seront ouverts uniquement pour nos autres machines virtuelles PHP.
Parce que nous sommes fainéants, nous ouvrons aussi le port HTTP pour installer PHPMyAdmin.

Note: il faudra insister un peu si vous souhaitez ouvrir des ports d'applications non proposées par défaut par Amazon (comme ouvrir un port PostgreSQL ou FTP). Un article expliquant l'ouverture des ports FTP est disponible ici: http://linuxadminzone.com/install-and-configure-ftp-server-in-amazon-ec2-instance/

Enfin, nous avons sélectionné toutes les options pour l'instance, nous pouvons la créer, en cliquant sur le bouton "Launch":

The instance will appear in the list of instances managed by Amazon:

Se connecter au serveur

La connexion au serveur s'effectue en SSH, avec votre clef publique/privée.
La manière d'utiliser votre clef publique/privée variera suivant le client SSH que vous utiliserez.

Attention, si vous êtes sous Windows et utilisez Putty, le format de clef publique/clef privée d'Amazon n'est pas supporté par défaut. Il faudra convertir la clef en utilisant ce tutorial: http://docs.amazonwebservices.com/AmazonEC2/gsg/2006-06-26/putty.html

Si vous utilisez OpenSSH, il suffit de taper:

ssh -i fichier.pem root@urlduserveur

Note: pour Ubuntu, il faudra utiliser l'utilisateur "ubuntu" et non "root".

Ca y est! Nous sommes logués dans la machine virtuelle. Nous pouvons installer MySQL, PHP, etc...

Installer MySQL

Installer MySQL se fait de manière classique.
Si vous êtes sous Ubuntu:

sudo apt-get install mysql-server

Il faut cependant faire attention à la configuration.
Par défaut, MySQL refuse toute connexion ne venant pas de "localhost", c'est à dire de la machine sur lequel il est installé. Dans notre cas, les serveurs Amazon PHP vont tenter d'accéder à MySQL. Il faut donc autoriser MySQL a écouter les demandes venant de l'extérieur.

Pour cela, il faut d'abord éditer le fichier /etc/mysql/my.cnf et modifier la valeur suivante:

bind-address            = 127.0.0.1

Pour donner accès à n'importe quelle adresse IP, il suffit de commenter la ligne, ou indiquer l'adresse "0.0.0.0".

Cela ne suffit toujours pas à accéder à MySQL de l'extérieur. En effet, les utilisateurs MySQL ne sont autorisés que sur une adresse IP donnée (par défaut localhost). Il faut donc se connecter à la gestion des utilisateurs MySQL (à travers PHPMyAdmin par exemple), puis autoriser un utilisateur que vous utiliserez à être accédé depuis les serveurs extérieurs.

ATTENTION! Soyez-sûr d'avoir mis un mot de passe pour l'utilisateur!
Vous pouvez renforcer la sécurité en autorisant uniquement les adresses IP des serveurs PHP à se connecter.

Le cas des serveurs PHP

Nous avons réussi à mettre en place notre serveur MySQL.
Passons maintenant aux serveurs PHP.

Nous allons pour le monter commander une nouvelle instance.
Nous ne détaillerons pas le processus pas-à-pas puisqu'il est très similaire à la commande de l'instance MySQL. Voici les points que nous modifions par rapport à la première instance:

Image AMI utilisée:

Nous utilisons la même image: une image Ubuntu 32bits ebs. Nous aurions pu utiliser une instance store, comme les serveurs PHP ne contiendront aucune donnée persistante (à part les logs). Cependant, nous verrons dans le 3ème article que l'utilisation d'un store EBS facilite la mise en place de l'autoscaling.

Type d'instance:

Pour les serveurs PHP, nous voulions prendre une instance "Tiny". C'est l'instance la plus petite existant chez Amazon. L'idée était de jouer sur le nombre de machines plutôt que sur la puissance des instances pour dimensionner l'application.
Cependant, 2 obstacles se sont mis en travers de notre chemin: la dernière version d'Ubuntu (10.04) n'était pas compatible avec les instances Tiny lorsque nous avons réalisé les tests. Nous nous sommes donc rabattus sur une instance "small".

Arrivé à ce point, nous installons notre application PHP.
Nous installons donc les packets Apache, PHP, déployons l'application, etc...
Evidemment, nous indiquons l'adresse IP du serveur de base de données MySQL que nous venons d'installer.

A la fin de cette installation, vous devriez enfin avoir une application PHP qui fonctionne. Mais elle n'est pas encore "scalable".

Activer l'autoscaling

Le dernier article de cette série présente les étapes à suivre pour redimensionner automatiquement le nombre de machines en fonction de la charge du serveur.