En este artículo haremos una breve introducción al servicio Amazon Elastic Computing Cloud (EC2) y describiremos los pasos necesarios para ejecutar nuestra propia instancia y lanzar una aplicación Rails.

¿Qué es Amazon EC2?

EC2, o Elastic Computing Cloud es un servicio de Amazon que nos proporciona máquinas bajo demanda. La idea de negocio de Amazon en este caso es vender potencia de CPU, y nada más. Este servicio está ligado a S3, el sistema de almacenamiento flexible de bajo coste que también nos ofrece, cómo no, la compañía de Bezos, que se posiciona así como líder a la hora de ofrecer un nuevo tipo de hosting a precios relativamente moderados: una vez que nuestra máquina en EC2 esté operativa tendremos a todos los efectos acceso como usuario root a un PC de mediana potencia conectado a Internet corriendo el sistema operativo que hayamos escogido, con la particularidad de que esta máquina no es real, sino que corre bajo un hipervisor Xen instalado en una máquina (ahora sí) real gestonada por Amazon. Este detalle más que un inconveniente es una ventaja porque aporta el factor de flexibilidad que hasta hace poco ningún otro proveedor de hosting puede dar: podemos clonar máquinas en EC2 a partir de la imagen de disco bajo demanda, y su funcionamiento se facturará por horas o fracciones lo que nos permite ajustar con bastante exactitud el gasto en CPU a la carga de trabajo necesitada en cada momento. Porque el detalle final es que Amazon sólo facturará cuando las máquinas estén funcionando: igual que podemos desplegar nuevas máquinas según queramos, también podremos pararlas a voluntad, y cuando una máquina se encuentre suspendida no se imputan costes en nuestra maltrecha tarjeta de crédito.

No es de extrañar que este invento de Amazon esté especialmente dirigido a los desarrolladores web, que pueden montar fácilmente arquitecturas en capas distribuidas usando la nube elástica de Amazon y escalar según sus necesidades (¿Necesitamos dos servidores de aplicación más? ¡Sin problema, clona uno que ya tengas! ¿Un servidor de memcached? ¡En cinco minutos!)

En este artículo voy a detallar los pasos necesarios para instalar Ruby on Rails en una máquina EC2 desde Mac OS X y acceder a nuestra aplicación desde el exterior, que como comienzo creo que no está mal. En posteriores artículos intentaré explorar las prestaciones más avanzadas de Amazon EC2 y su aplicación, por supuesto, en nuestras aplicaciones Rails.

Alta en EC2 y S3

En primer lugar, hay que darse de alta como cliente de Amazon y suscribir los servicios S3 y EC2 Es importante hacerlo por este orden, porque el alta en Amazon EC2 no puede realizarse a no ser que ya seamos usuarios de S3. Es en estos pasos donde daremos nuestros datos de facturación aunque (como era de esperar) si ya eres cliente de Amazon se te presentarán las tarjetas de crédito que has venido usando en la tienda web. También podremos ver en estas páginas la tabla de precios, que básicamente consisten en tarifas por hora de CPU (10 centavos de dólar por hora o fracción ) y por tasa de transferencia (10 céntimos por Gigabyte de entrada y de 18 a 13 centavos por gigabyte de salida) Los costes de S3 no están incluidos, lógicamente.

Conviene observar que EC2 no es un servicio libre sino que se admiten nuevos usuarios según Amazon va ampliando su capacidad, esto es: el alta no es inmediata sino que hay que esperar (en mi caso creo que han sido unos dos meses) hasta que nos dan de alta. En S3, por el contrario, la activación es instantánea.

Obtener las utilidades

El primer paso, una vez que hemos recibido un correo de Amazon con la activación del servicio debemos instalar las utilidades EC2 en nuestro ordenador, que requieren de una máquina virtual Java. En el caso de Mac OS, la máquina virtual instalada por defecto servirá sin mayor inconveniente.

Tras descargar las herramientas de línea de comandos aquí podemos descomprimirlas en algún directorio de nuestra elección, en mi caso /Users/juan2/src, lo que creará la carpeta ec2-api-tools-1.2-9739 que asignaremos a la variable EC2_HOME


export EC2_HOME=/Users/juan/src/ec2-api-tools-1.2-9739

En Mac OSX hemos tenido que definir la variable JAVA_HOME a /usr de forma que las utilidades EC2 puedan encontrar el intérprete de Java en su ubicación estándar (/usr/bin)

Generando certificados de autenticación

