domingo, 17 de enero de 2016

AMI Amazon EC2 y S3

Subir un AMI creado por Amazon


Primero tenemos que instalar el software que nos hace falta para ejecutar los AMI
Instalamos Java 5
$ apt-get install sun-java5-jre sun-java5-jdk
o
$sudo apt-get install sun-java6-jre sun-java6-jdk
Para saber que java usamos, ponemos el siguiente comando
$sudo update-alternatives --config java

Esto lo ponemos en el fichero .bashrc de cada usuario y en el shell actual

$sudo vi /home/sysadmin/.bashrc
...
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
...

De la pagina de amazon http://aws.amazon.com (Usuario: jxxxx.xxxxxxxxx@gmail.com Clave: sistemas), nos hemos descargado nuestro X509 certificate y private key file que solo nos lo podemos descargar una vez. Tambien tenemos que saber cual es nuestro Account Number (en nuestro caso es 4472-6514-7265, pero hay que ponerlo como 447265147265. Tambien me he descargado las siguientes herramientas:
ec2-ami-tools.zip http://developer.amazonwebservices.com/connect/entry.jspa?externalID=368&categoryID=88
ec2-api-tools.zip http://developer.amazonwebservices.com/connect/entry.jspa?externalID=351

Para tener esto organizado he creado la siguiente estructura de directorios
/usr/local/ec2/cert - aqui guardo los certificados
/usr/local/ec2/soft - aqui guardo las herramientas descargadas

Procedemos a instalar las herramientas descargadas, solo con descomprimir los ficheros.

$ unzip ec2-ami-tools.zip
$ unzip ec2-api-tools.zip
En caso de habernos descargado el fichero .rpm tenemos que usar alien.
$ alien /tmp/ec2-ami-tools.noarch.rpm
Warning: Skipping conversion of scripts in package ec2-ami-tools: preinst
Warning: Use the --scripts parameter to include the scripts.
ec2-ami-tools_1.3-20042_all.deb generated
$ dpkg -i ec2-ami-tools_1.3-20042_all.deb

Configuramos las variables EC2_CERT y EC2_PRIVATE_KEY
Esto lo ponemos tambien en el fichero /home/jcgutierrez/.bashrc para que se ejecute siempre que arranquemos el sistema

$sudo vi /home/jcgutierrez/.bashrc
...
  1. Variables para Amazon EC2
export JAVA_HOME=/usr/lib/jvm/java-6-sun
  1. export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
export EC2_HOME=/usr/local/ec2/soft/ec2-api-tools-1.3-26369
export EC2_AMITOOL_HOME=/usr/local/ec2/soft/ec2-ami-tools-1.3-26357
export EC2_APITOOL_HOME=/usr/local/ec2/soft/ec2-api-tools-1.3-26369
  1. export AWS_ACCESS_KEY_ID=03ADK1XS7GH4ZHH74F02
  2. export AWS_SECRET_ACCESS_KEY=JTFIpj9lc+FXaWqwNPaQSlmEKd2Ovxs6oO4kQNln
export PATH=$PATH:$EC2_HOME/bin
export EC2_PRIVATE_KEY=/usr/local/ec2/cert/pk-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem
export EC2_CERT=/usr/local/ec2/cert/cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem
  1. export PATH=$PATH:$EC2_HOME/bin
export PATH=$PATH:/usr/local/ec2/soft/ec2-api-tools-1.3-26369/bin:/usr/local/ec2/soft/ec2-ami-tools-1.3-26357/bin:/usr/local/ec2/soft/s3cmd-0.9.7
...

Copiar el certificado en la ruta /usr/local/ec2/soft/ec2-ami-tools-1.3-21885/etc/ec2/amitools/cert-ec2.pem

$ cd /usr/local/ec2/ec2-api-tools-1.3-19403/bin

Para ver las imagenes que hay predefinidas en amazon. $ sudo sh ec2-describe-images -o self -o amazon

IMAGE ami-bd9d78d4 ec2-public-images/demo-paid-AMI.manifest.xml amazon available public A79EC0DB i386 machine
IMAGE ami-26b6534f ec2-public-images/developer-image.manifest.xml amazon available public i386 machine
IMAGE ari-a51cf9cc ec2-public-images/ec2-initrd-2.6.21.7-2.fc8xen.i386.manifest.xml amazon available public i386 ramdisk
IMAGE ari-b31cf9da ec2-public-images/ec2-initrd-2.6.21.7-2.fc8xen.x86_64.manifest.xml amazon available public x86_64 ramdisk
IMAGE aki-a71cf9ce ec2-public-images/ec2-vmlinuz-2.6.21.7-2.fc8xen.i386.manifest.xml amazon available public i386 kernel
IMAGE aki-b51cf9dc ec2-public-images/ec2-vmlinuz-2.6.21.7-2.fc8xen.x86_64.manifest.xml amazon available public x86_64 kernel
IMAGE ami-f51aff9c ec2-public-images/fedora-8-i386-base-v1.06.manifest.xml amazon available public i386 machine aki-a71cf9ce ari-a51cf9cc
IMAGE ami-f21aff9b ec2-public-images/fedora-8-x86_64-base-v1.06.manifest.xml amazon available public x86_64 machine aki-b51cf9dcari-b31cf9da
IMAGE ami-a21affcb ec2-public-images/fedora-core-6-x86_64-base-v1.06.manifest.xml amazon available public x86_64 machine aki-a53adfccari-a23adfcb
IMAGE ami-25b6534c ec2-public-images/fedora-core4-apache-mysql.manifest.xml amazon available public i386 machine
IMAGE ami-23b6534a ec2-public-images/fedora-core4-apache.manifest.xml amazon available public i386 machine
IMAGE ami-20b65349 ec2-public-images/fedora-core4-base.manifest.xml amazon available public i386 machine
IMAGE ami-22b6534b ec2-public-images/fedora-core4-mysql.manifest.xml amazon available public i386 machine
IMAGE ami-36ff1a5f ec2-public-images/fedora-core6-base-x86_64.manifest.xml amazon available public x86_64 machine
IMAGE ami-2bb65342 ec2-public-images/getting-started.manifest.xml amazon available public i386 machine
IMAGE ari-a23adfcb ec2-public-images/initrd-2.6.20-1.3002.fc6xen.ari.manifest.xml amazon available public x86_64 ramdisk
IMAGE aki-9b00e5f2 ec2-public-images/vmlinuz-2.6.18-xenU-ec2-v1.0.i386.aki.manifest.xml amazon available public i386 kernel
IMAGE aki-9800e5f1 ec2-public-images/vmlinuz-2.6.18-xenU-ec2-v1.0.x86_64.aki.manifest.xml amazon available public x86_64 kernel
IMAGE aki-a53adfcc ec2-public-images/vmlinuz-2.6.20-1.3002.fc6xen.aki.manifest.xml amazon available public x86_64 kernel

El keypair se genera solo la primera vez que nos damos de alta, luego con copiar el fichero id_rsa-gsg-keypair desde otra maquina en el directorio /usr/local/ec2/ec2-api-tools-1.3-19403/bin ya nos vale. $ sudo sh ec2-add-keypair gsg-keypair
KEYPAIR gsg-keypair eb:c1:e5:32:1a:fa:20:42:13:8f:6a:1b:e8:f4:db:63:e4:06:e5:20

BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAnPrriF30lmUtnlam4VVECjiJm4gZqjl28mooOETAWtLPnRIE8iIlAW5T9Lxz
TAGjRBk4xuMiRdjlRo1HIxyqy3NP9CnzXNb2GhWWXokbt31//QKPg9+V4JIIGJtIDolxVbVCMBr2
euZCAI3Z9EBA4V5XZp6d2EKc/pRNGfeOq+Ud5KpBEwaJeRkeNV8nG38LOvatxMwMbQrM8LH8aZTv
KGUZrE+gKvF/MZ+2F3ZCjhIXcCEoNNjHNib/Crhh5CWx7M7AXEXRV8tAUTfs2WBMvMKjlOpyVZlG
QayAHmpAn7PpS2KtT1ow1Koc1v6Wvqqy2luwas265uGWXTwH8QP6eQIDAQABAoIBAEAbiMyr8hLp
RvP+1y/2rk6uQCQwNKr7xMPC7qHsEdIFfZvbnAF2SD6JW+f6fetwT8ijtDgk0f5MUXW6hG6mammj
sec4qpYjg2WrozkALT2GFxqwTQPB72dCu+OwpoCpSIuD9n/Gwxn1psarJ3NEOjrPWEokRLnomkyt
K7+LBczUpNtk8Ext8fRjMAI2p16vu5Lux0CHNm8IeIvw2iUOzmn5favddizelyOPOFLKgsxJeISg
RfL9L8J8IpGxjRcq8rxgGZEtpJoMdFQl0ngj0LhlNq3J4KEKaUiXNjMErg1CXaoJ/gURiRYfNIwn
RARFumRkGkaXuVvZphN4wfhnSXECgYEAy4rhhZM3O8iXp7QAjKpJFOI9QI1s4plnakKjiyT4bKWS
5XI9dhWsBQ+ZH/b4sP1OhaiuyNMq8jpthWOrzc48CAplpGzcc7oHS+ktBFmE/81lAbobhMhALq+m
thJisBEw12v4U0nPHQguQyP7zBNjbbNw+bfvxTNI0l4sUS9CgJ8CgYEAxW//BtvrU1Rm8dfjlMRS
I3fiTljJpuDZOMfoM05lnHt53T+DIK/fx+8UIbg+AML1fdNMxrrVe03e2HG2iuVvv3g/zsB5Q9Tt
QM57toM9bhrPnmHwRJEHunRKIkEH5haZnY6we3hd6NXuaiNiIoTswkgGxXEAeJgiozJNmvf/NecC
gYBpTqJdjIwQFzk3X+7E2DlVX7PXGRSTrFCP7ohUrj0FYSi+IzvfQ1kriSVtH0cNsxCUIHDFoFNg
3Y/aanXx1djDRDXQOy5XhZDO2oYa8QHZove2TAZ+zWg/f0teeearN0mwusDQvqg0Wg4tWImmzQUt
NaCm4l5gBaeQh36gRjY++wKBgQClt7t3Jl//MXi2xV5gH+hRnO52lE+tokyxPBnJ9qOTFJDVA9os
NXK/fgyHwP1J5lnnotNueqN1O4cwZUGyk6GYNHZaM3OVW8NIAggUyVNmd1qMtefVpWW3OqR+29al
aZLGjF3VRNKN/AKBU/Gqx6dx6sLENnUOw6NPF4nL6RxtQQKBgQCzhsATk0Wiqrzjs9OWCeBJHAtf
z16gKaWFjGJOPn6vclvm1FXENFxqV3timWX0l4zcwUB7hMUfNRMaz6IkDGvhaQU2U/8ITaiA7vn1
ksoYvJVFrbr8bIeK9I0LIf2iw7QV6uZshaE7qtXNTkD/VGte1zgPckoJwiPJbcxNjJy/rA==

END RSA PRIVATE KEY-----

Todo esto lo guardamos en un fichero con el siguiente nombre id_rsa-gsg-keypair
$ cat id_rsa-gsg-keypair

BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAnPrriF30lmUtnlam4VVECjiJm4gZqjl28mooOETAWtLPnRIE8iIlAW5T9Lxz
TAGjRBk4xuMiRdjlRo1HIxyqy3NP9CnzXNb2GhWWXokbt31//QKPg9+V4JIIGJtIDolxVbVCMBr2
euZCAI3Z9EBA4V5XZp6d2EKc/pRNGfeOq+Ud5KpBEwaJeRkeNV8nG38LOvatxMwMbQrM8LH8aZTv
KGUZrE+gKvF/MZ+2F3ZCjhIXcCEoNNjHNib/Crhh5CWx7M7AXEXRV8tAUTfs2WBMvMKjlOpyVZlG
QayAHmpAn7PpS2KtT1ow1Koc1v6Wvqqy2luwas265uGWXTwH8QP6eQIDAQABAoIBAEAbiMyr8hLp
RvP+1y/2rk6uQCQwNKr7xMPC7qHsEdIFfZvbnAF2SD6JW+f6fetwT8ijtDgk0f5MUXW6hG6mammj
sec4qpYjg2WrozkALT2GFxqwTQPB72dCu+OwpoCpSIuD9n/Gwxn1psarJ3NEOjrPWEokRLnomkyt
K7+LBczUpNtk8Ext8fRjMAI2p16vu5Lux0CHNm8IeIvw2iUOzmn5favddizelyOPOFLKgsxJeISg
RfL9L8J8IpGxjRcq8rxgGZEtpJoMdFQl0ngj0LhlNq3J4KEKaUiXNjMErg1CXaoJ/gURiRYfNIwn
RARFumRkGkaXuVvZphN4wfhnSXECgYEAy4rhhZM3O8iXp7QAjKpJFOI9QI1s4plnakKjiyT4bKWS
5XI9dhWsBQ+ZH/b4sP1OhaiuyNMq8jpthWOrzc48CAplpGzcc7oHS+ktBFmE/81lAbobhMhALq+m
thJisBEw12v4U0nPHQguQyP7zBNjbbNw+bfvxTNI0l4sUS9CgJ8CgYEAxW//BtvrU1Rm8dfjlMRS
I3fiTljJpuDZOMfoM05lnHt53T+DIK/fx+8UIbg+AML1fdNMxrrVe03e2HG2iuVvv3g/zsB5Q9Tt
QM57toM9bhrPnmHwRJEHunRKIkEH5haZnY6we3hd6NXuaiNiIoTswkgGxXEAeJgiozJNmvf/NecC
gYBpTqJdjIwQFzk3X+7E2DlVX7PXGRSTrFCP7ohUrj0FYSi+IzvfQ1kriSVtH0cNsxCUIHDFoFNg
3Y/aanXx1djDRDXQOy5XhZDO2oYa8QHZove2TAZ+zWg/f0teeearN0mwusDQvqg0Wg4tWImmzQUt
NaCm4l5gBaeQh36gRjY++wKBgQClt7t3Jl//MXi2xV5gH+hRnO52lE+tokyxPBnJ9qOTFJDVA9os
NXK/fgyHwP1J5lnnotNueqN1O4cwZUGyk6GYNHZaM3OVW8NIAggUyVNmd1qMtefVpWW3OqR+29al
aZLGjF3VRNKN/AKBU/Gqx6dx6sLENnUOw6NPF4nL6RxtQQKBgQCzhsATk0Wiqrzjs9OWCeBJHAtf
z16gKaWFjGJOPn6vclvm1FXENFxqV3timWX0l4zcwUB7hMUfNRMaz6IkDGvhaQU2U/8ITaiA7vn1
ksoYvJVFrbr8bIeK9I0LIf2iw7QV6uZshaE7qtXNTkD/VGte1zgPckoJwiPJbcxNjJy/rA==

END RSA PRIVATE KEY-----

Este fichero tiene que tener los siguientes permisos:
$sudo chmod 600 id_rsa-gsg-keypair
$sudo chown usuario:usuario id_rsa-gsg-keypair
Esto es para que el usuario local pueda lanzar el comando de conexion a la instancia
Arrancamos la instancia elegida

$ sudo sh ec2-run-instances ami-25b6534c -k gsg-keypair
RESERVATION r-ffc40596 447265147265 default
INSTANCE i-e32ce78a ami-25b6534c pending gsg-keypair 0 m1.small 2008-06-0 5T08:30:45+0000 us-east-1c

La instancia escogida es ami-25b6534c y se representa por medio del id i-e32ce78a.

Para comprobar el estado de nuestra instancia hacemos lo siguiente
$ sudo sh ec2-describe-instances i-e32ce78a
RESERVATION r-ffc40596 447265147265 default
INSTANCE i-e32ce78a ami-25b6534c ec2-75-101-248-109.compute-1.amazonaws.com domU-12-31-39-00-C4-31.compute-1.internal running gsg-keypair 0 m1.small 2008-06-05T08:30:45+0000 us-east-1c

A continuacion permitimos el acceso a la red de nuestra instancia. Para ello hacemos lo siguiente:

