Lanzando una aplicación en nodejs con gulp y Elastic Beanstalk

Edgar Talledos
Tech Talent Oaxaca
Published in
4 min readDec 22, 2016

Amazon Web Services es el líder en computación en la nube y cuenta con una gran cantidad de servicios que hacen de los desarrolladores sus delicias. Esta gran gama de servicios es muy útil y cuenta con una gran documentación, pero el problema viene a la hora de querer hacer las cosas con servicios que; o bien, no conocemos en su totalidad o apenas estamos empezando a conocer, este último fue mi caso y hoy quiero compartir esa experiencia.

Empezando con Elastic Beanstalk

Se da por hecho que ya tenemos una cuenta en Amazon Web Services y aunque seamos neófitos hemos probado estos servicios.

El deploying se hará con AWS CLI y EB CLI. Haremos el proceso de instalación en Linux, pero en la documentación está detallada la instalación en diferentes Sistemas Operativos.

Instalación de AWS CLI

Tenemos que tener instalado python y pip. Abrimos una terminal y en ella tecleamos el siguiente comando:

sudo pip install awscli

Para comenzar a utilizar awscli necesitaremos crear una nueva identidad con IAM, y asociarle los permisos necesarios para así poder acceder a través de nuestra terminal. Una vez tenemos las claves guardamos la información de nuestro usuario en un directorio seguro. Abrimos nuestra terminal y ejecutamos el siguiente comando:

aws configure
AWS Access Key ID: "your_access_key_id"
AWS Secret Access Key: "your_secret_key_id"
Default region name [us-west-2]: us-west-2
Default output format [None]: json

Esto creará el archivo $HOME/.aws/credentials el cual podremos modificar en el momento que queramos siguiendo la documentación de awscli.

Instalación de EB CLI

Igual que con awscli podremos instalar eb cli a través de la terminal ejecutando el siguiente comando:

pip install --upgrade --user awsebcli 

Añadimos a nuestro $PATH la ruta: ~/.local/bin .

Verificamos que se instaló correctamente y todo funciona bien:

eb --version
EB CLI 3.8.4 (Python 3.5.2)

Podemos revisar la documentación completa aquí:

Creación de una aplicación de prueba con nodejs y gulp

Crearemos una aplicación muy simple como prueba con expressjs, gulp y bootstrap que se encuentra en el siguiente repositorio, solamente mostraré el contenido de los archivos que nos será de utilidad para el caso, pero en el repositorio se encuentra todo el proyecto.

Evitando errores al momento de hacer el deploying

Elastic Beanstalk puede ser configurado de una forma muy flexible, permitiéndole consumir solamente los recursos que requiera nuestra aplicación, para nuestro caso; ya que toda la fase de desarrollo utilizamos gulp, quizá queramos instalarlo en nuestra instancia y compilar nuestros assets directamente en el servidor, pero esto no es recomendable ya que obtendremos el siguiente error.

node-gyp requires that the 'user’\’’s' home directory is specified in either of the environmental variables HOME or 'USERPROFILE\n' at new Gyp '(/opt/elasticbeanstalk/node-install/node-v0.8.26-linux-x64/lib/node_modules/npm/node_modules/node-gyp/lib/node-gyp.js:54:11

Precompilando el código con gulp

Para evitar el error antes mencionado, vamos a crear una tarea en gulp que se encargue de limpiar y precompilar el código antes de hacer el deploying.

La tarea ya está creada, ahora nos encargaremos de eliminar las carpetas que no nos sirven antes de precompilar con la tarea clean, para así no llenar de basura nuestro código.

gulp clean && gulp precompile

Consideraciones sobre el funcionamiento de Elastic Beanstalk

Elastic Beanstalk tiene su propio control de versiones, y también cuenta con una forma de ignorar archivos que no nos sirven en producción a través del archivo .ebignore, es importante entender el funcionamiento del control de versiones que hace Elastic Beanstalk: si el archivo .ebignore no se encuentra utiliza .gitignore para ignorar archivos, pero el contenido de .gitignore va a permitir que archivos que no nos son necesarios en producción sean incluidos en nuestro deploying. He aquí un ejemplo del contenido de .ebignore vs .gitignore.

También ignoramos gulpfile.js porque ya no nos es de utilidad

Nuestro archivo .ebignore quedará como en el ejemplo anterior. Al momento de que Elastic Beanstalk comprima nuestra aplicación no incluirá los directorios que antes mencionamos y nuestro código en producción se mantendrá lo más ligero posible.

Deploying con EB CLI

Ahora que tenemos todo preparado para hacer el deploying vamos a ejecutar los siguientes comandos dentro de la carpeta de nuestro proyecto con EB CLI.

Para asegurarnos que vamos a instalar la versión correcta de nodes en Elastic Beanstalk es importante incluir el archivo .ebextensions/node_settings.config con la siguiente información.

Versión por default para nuestro entorno en Elastic Beanstalk
  • Crearemos la configuración para nuestra aplicación
eb create

y se añadirán a .gitignore las siguientes líneas

# Elastic Beanstalk files
.elasticbeanstalk/*
!.elasticbeanstalk/*.cfg.yml
!.elasticbeanstalk/*.global.yml
  • Iniciamos el deploying con instancia simple
eb deploy --single
  • Verificamos que todo ha salido bien abriendo nuestra aplicación
eb open

Conclusión

Gulp nos hace la vida más fácil a la hora de desarrollar cualquier proyecto, pero siempre hay que recordar que para producción necesitamos un código fuente ligero y comprimido, no necesariamente tenemos que incluir gulp en todo lo que hagamos (aunque es muy tentador).

Espero que el artículo haya sido de utilidad.

--

--

Edgar Talledos
Tech Talent Oaxaca

La única manera de lidiar con este mundo sin libertad, es volverte tan absolutamente libre que tu mera existencia sea un acto de rebelión