Para usar las herramientas EC2 es necesario generar un par de claves utilizando algún mecanismo de cifrado. Estas claves podemos generarlas entrando en el portal de servicios web de Amazon

En nuestro caso hemos decidido utilizar una clave privada y certificado X.509. Aunque la clave privada sólo se genera una vez (hay que tener cuidado con ella), podremos consultar el certificado siempre que lo deseemos aquí

Guardaremos el certificado utilizando nuestro editor de textos favorito recortando todo lo incluido entre las palabras BEGIN CERTIFICATE y END CERTIFICATE de la página del navegador y guardandolo en algún sitio interesante. Haremos lo mismo con la clave privada (teniendo en cuenta que en este caso los rótulos son BEGIN PRIVATE KEY y END PRIVATE KEY)

Nosotros hemos almacenado la clave privada y el certificado en el directorio $HOME/.ec2 con los nombres ec2-pk.pem y ec2-cert.pem respectivamente. Deberemos, por tanto, disponer de las siguientes variables de entorno:

1
2
3
export EC2_CERT=/Users/juan/.ec2/ec2-cert.pem
export EC2_PRIVATE_KEY=/Users/juan/.ec2/ec2-cert.pem
export PATH=$PATH:$EC2_HOME/bin

Elección de imagen para instalar

Una vez que está resuelta la cuestión de identificarnos adecuadamente en Amazon, el siguiente paso es escoger una imagen de máquina (o AMI, de Amazon Machine Image) que contendrá el sistema operativo y configuración que deseemos, y arrancaremos una instancia de la imagen en concreto. Esto nos permite ejecutar varias instancias de una misma imagen, lo que equivaldría a tener varios ordenadores que parten de una misma configuración que hayamos fijado de antemano.


Tamarindo:~ juan$ ec2-describe-images -a

Veremos un listado con un montón imponente de máquinas preinstaladas. Las más interesantes son las predefinidas por Amazon, con versiones de Fedora Core 4 y algunos paquetes preinstalados, estas son algunas de ellas:

1
2
3
IMAGE   ami-20b65349    ec2-public-images/fedora-core4-base.manifest.xml        amazon  available       public
IMAGE   ami-22b6534b    ec2-public-images/fedora-core4-mysql.manifest.xml       amazon  available       public
IMAGE   ami-23b6534a    ec2-public-images/fedora-core4-apache.manifest.xml      amazon  available       public

Pero nada impide a los usuarios de EC2 definir y compartir sus propias AMIs, con lo que si buscamos un poco seguro que encontraremos alguna AMI que se ajuste más a nuestros propósitos (las hay con Wordpress preinstalado, JBoss, etc). Nos quedaremos con ami-b7b95cd, que es una imagen virtual con Debian Etch (aunque en realidad parece ser Ubuntu, según pudimos comprobar a posteriori)

Generar keypair

Si antes tuvimos que generar un par de claves para que las herramentas de línea de comandos puedan identificarse correctamente en nuestro nombre ante el servicio EC2, ahora es el turno de generar otro par de claves para poder acceder a nuestra instancia una vez que se encuentre activada.

Siguiente las instrucciones de esta página, generaremos un par de claves con el siguiente comando


Tamarindo:~ juan$ ec2-add-keypair sbr-test1

Guardando el resultado en un fichero de nuestra elección, por ejemplo ~/.ec2/id_rsa-sbr-test1 Este fichero no debe tener permisos de lectura para el resto de usuarios o de lo contrario ssh no nos permitirá utilizarlo como credenciales (un chmod 600 … debería ser suficiente)

Activación de la instancia de nuestra AMI

Ha llegado el momento de la verdad: arrancar una instancia de la máquina escogida. Esta instancia nos pertenecerá en todo momento y quedará desvinculada de su AMI inicial.

1
2
3
Tamarindo:~ juan$ ec2-run-instances ami-b7b95cde -k sbr-test1
RESERVATION     r-7052b519      346199905863    default
INSTANCE        i-d66a8abf      ami-b7b95cde                    pending sbr-test1       0

El comando nos indica que nuestra instancia se encuentra pending, esto es, aún no está operativa: el proceso tarda un par de minutos en completarse, durante el cual podemos comprobar el estado de nuestra instancia hasta que el resultado sea parecido al que mostramos a continuación:

1
2
3
4
Tamarindo:~ juan$ ec2-describe-instances i-d66a8abf
RESERVATION     r-7052b519      346199905863    default
INSTANCE        i-d66a8abf      ami-b7b95cde    ec2-72-44-35-69.z-2.compute-1.amazonaws.com     domU-12-31-35-00-0A-01.z-2.compute-1.internal
 running sbr-test1       0

