Crea tu propio AMI basado en Ubuntu, para EC2

En el anterior post explicaba los primeros pasos EC2 donde explicaba todo el proceso desde que nos creamos una cuenta AWS para EC2 , hasta que teníamos nuestra instancia levantada y con con acceso ssh.

En esta nueva entrega, voy a contar los pasos a seguir para crear nuestro propio AMI a partir de la instancia que hayamos levantado, y almacenarla en nuestra cuenta de S3 para posteriormente lanzar nuevas instancias con ella.

¿Por qué me interesa crearme un AMI?

Lo primero de todo es entender por qué nos interesa crearnos un AMI y no utilizar AMIs ya generadas.
Una de las características de EC2, es que la única manera de levantar una instancia es a partir de un AMI. Esto quiere decir que si apagamos nuestra instancia o, por algún problema en Amazon, se apagara accidentalmente (a mí en dos años nunca me ha pasado, pero nunca se sabe...), o necesitamos de una instancia adicional para multiplicar nuestra capacidad de procesamiento, la única manera de levantarla es volviendo a utilizar un AMI.
Como es más que probale, las necesidades de nuestra aplicación requerirá que la instancia esté provista de determinado software o configuración, diferente a la que nos ofrece un sistema base. Por eso, tanto por seguridad (backup) como por escalabilidad, es imprescindible generar nuestra propia AMI.


Primer paso: Instalando el software necesario

Basándome en el anterior tutorial, supondremos que para levantar nuestra instancia utilizamos el AMI ami-bf5eb9d6 , una Ubuntu 9.04 base sin software adicional preinstalado.

Si usamos Ubuntu 9.04 es muy muy sencillo el proceso de creación de un AMI (de ahí mi recomendación), por lo que si no eres muy experto como administrador de sistemas Linux/Unix, y es la primera vez que te enfrentas al proceso de crear un AMI, piénsatelo dos veces antes de elegir otra distribución. Yo personalmente tuve muchísimos quebraderos de cabeza con otras distros como Fedora o Gentoo (módulos del kernel necesarios no instalados, repositorios desactualizados, librerías no instaladas, necesidad de compilar las aplicaciones, etc... )

Esto no quiere decir ni mucho menos, que sólo se pueda utilizar Ubuntu. De hecho hay muchísima gente que utiliza Fedora en EC2. Todo depende de tus necesidades, de tu nivel de conocimientos, y del tiempo que quieras/puedas dedicarle a preparar tu instancia antes de generar un AMI. Lo que si te puedo asegurar es que esta es la forma más sencilla, rápida y cómoda para hacerlo. Sobre todo si te estás iniciando en EC2.

Para generar nuestro AMI necesitaremos la herramienta oficial de Amazon ec2-ami-tools, que nos permitirá tanto generar el AMI como subirlo a nuestra cuenta de S3.

En Ubuntu 9.04 tendremos que tener activados los repositorios Multiverse (fijate que en el link explica cómo activar los repositorios universe y multiverse para hardy, y la 9.04 es jaunty). Es probable que si elegiste el AMI que yo propongo para levantar la primera instancia, los repositorios multiverse ya vengan activados, pero no está de más asegurarse.
Una vez hecho esto, simplemente ejecuta por consola y ya tendremos instalado el EC2 AMI Tools

CODE:
  1. sudo apt-get update
  2. sudo apt-get install ec2-ami-tools

Si has preferido utilizar como base otra distro de Linux distinta a Ubuntu, también puedes descargar EC2 AMI Tools en .rpm, y si tu distro no soporta rpm, puedes tratar de convertirlo con algún conversor de paquetes. Si usas una versión antigua de Ubuntu, puedes utilizar Alien para crear tu .deb

Segundo Paso: Obteniendo los Certificados X.509

Cuando creamos un AMI, esta pasa a pertenecer al usuario AWS que la creó, certificadas internamente por certificados X.509 que autentican la pertenencia al usuario en el momento de intentar instanciarlas.

