Rails sobre Amazon EC2
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.
<!--more-->
<h2>¿Qué es Amazon <span class="caps">EC2</span>?</h2>
<p><span class="caps">EC2</span>, o <em>Elastic Computing Cloud</em> es un servicio de Amazon que nos proporciona máquinas <em>bajo demanda</em>. La idea de negocio de Amazon en este caso es <em>vender potencia de <span class="caps">CPU</span></em>, 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 <em>hosting</em> a precios relativamente moderados: una vez que nuestra máquina en <span class="caps">EC2</span> esté operativa tendremos a todos los efectos acceso como usuario <code>root</code> 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 <em>hipervisor</em> 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.
<p>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 <em>nube elástica</em> 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!)</p>
<p>En este artículo voy a detallar los pasos necesarios para instalar Ruby on Rails en una máquina <span class="caps">EC2</span> desde Mac <span class="caps">OS X</span> 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 <span class="caps">EC2</span> y su aplicación, por supuesto, en nuestras aplicaciones Rails.</p>
<h2>Alta en <span class="caps">EC2</span> y S3</h2>
<p>En primer lugar, hay que darse de alta como cliente de Amazon y suscribir los servicios <a href="http://www.amazon.com/gp/browse.html?node=16427261">S3</a>
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.
<p>Conviene observar que <span class="caps">EC2</span> no es un servicio <em>libre</em> 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.</p>
<h2>Obtener las utilidades</h2>
<p>El primer paso, una vez que hemos recibido un correo de Amazon con la activación del servicio debemos instalar las utilidades <span class="caps">EC2</span> 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.</p>
<p>Tras <a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=351&categoryID=88">descargar las herramientas de línea de comandos aquí</a>
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)