$ sudo sh ec2-authorize default -p 22
GROUP default
PERMISSION default ALLOWS tcp 22 22 FROM CIDR 0.0.0.0/0
sysadmin@berny:/usr/local/ec2/ec2-api-tools-1.3-19403/bin$ sudo sh ec2-authorize default -p 80
GROUP default PERMISSION default ALLOWS tcp 80 80 FROM CIDR 0.0.0.0/0

Para probar nuestra instancia podemos hacerlo siguiente

http://ec2-75-101-248-109.compute-1.amazonaws.com/
Este es el nombre publico de tu instancia, lo puedes ver cuando ves el estado de tu instancia.

Para conectarnos a nuestra instancia a traves de ssh se hace lo siguiente
$ ssh -i id_rsa-gsg-keypair root@ec2-75-101-248-109.compute-1.amazonaws.com
The authenticity of host 'ec2-75-101-248-109.compute-1.amazonaws.com (75.101.248.109)' can't be established.
RSA key fingerprint is f1:4e:d1:14:87:f0:57:71:89:6e:ed:b5:1c:14:84:b5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-75-101-248-109.compute-1.amazonaws.com,75.101.248.109' (RSA) to the list of known hosts.
   __|    __|   __) Rev: 2
   _|   (          /
  ___| \___| (___|

Welcome to an EC2 Public Image
 :-)

Apache2+MySQL4

__ c __ /etc/ec2/release-notes.txt

[root@domU-12-31-39-00-C4-31 ~]$

Para salir de esta session de SSH pulsamos CTRL+D

Si queremos registrar una instancia modificada tenemos que hacer lo siguiente:
Lo primero es subir el certificado y el private key a nuestra instancia

$ sudo scp -i id_rsa-gsg-keypair /usr/local/ec2/cert/pk-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem /usr/local/ec2/cert/cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem root@ec2-67-202-39-7.compute-1.amazonaws.com:/mnt

pk-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem 100% 926 0.9KB/s 00:00
cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem 100% 916 0.9KB/s 00:00

Esto se hace dentro de la instancia

$ ec2-bundle-vol -d /mnt -k /mnt/pk-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem -c /mnt/cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem -u 447265147265 -r i386

Con el parametro -p le puedes dar un nombre a tu instancia

Copying / into the image file /mnt/image...
Excluding:
/sys
/proc
/dev/pts
/net
/proc/sys/fs/binfmt_misc
/dev
/media
/mnt
/proc
/sys
/mnt/image
/mnt/img-mnt
1+0 records in
1+0 records out
mke2fs 1.38 (30-Jun-2005)
/etc/fstab:
# Legacy /etc/fstab
# Supplied by: ec2-ami-tools-1.3-20041
/dev/sda1 / ext3 defaults 1 1
/dev/sda2 /mnt ext3 defaults 0 0
/dev/sda3 swap swap defaults 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
Bundling image file...
[1]+ Done openssl sha1
Splitting /mnt/image.tar.gz.enc...
Created image.part.00
Created image.part.01
Created image.part.02
Created image.part.03
Created image.part.04
Created image.part.05
Created image.part.06
Created image.part.07
Created image.part.08
Created image.part.09
Created image.part.10
Created image.part.11
Created image.part.12
Created image.part.13
Created image.part.14
Created image.part.15
Created image.part.16
Created image.part.17
Created image.part.18
Created image.part.19
Created image.part.20
Created image.part.21
Created image.part.22
Created image.part.23
Created image.part.24
Generating digests for each part...
Digests generated.
Unable to read instance meta-data for ancestor-ami-ids
Unable to read instance meta-data for kernel-id
Unable to read instance meta-data for ramdisk-id
Unable to read instance meta-data for product-codes
Creating bundle manifest...
ec2-bundle-vol complete.

Este es el contenido del directorio /mnt de nuestra instancia

$ls -l /mnt/
total 1403960
-rw-r--r-- 1 root root 916 Jun 5 06:39 cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem
-rw-r--r-- 1 root root 10737418240 Jun 5 06:46 image
-rw-r--r-- 1 root root 5586 Jun 5 06:53 image.manifest.xml
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.00
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.01
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.02
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.03
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.04
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.05
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.06
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.07
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.08
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.09
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.10
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.11
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.12
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.13
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.14
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.15
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.16
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.17
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.18
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.19
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.20
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.21
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.22
-rw-r--r-- 1 root root 10485760 Jun 5 06:53 image.part.23
-rw-r--r-- 1 root root 4711040 Jun 5 06:53 image.part.24
drwxr-xr-x 2 root root 4096 Jun 5 06:46 img-mnt
drwx------ 2 root root 16384 Apr 14 15:30 lost+found
-rw-r--r-- 1 root root 393 Jun 5 06:24 openssh_id.pub
-rw-r--r-- 1 root root 926 Jun 5 06:39 pk-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem

Creacion de una instancia en S3 con EC2


El bucket se crea automaticamente si no existe como podemos ver en la ayuda

$ ec2-upload-bundle --help
Usage: ec2-upload-bundle PARAMETERS

MANDATORY PARAMETERS
   -b, --bucket BUCKET              The bucket to upload the bundle to. Created if nonexistent.

   -m, --manifest PATH              The path to the manifest file.

   -a, --access-key USER            The user's AWS access key ID.

   -s, --secret-key PASSWORD        The user's AWS secret access key.


OPTIONAL PARAMETERS
       --acl ACL                    The access control list policy ["public-read" | "aws-exec-read"].

                                    Defaults to "aws-exec-read".

       --ec2cert PATH               The path to the EC2 X509 public key certificate for the upload.

                                    Defaults to "/etc/aes/amiutil/cert-ec2.pem".

   -d, --directory DIRECTORY        The directory containing the bundled AMI parts to upload.

                                    Defaults to the directory containing the manifest.

       --debug                      Print debug messages.

       --part PART                  Upload the specified part and upload all subsequent parts.

       --url URL                    The S3 service URL. Defaults to https://s3.amazonaws.com.

       --retry                      Automatically retry failed uploads. Use with caution.

       --skipmanifest               Do not upload the manifest.

   -h, --help                       Display the help message and exit.

       --manual                     Display the manual and exit.


$ ec2-upload-bundle -b pecblom01 -m /mnt/image.manifest.xml -a 03ADK1XS7GH4ZHH74F02 -s JTFIpj9lc+FXaWqwNPaQSlmEKd2Ovxs6oO4kQNln --ec2cert /mnt/cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pemAre you sure you want to specify a different EC2 public certificate? [y/n]
y
Using specified EC2 public certificate: /mnt/cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem.
Setting bucket ACL to allow EC2 read access ...
Uploading bundled image parts to https://s3.amazonaws.com:443/pecblom01 ...
Uploaded image.part.00 to https://s3.amazonaws.com:443/pecblom01/image.part.00.
Uploaded image.part.01 to https://s3.amazonaws.com:443/pecblom01/image.part.01.
Uploaded image.part.02 to https://s3.amazonaws.com:443/pecblom01/image.part.02.
Uploaded image.part.03 to https://s3.amazonaws.com:443/pecblom01/image.part.03.
Uploaded image.part.04 to https://s3.amazonaws.com:443/pecblom01/image.part.04.
Uploaded image.part.05 to https://s3.amazonaws.com:443/pecblom01/image.part.05.
Uploaded image.part.06 to https://s3.amazonaws.com:443/pecblom01/image.part.06.
Uploaded image.part.07 to https://s3.amazonaws.com:443/pecblom01/image.part.07.
Uploaded image.part.08 to https://s3.amazonaws.com:443/pecblom01/image.part.08.
Uploaded image.part.09 to https://s3.amazonaws.com:443/pecblom01/image.part.09.
Uploaded image.part.10 to https://s3.amazonaws.com:443/pecblom01/image.part.10.
Uploaded image.part.11 to https://s3.amazonaws.com:443/pecblom01/image.part.11.
Uploaded image.part.12 to https://s3.amazonaws.com:443/pecblom01/image.part.12.
Uploaded image.part.13 to https://s3.amazonaws.com:443/pecblom01/image.part.13.
Uploaded image.part.14 to https://s3.amazonaws.com:443/pecblom01/image.part.14.
Uploaded image.part.15 to https://s3.amazonaws.com:443/pecblom01/image.part.15.
Uploaded image.part.16 to https://s3.amazonaws.com:443/pecblom01/image.part.16.
Uploaded image.part.17 to https://s3.amazonaws.com:443/pecblom01/image.part.17.
Uploaded image.part.18 to https://s3.amazonaws.com:443/pecblom01/image.part.18.
Uploaded image.part.19 to https://s3.amazonaws.com:443/pecblom01/image.part.19.
Uploaded image.part.20 to https://s3.amazonaws.com:443/pecblom01/image.part.20.
Uploaded image.part.21 to https://s3.amazonaws.com:443/pecblom01/image.part.21.
Uploaded image.part.22 to https://s3.amazonaws.com:443/pecblom01/image.part.22.
Uploaded image.part.23 to https://s3.amazonaws.com:443/pecblom01/image.part.23.
Uploaded image.part.24 to https://s3.amazonaws.com:443/pecblom01/image.part.24.
Uploading manifest ...
Uploaded manifest to https://s3.amazonaws.com:443/pecblom01/image.manifest.xml.
Bundle upload completed.

Para terminar, tenemos que registrar nuestra imagen

$ sudo sh ec2-register pecblom01/image.manifest.xml

[sudo] password for sysadmin:
IMAGE ami-1ea64277

Para saber las instancias que tienes en pie hacemos lo siguiente

$ ec2-describe-instances
RESERVATION r-bec607d7 447265147265 default INSTANCE i-4021ea29 ami-25b6534c ec2-67-202-39-7.compute-1.amazonaws.com ip-10-251-111-112.ec2.internal running gsg-keypair 0 m1.small 2008-06-05T10:24:44+0000 us-east-1b

Para apagar una instancia hacemos lo siguiente

$ sudo sh ec2-terminate-instances i-e32ce78a
INSTANCE i-e32ce78a running shutting-down

Para poder asignar una ip a la misma instancia lo primero que tenemos que hacer es solicitar la ip a Amazon. Recordar que solo se pueden solicitar 5 ip por cuenta.

$ ec2-allocate-address
ADDRESS 75.101.144.120

Para saber en todo momento las ip que tengo podemos hacer lo siguiente

$ ec2-describe-address

ADDRESS 75.101.139.213
ADDRESS 75.101.144.120
ADDRESS 75.101.145.251

Para asociar una ip a una instancia hacemos lo siguiente:

$ ec2-describe-instances
RESERVATION r-4cce0f25 447265147265 default INSTANCE i-a838f3c1 ami-1ea64277 ec2-75-101-228-166.compute-1.amazonaws.com domU-12-31-38-00-8D-23.compute-1.internal running 0 m1.small 2008-06-05T15:53:35+0000 us-east-1a

Se que mi instancia tiene el id i-a838f3c1

$ ec2-associate-address -i i-a838f3c1 75.101.139.213
ADDRESS 75.101.139.213 i-a838f3c1

Una vez hecho esto, podemos ver que efectivamente esta asociado

$ ec2-describe-instances
RESERVATION r-4cce0f25 447265147265 default INSTANCE i-a838f3c1 ami-1ea64277 ec2-75-101-139-213.compute-1.amazonaws.com domU-12-31-38-00-8D-23.compute-1.internal running 0 m1.small 2008-06-05T15:53:35+0000 us-east-1a

$ ec2-describe-addresses
ADDRESS 75.101.139.213 i-a838f3c1
ADDRESS 75.101.144.120
ADDRESS 75.101.145.251

Para desasociar una ip de la instancia

$ ec2-disassociate-address 75.101.139.213
ADDRESS 75.101.139.213

Estas son las ip que tengo reservadas

$ ec2-describe-addresses
ADDRESS 75.101.139.213 i-a838f3c1
ADDRESS 75.101.144.120
ADDRESS 75.101.145.251

Para poder devolver las ip que hemos reservado

$ ec2-release-address 75.101.144.120
ADDRESS 75.101.144.120

$ ec2-describe-addresses
ADDRESS 75.101.139.213 i-a838f3c1
ADDRESS 75.101.145.251

Cuando una instancia termina se desasocia la ip a esa instancia
Anexo 1

Para subir documentos a nuestra instancia lo hacemos asi

$ sudo scp -i id_rsa-gsg-keypair -r /tmp/*.jp*g root@amazon.blom.es:/tmp

Fuentes:

http://docs.amazonwebservices.com/AWSEC2/2008-02-01/GettingStartedGuide/?ref=get-started
http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1346

Instalar S3CMD para manejar bucket


Vamos a usar s3cmd para el manejo de los bucket.
Primero instalamos python
$ sudo apt-get install python2.4-setuptools
[sudo] password for sysadmin:
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias
Leyendo la información de estado... Hecho
Nota, seleccionando python-setuptools en lugar de python2.4-setuptools
Se instalarán los siguientes paquetes NUEVOS:
: python-setuptools
0 actualizados, 1 se instalarán, 0 para eliminar y 1 no actualizados.
Necesito descargar 211kB de archivos.
Se utilizarán 786kB de espacio de disco adicional después de desempaquetar.
Des:1 http://us.archive.ubuntu.com gutsy/main python-setuptools 0.6c6-1 [211kB]
Descargados 211kB en 2s (90,2kB/s)
Seleccionando el paquete python-setuptools previamente no seleccionado.
(Leyendo la base de datos ...
33671 ficheros y directorios instalados actualmente.)
Desempaquetando python-setuptools (de .../python-setuptools_0.6c6-1_all.deb) ...
Configurando python-setuptools (0.6c6-1) ...

en el .bashrc ponemos la variable PATH apuntando donde esta descomprimido el paquete y la variable de entorno S3CMD_PACKAGING=yes si no queremos que nos instale los manuales y la documentacion.
$ vi /home/sysadmin/.bashrc
...
export PATH=$PATH:$EC2_HOME/bin:/usr/local/s3cmd-0.9.7 ...
Para hacer la instalacion de s3cmd lanzamos el siguiente comando $ s3cmd --configure

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3
Access Key: 03ADK1XS7GH4ZHH74F02 
Secret Key: JTFIpj9lc+FXaWqwNPaQSlmEKd2Ovxs6oO4kQNln

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: sistemas 
Path to GPG program [/usr/bin/gpg]:

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP and can't be used if you're behind a proxy
Use HTTPS protocol [No]:

On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't conect to S3 directly
HTTP Proxy server name [192.168.33.86]:
HTTP Proxy server port [3128]:

New settings:
Access Key: 03ADK1XS7GH4ZHH74F02
Secret Key: JTFIpj9lc+FXaWqwNPaQSlmEKd2Ovxs6oO4kQNln
Encryption password: sistemas
Path to GPG program: /usr/bin/gpg
Use HTTPS protocol: False
HTTP Proxy server name: 192.168.33.86
HTTP Proxy server port: 3128

Test access with supplied credentials? [Y/n]
Please wait...
Success. Your access key and secret key worked fine :-)

Now verifying that encryption works...
Success. Encryption and decryption worked fine :-)
Save settings? [y/N] y
Configuration saved to '/home/sysadmin/.s3cfg'

Ya tenemos instalado y configurado el s3cmd
Para ver los bucket que tenemos creados
$ s3cmd ls
2008-06-05 15:04 s3://pecblom01

Vamos acrear un bucket, debemos saber que el nombre del bucket debe ser unico para todos los usuarios de S3
$ s3cmd mb s3://pecblom02
Bucket 'pecblom02' created

Para ver el contenido de un bucket, este concretamente no tiene ningun dato
$ s3cmd ls s3://blom.valladolid.sistemas
Bucket 'blom.valladolid.sistemas':

Si intentamos subir algo a un bucket que no existe nos da los siguientes mensajes de error
$ s3cmd put /tmp/loader.gif s3://blom.valladolid.sistemas.gif
Traceback (most recent call last):
File "/usr/local/s3cmd-0.9.7/s3cmd", line 935, in
cmd_func(args)
File "/usr/local/s3cmd-0.9.7/s3cmd", line 194, in cmd_object_put
response = s3.object_put_uri(real_filename, uri_final, extra_headers)
File "/usr/local/s3cmd-0.9.7/S3/S3.py", line 195, in object_put_uri
return self.object_put(filename, uri.bucket(), uri.object(), extra_headers)
File "/usr/local/s3cmd-0.9.7/S3/S3.py", line 175, in object_put
response = self.send_file(request, file)
File "/usr/local/s3cmd-0.9.7/S3/S3.py", line 384, in send_file
debug("MD5 sums: computed=%s, received=%s" % (md5_computed, response["headers"]["etag"]))
KeyError: 'etag'
Ahora vamos a subir 3 imagenes desde nuestro directorio tmp al bucket blom.valladolid.sistemas
$ s3cmd put /tmp/loader.gif s3://blom.valladolid.sistemas
File '/tmp/loader.gif' stored as s3://blom.valladolid.sistemas/loader.gif (10847 bytes in 0.0 seconds, 3.05 MB/s) [1 of 1]
$ s3cmd put /tmp/blomg.gif s3://blom.valladolid.sistemas
File '/tmp/blomg.gif' stored as s3://blom.valladolid.sistemas/blomg.gif (5207 bytes in 0.0 seconds, 2.19 MB/s) [1 of 1]
$ s3cmd put /tmp/conejo.jpg s3://blom.valladolid.sistemas
File '/tmp/conejo.jpg' stored as s3://blom.valladolid.sistemas/conejo.jpg (8192 bytes in 0.0 seconds, 3.28 MB/s) [1 of 1]
Listamos nuestros bucket
$ s3cmd ls
2008-06-18 06:54 s3://blom.valladolid
2008-06-18 06:54 s3://blom.valladolid.sistemas
2008-06-05 15:04 s3://pecblom01
2008-06-18 06:52 s3://pecblom02
Listamos nuestro bucket para ver si estan las imagenes que hemos subido
$ s3cmd ls s3://blom.valladolid.sistemas
Bucket 'blom.valladolid.sistemas':
2008-06-18 07:07 5207 s3://blom.valladolid.sistemas/blomg.gif
2008-06-18 07:08 8192 s3://blom.valladolid.sistemas/conejo.jpg
2008-06-18 07:07 10847 s3://blom.valladolid.sistemas/loader.gif

Recuperamos un fichero de los que hemos subido, lo guardamos con otro nombre y verificamos que no esta corrupto
$ s3cmd get s3://blom.valladolid.sistemas/conejo.jpg /tmp/conejo2.jpg
Object s3://blom.valladolid.sistemas/conejo.jpg saved as '/tmp/conejo2.jpg' (8192 bytes in 0.3 seconds, 25.85 kB/s)

Ahora lo verificamos
$ md5sum /tmp/conejo.jpg /tmp/conejo2.jpg
87d01f7be1b612ac0713f8a606c7507a /tmp/conejo.jpg
87d01f7be1b612ac0713f8a606c7507a /tmp/conejo2.jpg

Para subir varios ficheros al bucket
$ s3cmd put /tmp/*.* s3://pecblom02
File '/tmp/blomg.gif' stored as s3://pecblom02/blomg.gif (5207 bytes in 0.0 seconds, 2.22 MB/s) [1 of 4]
File '/tmp/conejo2.jpg' stored as s3://pecblom02/conejo2.jpg (8192 bytes in 0.0 seconds, 3.40 MB/s) [2 of 4]
File '/tmp/conejo.jpg' stored as s3://pecblom02/conejo.jpg (8192 bytes in 0.0 seconds, 3.39 MB/s) [3 of 4]
File '/tmp/loader.gif' stored as s3://pecblom02/loader.gif (10847 bytes in 0.0 seconds, 3.11 MB/s) [4 of 4]

Para borrar un bucket tenemos que tenerlo primero vacio, en caso de que tenga datos nos saldria lo siguiente
$ s3cmd rb s3://pecblom02
ERROR: S3 error: 409 (Conflict): BucketNotEmpty
Primero borramos los datos
$ s3cmd del s3://pecblom02/conejo2.jpg
Object s3://pecblom02/conejo2.jpg deleted

La ayuda de s3cmd
$ s3cmd --help
Usage: s3cmd [options] COMMAND [parameters]

S3cmd is a tool for managing objects in Amazon S3 storage. It allows for
making and removing "buckets" and uploading, downloading and removing
"objects" from these buckets.

Options:
-h, --help show this help message and exit
--configure Invoke interactive (re)configuration tool.
-c FILE, --config=FILE
Config file name. Defaults to /home/sysadmin/.s3cfg
--dump-config Dump current configuration after parsing config files
and command line options and exit.
-e, --encrypt Encrypt files before uploading to S3.
--no-encrypt Don't encrypt files.
-f, --force Force overwrite and other dangerous operations.
-P, --acl-public Store objects with ACL allowing read for anyone.
--acl-private Store objects with default ACL allowing access for you
only.
--delete-removed Delete remote objects with no corresponding local file
[sync]
--no-delete-removed Don't delete remote objects.
-p, --preserve Preserve filesystem attributes (mode, ownership,
timestamps). Default for [sync] command.
--no-preserve Don't store FS attributes
--bucket-location=BUCKET_LOCATION
Datacentre to create bucket in. Either EU or US
(default)
-m MIME/TYPE, --mime-type=MIME/TYPE
Default MIME-type to be set for objects stored.
-M, --guess-mime-type
Guess MIME-type of files by their extension. Falls
back to default MIME-Type as specified by --mime-type
option
-H, --human-readable-sizes
Print sizes in human readable form.
-v, --verbose Enable verbose output.
-d, --debug Enable debug output.
--version Show s3cmd version (0.9.7) and exit.

Commands:
Make bucket
s3cmd mb s3://BUCKET
Remove bucket
s3cmd rb s3://BUCKET
List objects or buckets
s3cmd ls [s3://BUCKET[/PREFIX]]
List all object in all buckets
s3cmd la
Put file into bucket
s3cmd put FILE [FILE...] s3://BUCKET[/PREFIX]
Get file from bucket
s3cmd get s3://BUCKET/OBJECT LOCAL_FILE
Delete file from bucket
s3cmd del s3://BUCKET/OBJECT
Synchronize a directory tree to S3
s3cmd sync LOCAL_DIR s3://BUCKET[/PREFIX] or s3://BUCKET[/PREFIX] LOCAL_DIR
Disk usage by buckets
s3cmd du [s3://BUCKET[/PREFIX]]
Get various information about Buckets or Objects
s3cmd info s3://BUCKET[/OBJECT]

See program homepage for more information at
http://s3tools.logix.cz

Podemos sincronizar un directorio de nuestra maquina con un bucket.
Por ejemplo si nuestro directorio tmp esta vacio y hacemos la sincronizacion de nuestro directorio con el bucket no hace nada.
$ s3cmd sync /tmp/ s3://pecblom02
Compiling list of local files...
Retrieving list of remote files...
Found 0 local files, 3 remote files
Verifying checksums...
Summary: 0 local files to upload, 3 remote files to delete
not-deleted 's3://pecblom02/blomg.gif'
not-deleted 's3://pecblom02/conejo.jpg'
not-deleted 's3://pecblom02/loader.gif'
Done. Uploaded 0 bytes in 0.0 seconds, 0.00 B/s

Pero si sincronizamos nuestro bucket con el directorio vacio tmp de nuestro equipo, nos copia los ficheros del bucket al directorio.
$ s3cmd sync s3://pecblom02 /tmp
Retrieving list of remote files...
Compiling list of local files...
Found 3 remote files, 0 local files
Verifying checksums...
Summary: 3 remote files to download, 0 local files to delete
File 's3://pecblom02/blomg.gif' stored as /tmp/blomg.gif (5207 bytes in 0.0 seconds, 203.41 kB/s) [1 of 3]
File 's3://pecblom02/conejo.jpg' stored as /tmp/conejo.jpg (8192 bytes in 0.2 seconds, 52.26 kB/s) [2 of 3]
File 's3://pecblom02/loader.gif' stored as /tmp/loader.gif (10847 bytes in 0.2 seconds, 61.39 kB/s) [3 of 3]

Si yo tengo esto tanto en mi directorio tmp como en el bucket
$ ls -l /tmp
total 0
$ s3cmd ls s3://pecblom02
Bucket 'pecblom02':
2008-06-18 07:40 5207 s3://pecblom02/blomg.gif
2008-06-18 07:40 8192 s3://pecblom02/conejo.jpg
2008-06-18 07:40 10847 s3://pecblom02/loader.gif

Y hago una sincronizacion del tmp al bucket
$ s3cmd sync --delete-removed /tmp/ s3://pecblom02
Compiling list of local files...
Retrieving list of remote files...
Found 0 local files, 3 remote files
Verifying checksums...
Summary: 0 local files to upload, 3 remote files to delete
deleted 's3://pecblom02/blomg.gif'
deleted 's3://pecblom02/conejo.jpg'
deleted 's3://pecblom02/loader.gif'
Done. Uploaded 0 bytes in 0.0 seconds, 0.00 B/s

Vemos como quedan el directorio tmp local y el bucket
$ ls -l /tmp
total 0
$ s3cmd ls s3://pecblom02
Bucket 'pecblom02':

Ahora ya podemos borrar el bucket
Listamos nuestros bucket
$ s3cmd ls
2008-06-18 06:54 s3://blom.valladolid
2008-06-18 06:54 s3://blom.valladolid.sistemas
2008-06-05 15:04 s3://pecblom01
2008-06-18 06:52 s3://pecblom02

Borramos el que queremos
$ s3cmd rb s3://pecblom02
Bucket 'pecblom02' removed

Volvemos a listar los bucket y vemos que pecblom02 a desaparecido
$ s3cmd ls
2008-06-18 06:54 s3://blom.valladolid
2008-06-18 06:54 s3://blom.valladolid.sistemas
2008-06-05 15:04 s3://pecblom01

Montar bucket de S3 como unidad de la instancia EC2


Para poner un bucket de S3 como una unidad de la instanacia en EC2, tenemos que instalar los siguientes paquetes
$sudo apt-get install libcurl3-openssl-dev
$sudo apt-get install -y subversion build-essential libcurl4-openssl-dev libxml2-dev libfuse-dev

http://s3fs.googlecode.com/svn/trunk/s3fs/contrib/readme.txt
S3FS-Fuse

S3FS is FUSE (File System in User Space) based solution to mount/unmount an Amazon S3 storage buckets and use system commands with S3 just like it was another Hard Disk.

In order to compile s3fs, You'll need the following requirements:
  • Kernel-devel packages (or kernel source) installed that is the SAME version of your running kernel
  • LibXML2-devel packages
  • CURL-devel packages (or compile curl from sources at: curl.haxx.se/ use 7.15.X)
  • GCC, GCC-C++
  • pkgconfig
  • FUSE (2.7.x)
  • FUSE Kernel module installed and running (RHEL 4.x/CentOS 4.x users - read below)
  • OpenSSL-devel (0.9.8)
  • Subversion

If you're using YUM or APT to install those packages, then it might require additional packaging, allow it to be installed.

Downloading & Compiling:


In order to download s3fs, user the following command:
svn checkout http://s3fs.googlecode.com/svn/trunk/ s3fs-read-only

Go inside the directory that has been created (s3fs-read-only/s3fs) and run: make
This should compile the code. If everything goes OK, you'll be greated with "ok!" at the end and you'll have a binary file called "s3fs"

As root (you can use su, su -, sudo) do: "make inatall" -this will copy the "s3fs" binary to /usr/bin.

Congratulations. S3fs is now compiled and Installed.

Usage:


In order to use s3fs, make sure you have the Access Key and the Secret Key handy.
First, create a directory where to mount the S3 bucket you want to use.
Example (as root): mkdir -p /mnt/s3
Then run: s3fs mybucket -o accessKeyId=aaa -o secretAccessKey=bbb /mnt/s3

This will mount your bucket to /mnt/s3. You can do a simple "ls -l /mnt/s3" to see the content of your bucket.

If you want to allow other people access the same bucket in the same machine, you can add "-o allow _other" to read/write/delete content of the bucket.

You can add a fixed mount point in /etc/fstab, here's an example:

s3fs#mybucket /mnt/s3 fuse allow_other,accessKeyId=XXX ,secretAccessKey=YYY 0 0

This will mount upon reboot (or by launching: mount -a) your bucket on your machine.

All other options can be read at: http://code.google.com/p/s3fs/wiki/FuseOverAmazon

Known Issues:


s3fs should be working fine with S3 storage. However, There are couple of limitations:
  • There is no full UID/GID support yet, everything looks as "root" and if you allow others to access the bucket, others can erase files. There is, however, permissions support built in.
  • Currently s3fs could hang the CPU if you have lots of time-outs. This is *NOT* a fault of s3fs but rather libcurl. This happends when you try to copy thousands of files in 1 session, it doesn't happend when you upload hundreds of files or less.
  • CentOS 4.x/RHEL 4.x users - if you use the kernel that shipped with your distribution and didn't upgrade to the latest kernel RedHat/CentOS gives, you might have a problem loading the "fuse" kernel. Please upgrade to the latest kernel (2.6.16 or above) and make sure "fuse" kernel module is compiled and loadable since FUSE requires this kernel module and s3fs requires it as well.
  • Moving/renaming/erasing files takes time since the whole file needs to be accessed first. A workaround could be touse s3fs's cache support with the use_cache option.

Descargamos de internet el paquete para hacer luego la instalacion
$svn checkout http://s3fs.googlecode.com/svn/trunk/ s3fs-read-only

Nos movemos dentro del directorio que nos hemos descargado
$cd s3fs-read-only/s3fs

Hacemos la instalacion
$make install

Creamos un directorio para poder montar luego el bucket (no lo hacemos sobre el directorio /mnt porque son directorios volatiles que se borran al terminar la instancia)
$mkdir -p /s3/sugardatas3

Montamos en este directorio un bucket que teniamos en S3
$s3cmd ls
2008-06-18 06:54 s3://blom.valladolid
2008-06-18 06:54 s3://blom.valladolid.sistemas
2008-06-19 09:14 s3://blom.valladolid.sistemas.ubuntu
2008-06-20 06:23 s3://blom.valladolid.sugarcrm
2008-06-05 15:04 s3://pecblom01

$s3fs blom.valladolid.sugarcrm -o accessKeyId=03ADK1XS7GH4ZHH74F02 -o secretAccessKey=JTFIpj9lc+FXaWqwNPaQSlmEKd2Ovxs6oO4kQNln /s3/sugardatas3

Creamos un fichero en nuestro directorio /s3/sugardatas3 para ver que luego esta en el bucket del S3
$vi /s3/sugardatas3/leeme.txt
  1. hola esto esta creado en el directorio /s3/sugardatas3 de nuestra instanacia EC2

Listamos nuestro bucket para ver si esta el fichero que acabamos de crear en la instancia
$s3cmd ls s3://blom.valladolid.sugarcrm
Bucket 'blom.valladolid.sugarcrm':
2008-06-20 09:56 7 s3://blom.valladolid.sugarcrm/leeme.txt
Efectivamente vemos que si que se ha subido el fichero que hemos creado en la instancia EC2 al bucket S3

Para que se monte el bucket siempre editamos el fichero /etc/fstab
$vi /etc/fstab
  1. Legacy /etc/fstab
  2. Supplied by: ec2-ami-tools-1.3-20041
/dev/sda1 / ext3 defaults 1 1
/dev/sda2 /mnt ext3 defaults 0 0
/dev/sda3 swap swap defaults 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
  1. montaje de una unidad del S3 jc-20-06-2008
s3fs#blom.valladolid.sugarcrm /s3/sugardatas3 fuse allow_other,accessKeyId=03ADK1XS7GH4ZHH74F02,secretAccessKey=JTFIpj9lc+FXaWqwNPaQSlmEKd2Ovxs6oO4kQNln 0 0

Vemos con mount como esta nuestro sistema de archivos
# mount
/dev/sda1 on / type ext3 (rw)
proc on /proc type proc (rw,noexec,nosuid,nodev)
/sys on /sys type sysfs (rw,noexec,nosuid,nodev)
varrun on /var/run type tmpfs (rw,noexec,nosuid,nodev,mode=0755)
varlock on /var/lock type tmpfs (rw,noexec,nosuid,nodev,mode=1777)
udev on /dev type tmpfs (rw,mode=0755)
devshm on /dev/shm type tmpfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda2 on /mnt type ext3 (rw)
fuse on /s3/sugardatas3 type fuse (rw,nosuid,nodev)


Antes de terminar la instancia para que no borre la unidad que tenemos montada en el bucket deberiamos desmontarla con umount
$umount /s3/sugardatas3

Si queremos lanzar un demonio (arrancar mysql) despues de que la maquina arranque, hacemos lo siguiente
Creamos un fichero .sh con el scrip que queremos lanzar
Le damos los permisos 755 al fichero
Copiamos el fichero al directorio /etc/init.d/
Lanzamos un update-rc.d para que se actualizen los ficheros de arranque.

EJEMPLO:
Tenemos una maquina con mysql que tiene los datos en un bucket. El bucket se monta sobre una unidad local en el fstab cuando arranca. Despues tenemos que arrancar a mano mysql ya que para crear la imagen no podemos tener montado el bucket sobre nuestro disco, porque nos lo borra al terminar la instancia.
Creamos el fichero ejecutable
$vi /tmp/mysqlstart.sh
#!/bin/bash

#Arrancamos mysql despues de que se ejecute el fstab donde montamos la BD en el bucket s3://blom.valladolid.sugarcrm
/etc/init.d/mysql start

Le damos los permisos al fichero
$chmod 755 /tmp/mysqlstart.sh

Copias el fichero al directorio /etc/init.d/
$cp /tmp/mysqlstart.sh /etc/init.d/

Ejecutamos el update-rc.d para que se actualize
$update-rc.d mysqlstart.sh defaults
Adding system startup for /etc/init.d/mysqlstart.sh ...
/etc/rc0.d/K20mysqlstart.sh -> ../init.d/mysqlstart.sh
/etc/rc1.d/K20mysqlstart.sh -> ../init.d/mysqlstart.sh
/etc/rc6.d/K20mysqlstart.sh -> ../init.d/mysqlstart.sh
/etc/rc2.d/S20mysqlstart.sh -> ../init.d/mysqlstart.sh
/etc/rc3.d/S20mysqlstart.sh -> ../init.d/mysqlstart.sh
/etc/rc4.d/S20mysqlstart.sh -> ../init.d/mysqlstart.sh
/etc/rc5.d/S20mysqlstart.sh -> ../init.d/mysqlstart.sh


Instalar s3sync


Descargamos el paquete para instalarlo mas tarde
$wget http://s3.amazonaws.com/ServEdge_pub/s3sync/s3sync.tar.gz

Instalamos ruby
$apt-get install ruby libopenssl-ruby
Para ver la version de ruby que tenemos instalada
$ruby -v

Descomprimimos el paquete que nos hemos descargado antes
$tar xvzf s3sync.tar.gz

movemos el directorio que se crea al descomprimir a la ruta /usr/local/bin
$mv s3sync /usr/local/bin/
Dentro del directorio /usr/local/bin/s3sync creamos la carpeta certs
$mkdir /usr/local/bin/s3sync/certsNos movemos dentro de este nuevo directorio y descargamos unos certificados, luego los instalamos
$cd /usr/local/bin/s3sync/certs/
$wget http://mirbsd.mirsolutions.de/cvs.cgi/~checkout~/src/etc/ssl.certs.shar
$sh ssl.certs.shar

Tenemos que editar el fichero .bashrc para introducir al final del fichero las claves para EC2
$vi /root/.bashrc
...
#variables para el servicio de amazon EC2 y S3 editado por juan carlos 24_06_2008
export AWS_ACCESS_KEY_ID=03ADK1XS7GH4ZHH74F02
export AWS_SECRET_ACCESS_KEY=JTFIpj9lc+FXaWqwNPaQSlmEKd2Ovxs6oO4kQNln
...

Creamos 2 ficheros que son los que hacen la sincronizacion con el bucket de los directorios que le digamos
$vi /usr/local/bin/s3sync/upload.sh
#!/bin/bash
# script to upload local directory upto s3
#cd /path/to/yourshellscript/
cd /usr/local/bin/s3sync/
export AWS_ACCESS_KEY_ID=03ADK1XS7GH4ZHH74F02
export AWS_SECRET_ACCESS_KEY=JTFIpj9lc+FXaWqwNPaQSlmEKd2Ovxs6oO4kQNln
export SSL_CERT_DIR=/usr/local/bin/s3sync/certs

#ruby s3sync.rb -r --ssl --delete /home/john/localuploadfolder/ mybucket:/remotefolder
# copy and modify line above for each additional folder to be synced

$vi /usr/local/bin/s3sync/download.sh
#!/bin/bash
# script to download local directory upto s3
#cd /path/to/yourshellscript/
cd /usr/local/bin/s3sync/
export AWS_ACCESS_KEY_ID=03ADK1XS7GH4ZHH74F02
export AWS_SECRET_ACCESS_KEY=JTFIpj9lc+FXaWqwNPaQSlmEKd2Ovxs6oO4kQNln
export SSL_CERT_DIR=/your/path/to/s3sync/certs

#ruby s3sync.rb -r --ssl --delete mybucket:/remotefolder/ /home/john/localdownloadfolder
# copy and modify line above for each additional folder to be synced

Ahora ya podemos utilizar los comandos
Podemos ver la informacion de los comandos en 2 ficheros
$less /usr/local/bin/s3sync/README_s3cmd.txt
$less /usr/local/bin/s3sync/README.txt

Ejemplos s3sync:


(using S3 bucket 'mybucket' and prefix 'pre')
Put the local etc directory itself into S3
s3sync.rb -r /etc mybucket:pre
(This will yield S3 keys named pre/etc/...)
Put the contents of the local /etc dir into S3, rename dir:
s3sync.rb -r /etc/ mybucket:pre/etcbackup
(This will yield S3 keys named pre/etcbackup/...)
Put contents of S3 "directory" etc into local dir
s3sync.rb -r mybucket:pre/etc/ /root/etcrestore
(This will yield local files at /root/etcrestore/...)
Put the contents of S3 "directory" etc into a local dir named etc
s3sync.rb -r mybucket:pre/etc /root
(This will yield local files at /root/etc/...)
Put S3 nodes under the key pre/etc/ to the local dir etcrestore
    • and create local dirs even if S3 side lacks dir nodes**
s3sync.rb -r --make-dirs mybucket:pre/etc/ /root/etcrestore
(This will yield local files at /root/etcrestore/...)

Ejemplos s3cmd:


List all the buckets your account owns:
s3cmd.rb listbuckets

Create a new bucket:
s3cmd.rb createbucket BucketName

Create a new bucket in the EU:
s3cmd.rb createbucket BucketName EU

Find out the location constraint of a bucket:
s3cmd.rb location BucketName

Delete an old bucket you don't want any more:
s3cmd.rb deletebucket BucketName

Find out what's in a bucket, 10 lines at a time:
s3cmd.rb list BucketName 10

Only look in a particular prefix:
s3cmd.rb list BucketName:startsWithThis

Look in the virtual "directory" named foo;
lists sub-"directories" and keys that are at this level.
Note that if you specify a delimiter you must specify a max before it.
(until I make the options parsing smarter)
s3cmd.rb list BucketName:foo/ 10 /

Delete a key:
s3cmd.rb delete BucketName:AKey

Delete all keys that match (like a combo between list and delete):
s3cmd.rb deleteall BucketName:SomePrefix

Only pretend you're going to delete all keys that match, but list them:

s3cmd.rb --dryrun deleteall BucketName:SomePrefix

Delete all keys in a bucket (leaving the bucket):
s3cmd.rb deleteall BucketName

Get a file from S3 and store it to a local file
s3cmd.rb get BucketName:TheFileOnS3.txt ALocalFile.txt

Put a local file up to S3
Note we don't automatically set mime type, etc.
NOTE that the order of the options doesn't change. S3 stays first!
s3cmd.rb put BucketName:TheFileOnS3.txt ALocalFile.txt

./s3cmd.rb listbuckets
blom.valladolid
blom.valladolid.sistemas
blom.valladolid.sistemas.ubuntu
blom.valladolid.sugarcrm
pecblom01

Si no estamos en el directorio tenemos que poner toda la ruta para que el comando funcione
$/usr/local/bin/s3sync/./s3cmd.rb listbuckets

Comandos mas usados EC2 y S3


Listado de imagenes de amazon
$ sudo sh ec2-describe-images -o self -o amazon

Arrancamos la instancia elegida
$ sudo sh ec2-run-instances ami-25b6534c -k gsg-keypair

Para comprobar el estado de nuestra instancia hacemos lo siguiente
$ sudo sh ec2-describe-instances i-e32ce78a

Para permitir el acceso a la red de nuestra instancia.
$ sudo sh ec2-authorize default -p 22

Para probar nuestra instancia podemos hacerlo siguiente
http://ec2-75-101-248-109.compute-1.amazonaws.com/

Para conectarnos a nuestra instancia a traves de ssh se hace lo siguiente
$ ssh -i id_rsa-gsg-keypair root@ec2-75-101-248-109.compute-1.amazonaws.com

Para salir de una session de SSH pulsamos CTRL+D

Si queremos registrar una instancia modificada tenemos que subir el certificado y el private key a nuestra instancia
$ sudo scp -i id_rsa-gsg-keypair /usr/local/ec2/cert/pk-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem /usr/local/ec2/cert/cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem root@ec2-67-202-39-7.compute-1.amazonaws.com:/mnt

Esto se hace dentro de la instancia

Generamos una imagen de nuestro ami para poderla subirla a S3. Primero tenemos que desmontar las unidades que tengamos montadas con fuse. lo vemos con el comando mount
$ ec2-bundle-vol -d /mnt -k /mnt/pk-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem -c /mnt/cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem -u 447265147265 -r i386
Con el parametro -p le puedes dar un nombre a tu instancia
$ ec2-bundle-vol -d /mnt -k /mnt/pk-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem -c /mnt/cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem -u 447265147265 -r i386 -p ubuntu710apache2
Un ejemplo mas completo, nos guarda los directorios montados virtuales con -a (pero los guarda como locales) y el fichero de arranque fstab con --fstab /etc/fstab
$ec2-bundle-vol -k /s3/pk-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem -c /s3/cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem -u 447265147265 -r i386 -d /mnt -p sugar20080627 -a --fstab /etc/fstab
Diferencias de directorios copiados con -a y sin la opcion -a
$ec2-bundle-vol -d /mnt -k /s3/pk-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem -c /s3/cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem -u 447265147265 -r i386 -p sugar20080627 -a --fstab /etc/fstab
Copying / into the image file /mnt/sugar20080627...
Excluding:
/dev
/media
/mnt
/proc
/sys
/mnt/sugar20080627
/etc/udev/rules.d/70-persistent-net.rules
/mnt/img-mnt

$ec2-bundle-vol -k /s3/pk-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem -c /s3/cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem -u 447265147265 -r i386 -d /mnt -p sugar20080627_1 --fstab /etc/fstab
Copying / into the image file /mnt/sugar20080627_1...
Excluding:
/s3/sugardatas3
/sys
/proc
/dev/pts
/dev
/media
/mnt
/proc
/sys
/mnt/sugar20080627_1
/etc/udev/rules.d/70-persistent-net.rules
/mnt/img-mnt

Creacion y subida de una instancia a S3 con EC2. El bucket se crea automaticamente si no existe
$ ec2-upload-bundle -b pecblom01 -m /mnt/image.manifest.xml -a 03ADK1XS7GH4ZHH74F02 -s JTFIpj9lc+FXaWqwNPaQSlmEKd2Ovxs6oO4kQNln --ec2cert /mnt/cert-PCLWRIZ45AUYXUHW67HG37MRNTD3HBPK.pem
Para terminar, tenemos que registrar nuestra imagen
$ sudo sh ec2-register pecblom01/image.manifest.xml

Para saber las instancias que tienes en pie hacemos lo siguiente
$ ec2-describe-instances

Para apagar una instancia hacemos lo siguiente
$ sudo sh ec2-terminate-instances i-e32ce78a

Para borrar una imagen subida al bucket primero la tenemos que quitar el registro
$ec2-deregister ami-6eb85c07
Y despues ls podemos borrar todos sus ficheros, esto se tiene que hacer desde dentro de la instancia
$ec2-delete-bundle -b blom.valladolid.sistemas.ubuntu -a 03ADK1XS7GH4ZHH74F02 -s JTFIpj9lc+FXaWqwNPaQSlmEKd2Ovxs6oO4kQNln -p crm

Para poder asignar una ip a la misma instancia, solicitamos la ip a Amazon. Solo se pueden solicitar 5 ip por cuenta.
$ ec2-allocate-address

Para saber las ip que tengo y la instancia asociada
$ ec2-describe-addresses

Asociar una ip a una instancia
$ ec2-associate-address -i i-a838f3c1 75.101.139.213

Ver ip's asociadas a instancias
$ ec2-describe-instances

Para desasociar una ip de la instancia
$ ec2-disassociate-address 75.101.139.213

Para poder devolver las ip que hemos reservado
$ ec2-release-address 75.101.144.120

Cuando una instancia termina se desasocia la ip a esa instancia

Para borrar una imagen: primero terminamos la instancia, borramos todos los ficheros de la imagen en el bucket y luego la quitamos el registro $ec2-deregister ami-c5b054ac

Para subir documentos a nuestra instancia lo hacemos asi
$ sudo scp -i id_rsa-gsg-keypair -r /tmp/*.jp*g root@amazon.blom.es:/tmp
Ejemplo:
$ sudo scp -i id_rsa-gsg-keypair -r /tmp/*.jp*g root@ec2-75-101-234-255.compute-1.amazonaws.com:/tmp

Para ver los bucket que tenemos creados
$ s3cmd ls

Vamos acrear un bucket, debemos saber que el nombre del bucket debe ser unico para todos los usuarios de S3
$ s3cmd mb s3://pecblom02

Para ver el contenido de un bucket
$ s3cmd ls s3://blom.valladolid.sistemas

Subir archivos desde nuestro directorio tmp al bucket blom.valladolid.sistemas
$ s3cmd put /tmp/loader.gif s3://blom.valladolid.sistemas

Listado del contenido de un bucket
$ s3cmd ls s3://blom.valladolid.sistemas

Recuperamos un fichero de los que hemos subido, lo guardamos con otro nombre y verificamos que no esta corrupto
$ s3cmd get s3://blom.valladolid.sistemas/conejo.jpg /tmp/conejo2.jpg
Ahora lo verificamos
$ md5sum /tmp/conejo.jpg /tmp/conejo2.jpg

Para subir varios ficheros al bucket
$ s3cmd put /tmp/*.* s3://pecblom02

Para borrar un bucket tenemos que tenerlo primero vacio. Primero borramos los datos
$ s3cmd del s3://pecblom02/conejo2.jpg

Podemos sincronizar un directorio de nuestra maquina con un bucket.
Por ejemplo si nuestro directorio tmp esta vacio y hacemos la sincronizacion de nuestro directorio con el bucket no hace nada.
$ s3cmd sync /tmp/ s3://pecblom02
Pero si sincronizamos nuestro bucket con el directorio vacio tmp de nuestro equipo, nos copia los ficheros del bucket al directorio.
$ s3cmd sync s3://pecblom02 /tmp
Si yo tengo no tengo nada en mi directorio tmp y hago una sincronizacion con el comando --delete-removed borra todo lo del bucket
$ s3cmd sync --delete-removed /tmp/ s3://pecblom02

Borramos el bucket que queramos
$ s3cmd rb s3://pecblom02

Comandos:
Crear bucket
s3cmd mb s3://BUCKET
Borrar bucket
s3cmd rb s3://BUCKET
Listar objetos o buckets
s3cmd ls [s3://BUCKET[/PREFIX]]
Listar todos los objetos en todos los buckets
s3cmd la
Subir ficheros al bucket
s3cmd put FILE [FILE...] s3://BUCKET[/PREFIX]
Descargar ficheros desde el bucket
s3cmd get s3://BUCKET/OBJECT LOCAL_FILE
Borrar ficheros desde el bucket
s3cmd del s3://BUCKET/OBJECT
Sincronizar un directorio con el S3
s3cmd sync LOCAL_DIR s3://BUCKET[/PREFIX] or s3://BUCKET[/PREFIX] LOCAL_DIR
Uso de disco por los buckets
s3cmd du [s3://BUCKET[/PREFIX]]
Informacion variada de los buckets o los objetos
s3cmd info s3://BUCKET[/OBJECT]

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.