Lo primero que tenemos que hacer es acceder a nuestro perfil de AWS en la sección Access Identifiers. Allí encontremos una sección llamada X.509 donde podremos pedir a Amazon que nos genere nuestro certificado ("Create New").

creatuami-1

Si ya habías creado un certificado anteriormente, nos avisará de que sólamente podemos tener un único certificado por cuenta, por lo que si continuamos el anterior certificado quedará inservible.

Inmediatamente llegaremos a una página donde podemos descargar dos archivos .pem. El primero es el archivo de Clave Privada, y el segundo el Certificado X.509

creatuami-2

Amazon lo avisa en ésta misma página, pero yo vuelvo a insistir : Guarda en un lugar seguro el archivo de clave Privada !!
El Certificado lo podrás descargar nuevamente si lo pierdes, pero el archivo de Clave Privada no. Tendrás que generar uno nuevo, y no es algo que te recomiendo. Como comenté, el certificado (y por ende, la clave privada) se utilizan para autenticar la pertenencia de cada AMI. Como podrás imaginar, si generas un AMI con un certificado y lo pierdes, al generar un nuevo certificado tu cuenta de AWS quedará asociada a éste nuevo, por lo que el AMI generada será como si no fuera tuya. Aunque esté alojada en tu propia cuenta de S3. Avisado quedas ! :P

El siguiente paso será subir los dos archivos .pem a nuestra instancia.

¿Cómo?

Pues como más cómodo te resulte... :P
Si tienes una consola Unix puedes ejecutar
scp <private_keyfile> <certificate_file> root@<dns_location>:/mnt

Donde <private_keyfile> <certificate_file> sean las rutas de tus dos archivos .pem

Yo personalmente prefiero usar un cliente scp/sftp con GUI. En MAC OSX uso Transmit (29.95 $), y en Windows usaba WinSCP (gratuito).
Pero ya es cuestión de gustos.


Tercer Paso: Generando nuestro AMI

Ya tenemos todo lo necesario para generar el AMI. Para facilitar el trabajo y no tener que escribir el mismo comando cada vez que queramos regenerar el AMI, os pongo adjunto (al final del post), dos scripts sh que harán el trabajo sucio por tí : ec-bundle.sh (para generar el AMI) y ec-upload.sh (para subir el AMI a tu cuenta de S3)

Simplemente tienes que editarlo para incluir los datos de tu cuenta, y dejarlos alojados en un directorio que se incluyan en el AMI (yo dejo los mios en /root que es el directorio que accedo por defecto al entrar por ssh).

Para empezar editamos ec-bundle.sh, que incluye la siguiente linea de código:

CODE:
  1. ec2-bundle-vol -k 'pk-********************************.pem' -c 'cert-********************************.pem' -s 1000 -u ************ -d /mnt/ami/

El primer grupo de "*", como podréis intuir, corresponde a la ruta del archivo de clave privada (el que empieza por pk-). El segundo es la ruta al archivo de certificado (el que empieza por cert-), y el último grupo corresponde a tu identificador de usuario EC2. Si no sabes cuál es tu identificador de usuario, simplemente abre tu Elasticfox (con el que levantamos la instancia en el tutorial anterior), y en la pestaña Instances, haz click derecho sobre tu instancia y entra en View Details. Ahí encontraremos un campo llamado Owner ID. Ese es nuestro identificador de usuario !!

creatuami-3

Una vez guardados los cambios, ya podemos ejecutar el script escribiendo

CODE:
  1. ./ec-bundle.sh

Deberíais obtener algo parecidoa a :

creatuami-4

Si es así , es que todo ha ido bien y ya tenemos nuestra AMI creada. Si te fijas, hay un listado de directorios que son omitidos a la hora de generar el AMI, por lo que procura que tu aplicación no incluya ninguno de esos directorios o ficheros. Si por algún casual la lista de directorios excluidos por defecto no satisficiera tus necesidades, consulta la documentación de ec-bundle-vol para especificar otra lista de directorios o fichero a excluir.

