Amazon Elastic Beanstalk

19 enero 2012

Visto que con Heroku se me esta atragantando el tema del despliegue de JSF 2, me he decidido a seguir los cantos de sirena y probar Amazon Elastic Beanstalk. La publicidad dice que Amazon me dá gratuitamente un Tomcat 6 o Tomcat 7 en la nube, así que merecía darle una ojeada. Lo primero de lo que me doy cuenta es que Amazon Elastic Beanstalk en realidad no es solo un Tomcat, sino que mas bien podríamos definirlo como un agrupamiento de tecnologías que Amazon ya tenía que se ofrecen simplificadamente y bajo un mismo paragüas, como EC2, S3, EBS, CloudWatch, etc... La página de Beanstalk promete que se despliegan WARs normales y corrientes y que se puede usar cualquier librería Java con normalidad, a esto le sumamos Amazon SimpleDB como base de datos relacional y Amazon DynamoDB como NoSQL y tenemos un stack potentísimo a nuestra disposición. Esta la parte buena, ahora la mala.

La mala para empezar es que solo dan un año de uso gratuito. Pero no un año de tiempo de computación ni nada así, no. Un año de uso desde el momento del registro. Punto. Un poco rácano a mi parecer, preferiría que me limitasen más en recursos disponibles y no tener límite de tiempo, pero bueno.

Para continuar la muy mala. La muy mala es que, por lo que te piden en el registro, parece que vivo en Libia o en Cuba o qué sé yo. Durante el proceso de registro hay que crear una cuenta, proporcionar una tarjeta de crédito (¿no es gratuito? Entiendo que la pidan por si me paso de recursos, pero quizás en ese caso sería preferible echar abajo el servicio oportuno hasta el mes siguiente) y te hacen una llamada telefónica para que confirme con un pin que aparece en la pantalla tu identidad. Lo dicho, un poco paranoide.

Una vez habiendo pasado por todo este calvario, me decido a seguir el primer tutorial de ejemplo en Amazon.

Resumen

  1. Instalar Eclipse 3.7 JEE y el plugin AWS Toolkit para Eclipse.
  2. Crear un proyecto y configurar la cuenta de AWS.
  3. Análisis del proyecto.
  4. Crear un servidor en Elastic Beanstalk y desplegar el proyecto.
  5. Modificar el proyecto y redesplegar.
  6. Parar el servidor.

Paso 1

Descargar el Eclipse for Java EE Developers en la versión oportuna (en mi caso, Linux 64 bits) de aquí. Cuando haya bajado basta con descomprimirlo y ejecutarlo.

Para instalar el AWS Toolkit, una vez abierto el Eclipse, pulso Help > Install New Software ... > Add y en el diálogo Add Repository, en Name pongo "AWS" y en Location "http://aws.amazon.com/eclipse", Ok. Selecciono el nuevo repositorio en el desplegable y ya abajo sale "AWS Toolkit for Eclipse". Lo selecciono y Next, Next, acepto las licencias, acepto que se instale software sin firmar (sigh) y reinicio Eclipse una vez instalado.

Entorno instalado, guay, sin mayor problema.

Paso 2

Para crear un proyecto para desplegar en AWS, hago click en File > New > Other > AWS > AWS Java Web Project.

Nuevo Proyecto AWS

Pulso Next. Para que un proyecto AWS sea desplegable necesita una información acerca de la cuenta del desarrollador, eso, junto con el nombre del proyecto es lo que tengo que configurar en esta pantalla. Como es la primera vez que entro, tengo que crear la cuenta, así que hago click en "Configure AWS Accounts" y veo la siguiente pantalla.

Configurar cuenta de AWS

Y ahí estan los datos de la cuenta, hay que ponerle un nombre de cuenta (meramente identificativo para el Eclipse), una clave de acceso y una clave secreta. Como no tengo ni idea de que es eso, hago click encima de "find your existing AWS security credentials" y una vez logado en la página de AWS veo una pantalla que haciendo scroll tiene esta pinta:

Credenciales de Seguridad

Ahí (en el borrón) esta la clave de acceso y si hago click en "mostrar" veo la clave secreta. Pues nada, copiar y pegar a la ventana del Eclipse. Hago click en Ok y en la pantalla de configuración del proyecto dejo seleccionado "Basic Java Web Application". Finish.

Paso 3

El proyecto recién creado es un proyecto web dinámico normal de Eclipse.

Proyecto Java Web AWS

Tiene una carpeta src/ en la que se encuentran los fuentes de Java, de momento vacía, una carpeta webcontent en la que va el contenido web de la aplicación (jsp, html, css, js, png, gif, etc...) y dentro de ella, como es habitual, una carpeta WEB-INF con el web.xml dentro y un directorio lib (también vacío).

