Introduction
J'ai eu récemment l'occasion de mettre en oeuvre une infrastructure LAMP, reposant sur la plate-forme
d'hébergement de machines virtuelles d'Amazon, nommé
EC2, pour Elastic Compute Cloud.
Le principe de fonctionnement est le suivant : on créé une image AMI
(Amazon Machine Image), contenant le système de fichiers du système
d'exploitation à démarrer. Il est possible d'utiliser et de personnaliser des
AMI fournis par Amazon, ou de la créér de zéro. Le noyau, quant à lui, est à
sélectionner parmi ceux proposés par Amazon.
Ensuite, cette image est téléchargée vers l'infrastructure de stockage
d'Amazon, S3 (Simple Storage Service). Après
enregistrement de celle-ci, elle peut être instanciée en une ou plusieurs
machines virtuelles.
Une particularité de cette solution est que les données stockées dans le
système de fichiers racine des machines virtuelles ne sont pas persistantes.
Une fois une instance terminée (via la commande halt par exemple, ou via
l'interface d'Amazon), celles-ci sont perdues ! Il faut alors utiliser pour les
données applicatives une autre fonctionnalité d'Amazon, les EBS (Elastic Block
Storage). Il s'agit de disques virtuels que l'on
peut ajouter à une instance, accessibles sous forme de simples block devices
que l'on peut formater et monter. A noter que depuis peu il est possible
d'utiliser un EBS en tant que système de fichiers
racine,
ce qui permet de démarrer et d'arrêter une machine à volonté, sans nécessité
d'instancier à nouveau une AMI.
Mise en oeuvre
Ce premier article décrit les étapes à suivre pour créér sa propre image AMI de
Debian 5.0, l'envoyer vers Amazon, et la démarrer. Il vous faudra évidemment
pour cela un compte Amazon Web Services.
Création de l'image
Création d'une image d'une taille de 1 Go et montage sous /mnt/ami :
# EC2_AMI_NAME=debian50
# dd if=/dev/zero of=$EC2_AMI_NAME.img bs=1M count=1024
# mkfs.ext3 -F $EC2_AMI_NAME.img
# mkdir /mnt/ami
# mount -o loop $EC2_AMI_NAME.img /mnt/ami
Installation et exécution de l'outil debootstrap, qui permet le
téléchargement et l'installation d'un système Debian de base dans le point de
montage. Attention, une architecture 32 bits est requise pour pouvoir démarrer
des instances de type Small.
# aptitude update
# aptitude install debootstrap
# debootstrap --arch i386 lenny /mnt/ami
Montage des pseudo systèmes de fichier :
# mount -t proc proc /mnt/ami/proc/
# mount -t devpts devpts /mnt/ami/dev/pts/
Changement du répertoire racine vers le point de montage (chroot) et
installation des packages nécessaires :
# chroot /mnt/ami
# aptitude install udev libc6-xen ssh
Configuration des points de montage dans /etc/fstab tel que recommandé dans
la documentation :
/dev/sda1 / ext3 defaults 1 1
NONE /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
/dev/sda2 /mnt ext3 defaults 0 0
/dev/sda3 swap swap defaults 0 0
Ajout des lignes suivantes au fichier /etc/network/interfaces pour configurer
l'interface eth0 en DHCP :
auto lo eth0
iface lo inet loopback
iface eth0 inet dhcp
Il est également nécessaire d'ajouter sa clé SSH dans
/root/.ssh/authorized_keys, ou de définir un mot de passe pour le compte
root.
Enfin, quitter le chroot, et démonter l'image :
# /etc/init.d/ssh stop
# exit
# umount /mnt/ami
Génération de l'image AMI
Pour la suite des opérations, il est nécessaire de télécharger et
décompresser les Amazon EC2 API
Tools
et Amazon EC2 AMI
Tools.
On installe également les dépendances nécessaires.
# aptitude install ruby libopenssl-ruby unzip sun-java6-jre
# EC2_AMI_TOOLS=ec2-ami-tools-1.3-XXXXX
# EC2_API_TOOLS=ec2-api-tools-1.3-XXXXX
Il faut également générer une clé et un certificat
X.509,
et faire pointer les variables d'environnements ci-dessous vers les fichiers
téléchargés. Ceux-ci seront utilisés pour effectuer des requêtes vers les web
services d'Amazon.
# EC2_PRIVATE_KEY=pk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem
# EC2_CERT=cert-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem
Enfin, noter son EC2 user ID, généralement visible en haut à droite des pages
d'AWS.
# EC2_USER_ID=XXXX-XXXX-XXXX
Création de l'image AMI :
# export EC2_HOME=$EC2_AMI_TOOLS
# $EC2_AMI_TOOLS/bin/ec2-bundle-image -i $EC2_AMI_NAME.img \
-k $EC2_PRIVATE_KEY -c $EC2_CERT -u $EC2_USER_ID -r i386
Upload sur S3
Il faut maintenant télécharger l'image vers Amazon S3. Pour cela, il est
nécessaire de récupérer son Access Key ID et sa Secret Access Key sur la
page Security
Credentials.
Il faut également sélectionner la région où sera localisée l'instance (US ou
EU), ainsi que la bucket
S3 où sera stockée l'AMI.
# EC2_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXX
# EC2_SECRET_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# EC2_REGION=EU
# EC2_BUCKET=XXXXXXXX
# $EC2_AMI_TOOLS/bin/ec2-upload-bundle -m /tmp/$EC2_AMI_NAME.img.manifest.xml \
-a $EC2_ACCESS_KEY -s $EC2_SECRET_KEY -b $EC2_BUCKET \
--location $EC2_REGION
Enregistrement de l'instance
Il est nécessaire de déclarer l'image à Amazon pour pouvoir l'instancier.
L'option --url est nécessaire pour préciser que l'on s'adresse à la région
Europe d'EC2.
# export EC2_HOME=$EC2_API_TOOLS
# export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.12
# $EC2_API_TOOLS/bin/ec2-register \
--url http://eu-west-1.ec2.amazonaws.com \
-n $EC2_AMI_NAME \
$EC2_BUCKET/$EC2_AMI_NAME.img.manifest.xml
La commande retourne l'ID de l'AMI qui vient d'être enregistrée.
Instanciation
L'instanciation peut également se faire via une requête sur AWS :
# EC2_AMI_INSTANCE_ID=ami-XXXXXXXX
# EC2_AKI=aki-7e0d250a
# EC2_RAMDISK=ari-7d0d2509
# $EC2_API_TOOLS/bin/ec2-run-instances $EC2_AMI_INSTANCE_ID \
-K $EC2_PRIVATE_KEY \
-C $EC2_CERT \
--kernel $EC2_AKI --ramdisk $EC2_RAMDISK \
--region eu-west-1
Le noyau utilisé (aki-7e0d250a) est un 2.6.21.7-2.fc8xen, suffisamment
récent pour l'utilisation de udev. Ce n'est pas le cas du noyau par défaut.
Connexion à la machine
Les instances créées peuvent être listées à l'aide de la commande suivante :
# $EC2_API_TOOLS/bin/ec2-describe-instances -K $EC2_PRIVATE_KEY \
-C $EC2_CERT --url http://eu-west-1.ec2.amazonaws.com
Parmi les informations obtenues, on peut notamment connaître le nom DNS public
de l'instance créé, de la forme
ec2-XXX-XXX-XXX-XXX.eu-west-1.compute.amazonaws.com. A noter que ces
informations sont également disponibles via l'interface
web.
Enfin, il ne reste plus qu'à se connecter avec le compte root à sa nouvelle
machine !