Podemos comprobar que el estado es running y que tenemos dos interfaces disponibles, el segundo de ellos (domU-..) es el nombre de la máquina en la red interna de Amazon (conviene utilizarlo a la hora de establecer conexiones entre instancias) y el primero de ellos es el que utilizaremos para acceder a la máquina desde cualquier punto de Internet como veremos más abajo.

Autorizar tráfico a la máquina virtual

Pero antes de entrar en la máquina hay que permtir el acceso a los puertos de la misma, que por defecto estarán cerrados. Autorizaremos los puertos 22 y 80, por motivos evidentes:

1
2
3
4
5
6
Tamarindo:~ juan$ ec2-authorize default -p 22
GROUP           default 
PERMISSION              default ALLOWS  tcp     22      22      FROM    CIDR    0.0.0.0/0
Tamarindo:~ juan$ ec2-authorize default -p 80 
GROUP           default 
PERMISSION              default ALLOWS  tcp     80      80      FROM    CIDR    0.0.0.0/0

Login en nuestra instancia

Ya está todo listo, no nos quedan más pasos que dar salvo entrar en nuestra flamante instancia para ver el familiar mensaje de bienvenida de Ubuntu:

1
2
3
4
5
6
7
8
9
10
Tamarindo:~ juan$ ssh -i /Users/juan/.ec2/id_rsa-sbr-test1 root@ec2-72-44-35-69.z-2.compute-1.amazonaws.com 
Linux ubuntu 2.6.16-xenU #1 SMP Thu Nov 30 13:48:50 SAST 2006 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
ubuntu:~# 

Es interesante notar que esta imagen se encuentra optimizada para su uso bajo Xen (lo que nos viene de perlas).

Entorno de desarrollo con Rails

Cualquier manual para instalar Rails en Ubuntu servirá. En nuestro caso, instalaremos sudo, crearemos un usuario normal y lo añadiremos a /etc/sudoers. Abandonaremos la cuenta root y haremos ssh con este usuario:

1
2
3
4
apt-get install sudo
adduser juan
vi /etc/sudoers
exit

ssh juan@ec2-72-44-35-69.z-2.compute-1.amazonaws.com 

Esta vez tendremos que identificarnos con nuestra propia clave, ya que ahora no estamos usando el par de claves anteriormente generadas (nada nos impide generarnos otro par para esta nueva cuenta de usuario) A continuación daremos la bienvenida a los sospechosos habituales:

1
2
3
4
5
sudo apt-get install ruby1.8-dev
sudo apt-get install build-essential
sudo apt-get install rubygems
sudo apt-get install rails
rails pruebas

Arrancaremos nuestra aplicación (de momento usando Webrick) escuchando en el puerto 80:


juan@ubuntu:~/pruebas$ sudo script/server --port 80 -b 0.0.0.0

Tras lo cual…..

Con esto podemos dar por concluida la primera ráfaga de instalación de Rails en nuestra instancia EC2, aunque antes…

¿Y para terminar?

Como decíamos, la instancia de la máquina imputará costes en nuestra cuenta por cada hora de uso, así que de momento no queremos dejarla funcionando. Para parar la instancia:

1
2
Tamarindo:~ juan$ ec2-terminate-instances i-8b7191e2
INSTANCE        i-8b7191e2      running shutting-down

Conclusión

Hemos avanzado un trecho importante: hemos sido capaces de acceder a una instalación de Rails que vive en la nube elástica de Amazon. En próximos artículos espero poder mostrar algunas de las prestaciones más avanzadas de Amazon (a medida que las vaya explorando, vaya)

3 Responses to “Rails sobre Amazon EC2”

  1. Javier Vidal Postigo Says:

    Muy interesante, Juan.

  2. foxy Says:

    ¿y esto del Ruby on Rails qué es? ¿me lo puedes mandar al correo? ¿hay tetas?

    Ahora en serio. Es interesante, pero más interesante sería que alguien le echara valor y llevase una “sucursal” de amazon en español (no digo que para España, que eso ya sería demasiado pedir).

    perdón por el offtopic salud

  3. Carlos Vela Says:

    ¿Qué se debe entender como hora de uso…?

    ¿Desde ec2-run-instances hasta ec2-terminate-instances?

    Como siempre, genial.

Sorry, comments are closed for this article.