Debian 601 Memo AMI EC2           Script Shell Bash       MEMO       Parent Directory


#
# Welcome - Bienvenue.
#




#
# How to create an... AMAZON MACHINE IMAGE ( AMI ) for EC 2 Amazon ! ( DEBIAN SQUEEZE 6.0.1 )
#




#
# Mon image a été réalisée sur un DURON 1500 sur mon réseau ethernet local. Donc, pas besoin d'une "bécane" de course.
#
# Le but de ce mémo, est de fournir l'info pour partir d'une machine personnelle fraichement installée sous SQUEEZE 6.0.1 ,
#
# créer une image système chrootée, la transférer sur l'espace de stockage S3, créer l'instance EC 2, et enfin la lancer. 
#
# Après, vous pouvez voir mes scripts d'installation serveur Cloud : voir mon site : http://marcfiasse.com/
#
# A noter qu'à ce stade de l'image, on ne peut faire que de Lancer, Détruire, ou Rebooter l'instance EC 2.
# 
# Pas encore de Start Stop, d'archivage, mais, je regarde désormais pour les volumes EBS et le comment faire !
#




#
# Etape numero 1 ( en démarrant de rien )
#




#
# Installer Debian Squeeze suivant la procédure de mon site ( 1ère partie ) : http://debian-install.info/
#
# Ne pas installer donc les serveurs, ect... juste la base + ssh + samba.
#
# Lorsque l'accès au PC linux est établi par ssh sur votre réseau local et via putty sur le poste Windows,
#
# installer Samba, et peut être sécuriser l'accès SSH par un certificat.
# 
# Samba va permettre de créer un partage sur votre réseau local, et ainsi récupérer localement 
#
# les clés qui ont été téléchargées sur le site Amazon.
#
# ( Voir l'espace sécurité sur le panel Amazon : certificat X509, clé secrète, ect... ) 
#
# Ces clés pourraient aussi être transférées sur le PC linux par un support tel que disquette, cd, par exemple...
#
# En tous cas,... pas par FTP sur un espace perso, puis les récupérer par un wget ! :-)
#
# Bon, maintenant, allez ! ... à l'essentiel ! :)
#




#
# Etape numero 2
#




#
# Installer l'image linux XEN sur la machine locale.
#
# Pour lister les différentes images : apt-cache search linux-image
#




echo y > /etc/yes3.txt

aptitude install linux-image-2.6.32-5-xen-686 < /etc/yes3.txt

reboot





#
# -------------------------------------
#

#
# Vérifier que le boot se fait bien sous XEN ( en principe GRUB fait booter par défaut sous XEN )
#
#
    uname -r
#


#
# Installer des paquets, ajout de sources non free, update, upgrade
#




apt-get install rsync 


apt-get install unzip


apt-get install curl < /etc/yes3.txt



echo "" >> /etc/apt/sources.list
echo "deb http://ftp.fr.debian.org/debian/ squeeze main contrib non-free" >> /etc/apt/sources.list
echo "deb-src http://ftp.fr.debian.org/debian/ squeeze main contrib non-free" >> /etc/apt/sources.list



aptitude update


aptitude safe-upgrade < /etc/yes3.txt


aptitude install ruby < /etc/yes3.txt


aptitude install libopenssl-ruby


aptitude install debootstrap


aptitude install sun-java6-jre < /etc/yes3.txt




#
# Récupération des outils AMAZON API et configuration de ceux-ci
#




echo "Adding AMI and API Tools..."

rm -rf /home/ec2 || true

mkdir -p /home/ec2


curl -o /tmp/ec2-api-tools.zip http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip


curl -o /tmp/ec2-ami-tools.zip http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.zip


unzip /tmp/ec2-api-tools.zip -d /tmp/

unzip /tmp/ec2-ami-tools.zip -d /tmp/


cp -r /tmp/ec2-api-tools-*/* /home/ec2/.

rsync -av /tmp/ec2-ami-tools-*/ /home/ec2


rm -rf /tmp/ec2-a*

rm -rf /usr/local/bin/ec2-*