El web.xml es absolutamente normal, y lo único destacable es que dentro de src/ se encuentra un archivo llamado "AWSCredentials.properties" que contiene... las credenciales en texto plano. Bueno, yo no es por ser destroyer, al fín y al cabo esa información solo es accesible para el desarrollador (es decir, yo mismo), pero tampoco cuesta trabajo cifrarlo con algún hash, por aquello de mejorar algo la seguridad. Sus motivos tendrán.

De momento, el proyecto cumple lo prometido, Java Web normal y corriente. Ahora toca ver qué tal la ejecución.

Paso 4

Para ejecutar el proyecto, hago click encima de él con el botón derecho y selecciono Run As > Run on Server... En esta pantalla dejo seleccionado "Manually define a new server" y selecciono un AWS Elastic Beanstalk for Tomcat 6. En "Server host name" escribo Tomcat6AWS y pulso Next.

Nuevo Tomcat 6 AWS

En la siguiente pantalla tengo que seleccionar para empezar una región en la que desplegar el proyecto. No sé si será un bug del plugin o que solo esta permitido ahí, pero solo me deja seleccionar US-East(Northern Virginia). Me hubiera gustado más seleccionar Europe(Ireland) por aquello del tiempo de latencia, pero bueno.

Lo siguiente son conceptos ya propios de Amazon Elastic Beanstalk. Una aplicación (application) es un producto software (un WAR, vaya) con una configuración y una versión determinada, mientras que un entorno (environment) es una instancia determinada de esa aplicación.

Pues vale, dejo marcado "Create a new application" y en Name pongo AWSJavaWeb. Para el Environment uso de nombre AWSJavaWeb igualmente.

Application y Environment

En la siguiente pantalla, Advanced Configuration, la verdad que no entiendo nada, parece que es algún sistema de autenticación (¿otro?), pero sigo el tutorial y selecciono "Deploy with a key pair" y le doy a Add (la cruz verde). Me sale un diálogo para introducir un nombre y un directorio, de nombre uso AWSJavaWeb y el directorio lo dejo tal y como esta. Pulso Ok y pulso Finish.

Advanced Configuration

Pero todavía sale un cuadro de diálogo más... pidiéndome la versión de la aplicación, claro. Escribo v20120118.01 (primera versión, 18 de Enero de 2012).

Versión de la Aplicación

Pulso OK y espero mientras el cuadro de diálogo me va informando. Entiendo que el proceso es generar un WAR, subirlo a Amazon S3, crear una instancia de Amazon EC2 con el Tomcat 6 y desplegarlo... nada más... Cuando acaba:

Aplicación desplegada en Elastic Beanstalk

Paso 5

Para ver como lleva esto los cambios, abro index.jsp y cambio el contenido de la etiqueta "title" a lo siguiente: Hello agustinventura AWS Java Web Application.

Guardo los cambios, click con el botón derecho en el proyecto, Run As > Run on Server... Selecciono el servidor que ya he creado y hago click en Finish. Me vuelve a salir el cuadro de dialogo para la versión, esta vez escribo v20120118.02 y OK.

Vuelvo a esperar (aunque menos) y...

Cambios Desplegados

Ahí esta, cambios desplegados en producción.

Paso 6

Para evitar que el servidor siga funcionando (y por tanto, me facturen), lo tengo qué parar. ¿Cómo? Pues en la pestaña Servers, lo selecciono y hago click en Stop (el botón rojo, o bien click con el botón derecho encima del servidor y Stop).

Y aquí me llevo la primera decepción, aunque tampoco es muy importante, tras 10 minutos esperando, decido entrar en la consola de aws ya que me parece extraño. Entro, selecciono AWS Elastic Bean Stalk, la aplicación y al hacer click en Events, veo que ya se ha parado... hace 10 minutos. Vaya, que el plugin se ha quedado colgado, habrá que reportarlo.

Consola AWS

Conclusiones

Básicamente, y a falta de hacer algo más complejo, puedo dividir las conclusiones en pros y contras:

Pros:

  1. Parece que el desarrollo es Java Web "estándar".
  2. El servidor de despliegue es un Tomcat (con todas sus cosas buenas y malas).
  3. El plugin para Eclipse, todo un detalle.

Contras:

  1. El proceso de alta... creo que fue más fácil darme de alta en Paypal...
  2. ¿Solo un año de prueba?¿De verdad?
  3. Los dos puntos anteriores me hacen concluir que el entorno es digamos... poco amistoso para desarrolladores aficionados, o porqué no, startups. En este sentido lleva ventaja Heroku.

El próximo paso que me gustaría dar es la prueba de fuego, a ver como se comporta para desplegar JSF 2 (que tengo atragantado en Heroku).