Quinto Paso: Subir nuestro AMI personalizado a S3

Ya sólo nos queda modificar ec-upload.sh con nuestros datos de acceso a S3. Si lo editas verás la linea

CODE:
  1. ec2-upload-bundle -b $1 -m /mnt/ami/image.manifest.xml -a ******************** -s ****************************************

El primer grupo de "*" corresponde a tu Access Key Id, y el segundo a tu Secret Access Key. Ambas las puedes encontrar en tu perfil de usuario AWS en la sección Access Identifiers. El parametro siguiente al modificador -b corresponde al nombre del bucket de nuestra cuenta S3 donde queremos almacenar el AMI.
Te habrás fijado que como nombre del bucket he puesto $1. Si no estás familiarizado con el Shell Scripting, simplemente tienes que saber que esa es la forma de acceder al primer parámetro que le hayamos pasado al ejecutar el script. Esto lo he dejado así porque es probable que cada vez que quieras rehacer el AMI lo quieras guardar en un bucket distinto (para guardar de forma incremental el ami en buckets que incluyan la fecha  de generación por ejemplo).

De ésta manera, simplemente ejecutaríamos

CODE:
  1. ./ec-upload.sh nombre-del-bucket

Y comenzaría el proceso de upload.
Si lo que quisieramos es guardar siempre el AMI en el mismo bucket, simplemente sustituye "$1" por el nombre del bucket y listo.

Nota: ec2-upload-bundle genera el bucket en S3 si no existe, por lo que no es imprescindible crear el bucket previamente para subir nuestro AMI

Sexto y último Paso: Registrar nuestro AMI

Como habrás podido comprobar al lanzar una instancia, siempre se hace utilizando un id de ami. Esto es porque Amazon tiene una base de datos de todas las AMIs generadas y listas para instanciar, lo que nos obliga a registrar nuestro AMI recién creado para que nos asignen un id.

Para ello simplemente abrimos Elasticfox, y nos vamos a la sección de Images. Allí encontrarás un botón de "Registe AMI". Hacemos click en él y nos preguntará el AMI Manifest Path.

Siemplemente tenemos que poner : nombre-de-nuestro-bucket/image.manifest.xml

En unos pocos segundos veremos como una nueva AMI aparece en nuestra lista de AMIs disponibles, con su nuevo id asignado. Para encontrarla en un futuro podemos apuntarnos su id y utilizarlo, buscarla por el nombre del bucket, o simplemente ordenar por Visibility y aparecerá entre las "private".

Comentarios Finales...

Ya tenemos lista nuestra propia AMI !
Simplemente añadir que cuando registramos un AMI, Amazon asocia el id generado con la ruta del Manifest (el archivo .xml que se genera junto a nuestra AMI). Si queremos rehacer nuestro AMI para incluir nuevos cambios en nuestra aplicación, y lo guardamos en el mismo bucket, sin modificar el nombre del Manifest, no será necesario volver a registrar el AMI.

Bueno, espero que os haya sido útil y os haya gustado

Cualquier comentario, crítica o alguna cosilla más que queráis que añada, no dudéis en avisarme.

Un Saludo !!

Scripts Adjuntos:

ec-ubundle
ec-upload