echo 'export PATH=$PATH:/home/ec2/bin' >> /etc/profile

echo 'export EC2_HOME=/home/ec2' >> /etc/profile

echo 'export PATH=$PATH:/home/ec2/bin' >> /etc/profile.d/ec2.sh

echo 'export EC2_HOME=/home/ec2' >> /etc/profile.d/ec2.sh

echo "done adding ec2 tools."




#
# /////////// PARTIE DE DONNEES CONFIDENTIELLES ET PRIVEES ( voir espace sécurité Amazon )
#
#
# EC2_USER_ID se trouve en haut de la page du compte, à droite.
#
# EC2_BUCKET doit être créer dans l'espace de stockage S3. uniquement employer minuscule, chiffres ou le signe -
#
# Les autres infos se trouvent sur la page sécurité de votre compte Amazon.
#
# Il faut créer certains certificat par le site Amazon, puis les enregistrer sur votre pc de travail.
#
# Vérifier que la région EU correspond au bucket créé, et dans l' EC 2.
#
# Sinon, le choix du Kernel de démarrage est différent ( voir page 3 : http://ec2-downloads.s3.amazonaws.com/user_specified_kernels.pdf )
#




EC2_PRIVATE_KEY=/samba/pk-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem

EC2_CERT=/samba/cert-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem

EC2_USER_ID=xxxx-xxxx-xxxx

EC2_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

EC2_SECRET_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

EC2_REGION=EU

EC2_BUCKET=abc-123



EC2_AMI_NAME=debian_xxxxxxxxxxxxxxxxxxxxxxxxxx




#
# /////////// FIN DE PARTIE DE DONNEES CONFIDENTIELLES ET PRIVEES
#




#
# Création d'une image de 10 Go . C'est le maximum actuellement en store-instance ! 
#
# Il faut naturellement cet espace libre sur le disque du pc local ! 
# 
# Cela conditionne l'espace qu'on peut envisager sur le Cloud plus tard. 
#
# NB :  - si l'image est créée à 1Go, on ne pourra pas aller plus loin que 1 Go sur le serveur ... !
#
#       - plus on met de Go, plus il faut du temps pour créer l'image ci plus bas !
#
#       - Après test > 10 go = ERROR: the specified image file xxxxxx is too large
#





EC2_AMI_TOOLS=/home/ec2

EC2_API_TOOLS=/home/ec2

cd /home/

dd if=/dev/zero of=$EC2_AMI_NAME.img bs=1M count=10240 && mkfs.ext3 -F $EC2_AMI_NAME.img




#
# Montage en mnt/ami , bootstrap et entrée dans le chroot, update, installation de paquets, configurations...
#




mkdir /mnt/ami 

cd /home/

mount -o loop $EC2_AMI_NAME.img /mnt/ami


debootstrap --include=locales,curl,bzip2,ntp,perl,file,less,resolvconf,xfs,libc6-xen,openssh-server --arch i386 squeeze /mnt/ami http://ftp.fr.debian.org/debian/ 


mount -t proc none /mnt/ami/proc

mkdir -p /mnt/ami/dev/pts 

mount -t devpts none /mnt/ami/dev/pts




#
# entrée dans le chroot
#




chroot /mnt/ami


echo "deb http://ftp.fr.debian.org/debian/ squeeze main contrib" > /etc/apt/sources.list
echo "deb-src http://ftp.fr.debian.org/debian/ squeeze main contrib" >> /etc/apt/sources.list
echo "deb http://security.debian.org/ squeeze/updates main" >> /etc/apt/sources.list
echo "deb-src http://security.debian.org/ squeeze/updates main"  >> /etc/apt/sources.list


echo y > /etc/yes1.txt


aptitude update

echo fr_BE.UTF-8 UTF-8 > /etc/locale.gen

dpkg-reconfigure --priority=critical locales


aptitude remove --purge isc-dhcp-client < /etc/yes1.txt


aptitude remove --purge isc-dhcp-common < /etc/yes1.txt


aptitude install dhcpcd


aptitude update


