Despliega una app de Node en AWS

En este artículo se abarcará de forma práctica - teórica cómo realizar el despliegue de una aplicación de NodeJS en una instancia EC2 (Elastic Computed Cloud) de AWS independientemente de si el sistema operativo que se esté usando es Windows, o Linux.

Creación de cuenta en AWS

Cree su cuenta como usuario raíz, pero tenga en cuenta que, por buenas prácticas se aconseja crear usuarios IAM asociados a esta para respetar las buenas prácticas de AWS que sugieren reiteradamente utilizar políticas de mínimo privilegio.

Para crear su cuenta, ingrese a AWS.

Creación de instancia EC2

Una vez tenga su cuenta creada, procedemos a la creación de nuestra instancia.

Para ello, damos clic en la esquina superior izquierda donde dice “Servicios”. Este nos despliega un filtro de búsqueda a su lado en el cual podemos filtrar por “ec2”. Al ingresar, nos encontraremos con el panel de administración de dicho servicio.

Nos dirigimos al panel lateral situado a la izquierda de nuestra pantalla (es desplegable). Y clickeamos en “Instancias”.

Si no tenemos ninguna instancia creada, aparecerá un listado vacío, de tener alguna se nos mostrará de la siguiente manera.

instance list aws.jpg

De clic ahora en “Lanzar instancia”, elija un nombre adecuado (relacionado a lo que esté haciendo en lo posible), elija un sistema operativo de preferencia (en mi caso suelo optar por Ubuntu). Y aquí, se le pedirá crear una nueva clave par.

clave par 1 part.jpg

Tener en cuenta que si estás en Linux, deberá descargar el archivo .pem, mientras que si está en Windows, sugiero descargar el archivo en formato .ppk para evitar un paso de conversión.

clave par 2 part.jpg

Una vez creado nuestro clave par, podemos simplemente dar en crear instancia.

Conexión vía SSH

Recordar que, la primera vez que realizamos este proceso, debemos darle permisos a nuestro archivo clave par. Por lo que, si estás en Linux bastaría con ejecutar:

chmod 400 node_app.pem

Y nos conectamos desde consola:

ssh -i "node_app.pem" user@ec0-00-000-000-00.compute-1.amazonaws.com

Mientras que si estás en Windows, deberá realizar la siguiente secuencia:

Right click on the file > properties > security > advanced > disable inheritance > 'Convert inherited permissions into explicit permission on this object'
Click on "allow | everyone | Full Control" > edit > 'select a principal' > type your username > 'check names' > select your username > ok > ok > ok (ok until all windows are closed)

Este 400, o su equivalente en Windows, corresponde a permisos para:

      4 = Propietarios
      0 = Grupos de usuarios
      0 = Resto de usuarios

Posteriormente nos conectamos utilizando el software PUTTY.

Agregue su IP Host. Este es su IPv4 público de su instancia de AWS.

host ip aws putty.jpg

Agregue su usuario a la configuración.

user putty aws.jpg

Por último, cargue su archivo .ppk private key putty.jpg

Y dé click en Open, esto le conectará a su instancia via SSH.

Si aparece un mensaje de error, simplemente de click en aceptar.

Se encontará con una consola como la siguiente:

conexion ssh putty.jpg

La magia de bash

En este punto, habremos logrado una conexión exitosa. Por lo que podemos comenzar con nuestros scripts de bash para automatizar la tarea.

El siguiente script hará lo siguiente:

  • Verificar si su sistema de AWS es Debian o Ubuntu.
  • Instalará Docker y docker-compose según la verificación anterior.
  • Descargará el repositorio de github para éste ejemplo.
  • Se moverá dentro del repositorio, buildeará y pondrá en marcha los contenedores.

Nota: Mi aporte al script solo es la descarga del repositorio e instalación de los contenedores. En la sección de agradecimientos verán a quién se lo robé.

#!/bin/bash
sudo apt-get update
sudo apt-get install -y \
    linux-image-extra-$(uname -r) \
    linux-image-extra-virtual
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
if [  -n "$(uname -a | grep Ubuntu)" ]; then
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
else
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
fi
sudo apt-get update
sudo apt-get install -y docker-ce
sudo groupadd docker
sudo usermod -aG docker $USER

# Logout and In again
docker --version
docker run hello-world
# Install Docker Compose on Ubuntu
DC_VERSION=$(curl -L -s -H 'Accept: application/json' https://github.com/docker/compose/releases/latest | sed -e 's/.*"tag_name":"\([^"]*\)".*/\1/')
sudo curl -L "https://github.com/docker/compose/releases/download/$DC_VERSION/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

# Download repository, build and run containers
git clone https://github.com/brahianpdev/tryhard-devops

cd tryhard-devops

docker-compose build --no-cache
docker-compose up -d

docker ps

echo "Finish!"

Copie el script anterior en un portapapeles, o téngalo a mano. Desde su consola de AWS, cree un archivo con el nombre que desee y dele permisos de ejecución.

touch automation.sh
chmod +x automation.sh

Luego, abra dicho archivo en nano:

nano automation.sh

Pegue el script, guarde y salga del editor.

nano script bash.jpg Por último, ejecute el script:

./automation.sh

En algún momento de este proceso, se le pedirá que presione la tecla ENTER. Una vez finalizado, escribimos exit para desconectarnos de SSH.

Grupos de seguridad Nota al margen, es que, dado que nuestra aplicación de Node está corriendo en el puerto 3000, debemos habilitar dicho puerto en los grupos de seguridad de nuestra instancia.

Para ello, nos vamos a Instancias > Seguridad > Grupos de seguridad.

sg rules.jpg

Por último, debemos comprobar el deploy de nuestra aplicación de Node en AWS.

Para hacerlo, seleccionamos nuestra instancia, y copiamos la Dirección IPv4 pública, a la cual le agregaremos después de dos puntos : el puerto 3000 de nuestra aplicación de Node, de la siguiente manera:

00.000.000.00:3000

Si puedes apreciar el mensaje que responde tu aplicación de Node, el deploy se ha realizado de forma exitosa.

success.jpg

Agradecimientos

Un especial agradecimiento a Rosana Suárez alias Roxross, DevSecops en Naranja X, quien dictó el bootcamp gratuito de DevOps abarcando fuertes pilares de forma práctica.

¡Hasta pronto 👋!

Si deseas colaborar con el contenido, regalame un cafecito