18 Comentarios

  1. nacho says:

    Oye, cojonuda la explicación! Esto me lo guardo!

  2. fillito says:

    @nacho: Gracias tio !!

  3. Juan says:

    Gracias por la explicación, pero como siempre, me surgen dudas jejeje. Y como no sé mucho inglés en la web de Amazon me pierdo, la verdad.

    Podrías decir cúanto vale aproximadamente tener una AMI personalizada? porque supongo que subirla al S3, cargarla cuando arranques la instancia,… eso tendrá un coste no?

    Otra cosa que no tiene que ver con este artículo pero que me parece interesante es si se puede “attachear” el mismo volumen EBS a dos instancias distintas.

    Y ya si dieses unas nociones de como obtener una Elastic IP, cúanto vale y como usarla sería la ostia jejeje

    Ya sé que pido mucho, pero es que no conozco a nadie que haya usado este servicio tan intensivamente como tú, y encima hable español jejejeje Y estoy pensando en hacer una web en EC2 pero me asaltan muchas dudas, entre ellas, las que he puesto arriba.

    Bueno, gracias por todo y un saludo.

  4. fillito says:

    @Juan: Hola !

    Lo del Elastic IP si te parece lo explico en otro post, porque es un tema bastante interesante, que aunque es de lo más sencillo del mundo, estaría guay publicarlo para todos. Te prometo que pronto publico uno explicando todo el proceso.

    En cuanto a tus otras consultas :

    Costes de tener almacenado el AMI en S3: Cuando generamos un AMI, lo guardamos en nuestra cuenta de S3 en un bucket más como si de cualquier otro conjunto de ficheros. Los costes de S3 dependen de la zona donde los almacenes (Europa o Estados Unidos), de la cantidad de datos que almacenes, y de la transferencia de datos que hagas.
    Uno de mis AMIs por ejemplo, ocupa 308 MB. Depende del software y Sistema Operativo que lleve tu AMI, pero lo normal es que ocupen algo parecido.
    Poniendo el caso de un AMI de 500 MB (para calcular por lo alto), alojado en un bucket en Estados Unidos, que son más baratos, te supondría un coste de: 0,5(GB) * 0,15($ por GB/mes) = 0,075$ .. que al cambio en € vienen a ser unos 0,055€. Sumado a 0€ de transferencia (ya que la transferencia entre S3 y EC2 es gratuita). Te saldía todo alrededor de unos 5 céntimos de € al mes :P
    (Aquí tienes la tabla de precios http://aws.amazon.com/s3/)
    Como verás … más que asequible

    El tema de EBS tiene interes como para otro post más (y tengo pensado escribirlo), pero respondiendo a tu pregunta: No puedes “atachear” el mismo EBS a dos instancias distintas AL MISMO TIEMPO.
    Como sabrás, EBS es una forma de dotar a EC2 de almacenamiento persistente apoyandose en S3. Cuando montas un EBS en una de tus instancias, se queda bloqueada y no puede ser usada hasta que la desmontes de la instancias, o apagues la misma. Eso sí, lo que sí que puedes hacer es montar tantos bloques de EBS como quieras sobre la misma instancia.

    Espero haber podido responder a la mayoría de tus dudas. Si tienes más, no dudes en preguntar.

    Un saludo !!

  5. Juan says:

    Gracias por contestar tan rápido!

    No sabía que el tráfico entre S3 y EC2 era gratis, entonces sí que sale rentable crear una AMI jejeje.

    Lo que sigo sin entender bien es que dices que una AMI ocupa poco (sobre 500 MB), cuando yo creía que la AMI era como un snapshot del sistema operativo. Pensaba que incluía la partición de / . Me refiero a que si la partición montada en / ocupa 15 GB, pues la AMI ocuparía eso como mínimo.
    No lo entiendo muy bien, porque entonces tú haces tu AMI y cuando la cargas en una instancia de dónde monta las particiones que están en el fstab?

    Gracias por todo una vez más, y espero ansioso, de nuevo, los artículos sobre EBS y Elastic IP jejejeje

  6. fillito says:

    @Juan : Hola de nuevo ! me pillas aquí en casa medio aburrido y por eso contesto rápido … jejeje

    Un AMI es justo un snapshot de tu sistema operativo, pero hay que tener en cuenta algunas cosas. Cuando creamos el AMI se excluyen algunos directorios, y además se genera comprimida.
    Un sistema como el que propongo, una Ubuntu 9.04 base con nada de software adicional ocupa unos 900 MB. En una instancia estandar de tipo Small (http://aws.amazon.com/ec2/instance-types/) tienes a tu disposición únicamente 10GB para la partición de root. Adicionalmente se monta una partición en /mnt con 150 GB para trabajar.
    Te adjunto la salida de un df en mi máquina:

    Filesystem 1K-blocks Used Available Use% Mounted on
    /dev/sda1 10321208 927908 8869012 10% /
    tmpfs 873880 0 873880 0% /lib/init/rw
    varrun 873880 56 873824 1% /var/run
    varlock 873880 0 873880 0% /var/lock
    udev 873880 108 873772 1% /dev
    tmpfs 873880 0 873880 0% /dev/shm
    /dev/sda2 153899044 1577460 144503960 2% /mnt

    EC2 está pensado para el procesamiento de datos, y no es normal necesitar tanto espacio para / (fijate que incluso las instancias de más capacidad siguen incluyendo 10GB para root).

    No se, … te recomiendo que te animes a probar a crearte la tuya y ver qué tal. Sea como sea, en el hipotético caso de que tu AMI ocupase 15GB (que estoy seguro no lo hará … :P ), te seguiría costando todo algo así como 1,8€ … que sigue siendo muy razonable.

    Un saludo !!

  7. Juan says:

    Vale, gracias Fillito, creo que ya lo he entendido. Un saludo crack! :)

  8. KeHoeff says:

    hey this is a very interesting article!

  9. Alberto says:

    De nuevo increíble!

    Ya tengo mi propia AMI montada gracias a este genial post.
    Siguiendolo de pe a pa no he tenido ningun problema.

    Enhorabuena y gracias.

    Saludos
    Alberto

  10. fillito says:

    Gracias por tus palabras Alberto. Me alegro de que haya sido útil ;)

  11. Ra y Mon says:

    Hola Filito,

    ¡por fin encuentro informacion fiable y detallada sobre ec2 de alguien que la utilice en España! ¡Muchisimas gracias!

    Somos una starup a punto de lanzar la version publica de nuestra web. La oferta de Amazon es la que mas nos atrae a todos los niveles (sobre todo por la escalabilidad), pero hay una cosa que nos retiene: sus servidores (entendemos que) estan situados en Dublin.

    ¿No afecta esto a la velocidad de la web para usuarios españoles? Y mas importante… ¿no os penaliza de cara a Google y demas buscadores que tienen en cuenta la localizacion de la IP a la hora de ordenar los resultados?

    Gracias de nuevo!

    Ra y Mon

  12. Newman says:

    Hola Fillito

    Te cuento que soy nuevo en esto de la Cloud Computing y me parece muy interesante todo lo que aqui he leido pues me ha ayudado a enteder muchas cosas.

    Soy estudiante ultimo año de la carrera ing informatica y tengo como tesis montar una nube (con Eucalyptus)en un Data Center en la empresa donde hago las practicas. El motivo por el cual le escribo es que a pesar de lo mucho que he leido no logro enterder como es el proceso de crear mi propia imagen de un SO (Windows). Quisiera que si sabes sobre el tema me orientaras o me dieras alguna guia para hacerlo…Saludos y gracias por publicar este estupendo Blog..

  13. Seba says:

    Hola Fillito!

    Primero agradecerte por el gran post y segundo preguntarte algo bien cortito.
    Te cobran por crear AMI?

  14. fillito says:

    Hola Seba !

    Gracias por tus palabras.
    En cuanto a tu pregunta… directamente, no. Me explico :

    Para crear tu AMI tendrás que levantar una instancia de EC2, y almacenar el AMI en un bucket de tu cuenta S3. Pagarás por el tiempo que tengas despierta la instancia, y mes a mes por almacenar el AMI en S3.
    Crear el AMI es un proceso rápido, por lo que en la primera fracción de una hora podrás tenerlo, así que pagas unos pocos céntimos, y el almacenamiento del ami, que serán unos pocos cientos de megabytes, unos pocos céntimos mes a mes.
    Por eso te digo que crear un AMI es completamente gratuito, aunque indirectamente tendrás que pagar unos céntimos. :)

    Un saludo !!!

  15. Seba says:

    Bárbaro. Muchas gracias como siempre una excelente respuesta

  16. Excelente los 3 articulos de Amazon. Esperamos mas!!

Deja un Comentario