aptitude safe-upgrade < /etc/yes1.txt



mkdir -p /boot/grub

echo "localhost" > /etc/hostname

rm /etc/udev/rules.d/70-persistent-net.rules 




# Modification / création des fichiers pour GRUB, hosts, fstab, ect...




echo "" >> /etc/modprobe.d/blacklist.conf
echo "blacklist pcspkr" >> /etc/modprobe.d/blacklist.conf




cat > /boot/grub/menu.lst <<_EOF_
default         1
timeout         1

title       Debian GNU/Linux 6.0.1 (squeeze) i386, with 2.6.32-5-xen-686
root        (hd0)
kernel      /boot/vmlinuz-2.6.32-5-xen-686 root=/dev/xvda1 ro
initrd      /boot/initrd.img-2.6.32-5-xen-686

title       Debian GNU/Linux 6.0.1 (squeeze) i386, with 2.6.32-5-xen-686
root        (hd0)
kernel      /boot/vmlinuz-2.6.32-5-xen-686 root=/dev/xvda1 ro
initrd      /boot/initrd.img-2.6.32-5-xen-686
_EOF_



cat > /etc/fstab <<_EOF_
#                
/dev/xvda1       /            ext3    defaults              1     2
none             /proc        proc    defaults,noauto       0     0
none             /dev/pts     devpts  gid=5,mode=620,noauto 0     0
none             /dev/shm     tmpfs   defaults              0     0
none             /sys         sysfs   defaults,noauto       0     0
_EOF_



cat > /etc/hosts <<_EOF_
127.0.0.1       localhost localhost.localdomain

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
_EOF_



cat > /etc/network/interfaces <<_EOF_
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
_EOF_



passwd root


# xxxxxxx
# xxxxxxx



sed -i -e "s/^#PasswordAuthentication yes/PasswordAuthentication no/" /etc/ssh/sshd_config


echo "xfs" >> /etc/modules


/etc/init.d/ssh stop




#
# On emploie des clés dynamiques qu'on crée par le site Amazon, donc pas besoin
# 
# Sinon cette clé publique est visible dans la fenêtre du programme, quand on importe la clé privée sur puttygen !
#
# Créer une clé pour rien créera le dossier avec les bonnes autorisations. la périphrase doit etre de min 8 caractères
#
#
# ssh-keygen -t rsa -b 768
#
#
# cd /root/.ssh
# rm id_rsa.pub
# rm id_rsa
# nano key7.pub
#
# cat >/root/.ssh/authorized_keys <<_EOF_
# ssh-rsa AAAAB3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx mykey
# _EOF_
#
# chmod 600 authorized_keys
#




#
# Téléchargement de 2 fihciers sur mon site : http://marcfiasse.com/editeurs/cloud/ec2/
# 
# Ils sont nécessaire pour lire les meta datas AMAZON, récupérer la clé publique ssh, modifier le fichier authorize, ect... 
#




cd /etc/init.d/

wget http://marcfiasse.com/editeurs/cloud/ec2/getsshkey

cd /etc/init.d/

wget http://marcfiasse.com/editeurs/cloud/ec2/ec2-run-user-data

chmod 755 /etc/init.d/getsshkey
chmod 755 /etc/init.d/ec2-run-user-data

update-rc.d getsshkey defaults
update-rc.d ec2-run-user-data defaults

update-rc.d -f hwclock.sh remove
update-rc.d -f hwclockfirst.sh remove

echo "lo=lo" > /dev/shm/network/ifstate
echo "eth0=eth0" >> /dev/shm/network/ifstate
chmod 664 /dev/shm/network/ifstate




#
# fin de des configs, nettoyage, sortie du modee chroot
#




cd /var/cache/apt/archives

dir

aptitude update

aptitude safe-upgrade < /etc/yes1.txt


apt-get autoremove --purge

apt-get clean

apt-get autoclean


cd /var/cache/apt/archives

dir


sed -i -e 's/^set historylog/unset historylog/;s/^\(# \)*set tabsize .*/set tabsize 4/' /etc/nanorc 

