2010-01-16
Thomas Martin
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ée 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 BlockStorage). 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.
Ce premier article décrit les étapes à suivre pour créér sa propre image AMI Debian 5.0, l'envoyer vers Amazon, et la démarrer. Il vous faudra évidemment pour cela un compte Amazon Web Services.
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
Pour la suite des opérations, il est nécessaire de télécharger et décompresser les Amazon EC2 APITools et Amazon EC2 AMITools. 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
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 SecurityCredentials. Il faut également sélectionner la région où sera localisée l'instance (US ouEU), 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
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.
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.
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 !