rm -rf /var/log/*.gz /var/log/{bootstrap,dpkg}.log /var/cache/apt/*.bin
rm -rf /tmp/*
rm /var/log/alternatives.log /var/log/apt/* 
rm /etc/yes1.txt
rm /var/lib/apt/lists/ftp*
rm /var/lib/apt/lists/sec* 


umount /dev/pts

umount /proc

exit




#
# Copie des fichiers du Kernel XEN de /lib/modules/ --> /mnt/ami/lib/modules et /boot/ --> /mnt/ami/boot
#
# Démontage et fin
#




cp -R /lib/modules/2.6.32-5-xen-686 /mnt/ami/lib/modules/2.6.32-5-xen-686


cp /boot/System.map-2.6.32-5-xen-686 /mnt/ami/boot/System.map-2.6.32-5-xen-686
cp /boot/config-2.6.32-5-xen-686 /mnt/ami/boot/config-2.6.32-5-xen-686
cp /boot/initrd.img-2.6.32-5-xen-686 /mnt/ami/boot/initrd.img-2.6.32-5-xen-686
cp /boot/vmlinuz-2.6.32-5-xen-686 /mnt/ami/boot/vmlinuz-2.6.32-5-xen-686


cp /dev/MAKEDEV /mnt/ami/dev/MAKEDEV

cd /mnt

umount /mnt/ami




###############################




#
# Créer les fichiers à uploader dans le répertoire temporaire du pc local ( ici, 23 )
# -----------------------------------------------------------------------
#



cd /home

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



#
# Uploader vers le S3  ( bucket : avec majuscule, _ ou autres, ça fait ACL error )	
# -------------------
#



$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 



#
# Créer une Instance : vérifier la version de JAVA corriger si nécessaire
# -----------------------------------------------------------------------
#



java -version

export EC2_HOME=$EC2_API_TOOLS

export JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.26

$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 -K $EC2_PRIVATE_KEY -C $EC2_CERT



#
# Ouvrir le port 22 sur le groupe default
# ---------------------------------------
#



$EC2_API_TOOLS/bin/ec2-authorize default -P tcp -p 22 -K $EC2_PRIVATE_KEY -C $EC2_CERT --url http://eu-west-1.ec2.amazonaws.com



#
# Voir la console : i-xxxxxxx
# ---------------------------
#



$EC2_API_TOOLS/bin/ec2-get-console-output i-xxxxxxx -K $EC2_PRIVATE_KEY -C $EC2_CERT --url http://eu-west-1.ec2.amazonaws.com



#
# Lister les instances
# --------------------
#



$EC2_API_TOOLS/bin/ec2-describe-instances -K $EC2_PRIVATE_KEY -C $EC2_CERT --url http://eu-west-1.ec2.amazonaws.com



#
# Lancer une instance  ??? sans certificat ??? hum...
# -------------------
#



EC2_AMI_INSTANCE_ID=ami-xxxxxxx

EC2_AKI=aki-4deec439

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



#
# Lancer une instance depuis la console
# -------------------------------------
#



#
# IMPORTANT IMPORTANT IMPORTANT IMPORTANT
#
# Les instances chez Amazon se lancent avec des noyaux kernel de base de chez Amazon. 
#
# MAIS... IL FAUT CHOISIR UN KERNEL ID RECENT dans la liste ( sinon, ça bloque sur GRUB - voir la console )
#

#
#           aki-4deec439        
#



#
# FIN
#



#
# Taille de l'image à transférer : environ 230 Mb
#
# Ces infos sont fournies sans garantie. J'ai testé pluseurs fois avec succès.
#
# Perso, j'ai cherché 10 jours avant d'avoir le contact avec le ssh :-) ... donc, courage !
#
# Mes images ne sont pas publiques pour le moment.
#
# Memo sous licence Apache v2. - Marc Fiasse - 19 juin 2011 - http://marcfiasse.com/
#
#
#
#
#
# Credits
# -------
#
# Auteur du script : ec2-run-user-data : Eric Hammond
#
# Auteur du script : getsshkey : ?
#






Marc Fiasse