Tutorial: ¿Como levantar una imagen de docker con un Shiny App en EC2 de AWS?


Introducción 

Un buen Data Scientist debe saber cómo presentar la información que extrajo de un dataset determinado. Una buena presentación puede incluir varias herramientas; una de ellas, y que puede llegar a dejar bien al presentador con la audiencia, es levantar su página de resultados en una página web para explicar con libertad. En este tutorial voy a detallar el paso a paso de cómo levantar una aplicación de Shiny en un servidor de Amazon EC2. En este caso, usaremos docker también para el proceso, aunque no es la única alternativa.

Prerrequisitos

  • Tener una cuenta de AWS (registrate aquí).
    • Crear la cuenta requiere una tarjeta, pero solo efectúa un cobro de US$1 que lo regresa después de unos días.
  • Tener una cuenta en Docker Hub (registrate aquí).
  • Tener Docker o Docker Desktop instalado y corriendo el computador (descargalo aquí).
  • Tener un Shiny App programado.

Tutorial 

Crear y subir la imagen

El primer paso es crear un Dockerfile dentro de la carpeta donde están los archivos necesarios (entiéndase el ui.r, server.r, la data que se usar y otros archivos de soporte). Este Dockerfile tendrá los siguientes elementos adentro:

FROM rocker/r-base:latest

 Empezamos estableciendo los elementos del ambiente que vamos a crear en la imagen del Docker

LABEL maintainer="PERSONA1 <examplemail1@gmail.com>"

LABEL maintainer="PERSONA2 <examplemail1@gmail.com>"

Detalles de los usuarios que armaron la imagen.

RUN apt-get update && apt-get install -y --no-install-recommends \

    sudo \

    libcurl4-gnutls-dev \

    libcairo2-dev \

    libxt-dev \

    libssl-dev \

    libssh2-1-dev \

    && rm -rf /var/lib/apt/lists/*

Estos son comandos de Linux para la imagen virtual del contenedor. En la imagen vamos a instalar Linux para correr nuestra imagen y estos comandos van a configurar la imagen con lo necesario de dicho sistema operativo

RUN install.r shiny

RUN install.r plotly

RUN install.r dplyr

RUN install.r DT

Estos comandos instalan las librerías necesarias para correr nuestra imagen. Si tu imagen requiere más librerías hay que poner una línea por cada librería que se necesite. El formato es: install.r <libreria>.

RUN echo "local(options(shiny.port = 3838, shiny.host = '0.0.0.0'))" > /usr/lib/R/etc/Rprofile.site

Este comando define dónde va a correr nuestra imagen en la computadora que la albergue y en el contenedor. El puerto de salida del contenedor es el 3838, en cualquier dirección IP (0.0.0.0). Terminamos definiendo de donde se va a extraer.

RUN addgroup --system app \

    && adduser --system --ingroup app app

Definición de los usuarios que correrán en la imagen.

WORKDIR /home/app

COPY /. /home/app

Definimos la dirección donde vamos a subir todo en la imagen y después vamos a copiar todo lo que esté en la dirección donde esté el Dockerfile. en la dirección definida arriba.

RUN chown app:app -R /home/app

USER app

EXPOSE 3838

Iniciamos el usuario en el contenedor y exponemos el puerto del contenedor.

CMD ["R", "-e", "shiny::runApp('/home/app')"]

Esta línea se ejecuta en el CMD y es la creación del contenedor.

Algo así queda todo el código:


Para verificar que tu imagen fue creada correctamente, puedes correr los siguientes comandos desde el CMD. El 4000 es el puerto de conexión con tu máquina y el 3838 el del contenedor.

docker build -t NOMBRE_DE_TU_IMAGEN .

docker run -p 4000:3838 NOMBRE_DE_TU_IMAGEN

Subir la imagen a Docker Hub

Primero, verifica que el Docker Desktop tenga la sesión iniciada para poder hacer el push de forma correcta y fácil.

Cuando hayas visto eso, debes correr los siguientes comandos:

Docker tag NOMBRE_DE_TU_IMAGEN:latest     TU_USUARIO/NOMBRE_DEL_REPOSITORIO_A_CREAR:latest

Acá creamos la imagen lista para ser cargada al Docker Hub.

Docker push TU_USUARIO/NOMBRE_DEL_REPOSITORIO_A_CREAR:latest

Crear servidor EC2

Cuando ingreses a tu sesión del AWS, busca la opción de EC2. Después, en el menú dale click a Lanzar Instancia.



Le ingresas un nombre a tu elección y verifica que todo lo que aparezca sea Free tier eligible, ya que puede implicar esto en cobros con tu tarjeta. En la sección Par de Claves (inicio de sesión), debes seleccionar un par de claves. Si no tienes unas, puedes crearlas en ese rato (.pem para iOS y .ppk para Windows. DEBES GUARDAR BIEN ESE ARCHIVO). Para terminar, presiona Lanzar Instancia.

Cuando regreses al menú de todas las instancias, presiona el ID de la instancia en azul. Abajo, en Seguridad, dale click a Grupos de Seguridad en azul. Abajo, en Editar Reglas de Entrada, debes permitir todo el tráfico de entrada así:


Después de esto, guarda los cambios y regresa al menú principal.

Correr la imagen en el EC2

Selecciona el selector de tu imagen y presiona Conectar. En Conexión de la Instancia EC2 hasta abajo solo presiona conectar, y entrarás al CMD de la máquina virtual.

Cuando entres a la máquina virtual, debes correr estos comandos:

sudo yum update -y
Esto para actualizar el usuario sudo de la máquina virtual (sus paquetes).

sudo amazon-linux-extras install docker
Esto para instalar Docker en la máquina virtual.

sudo yum install docker
Solo es para verificar la correcta instalación de Docker.

sudo service docker start
Esto para inicar el servicio de Docker en la máquina virtual.

sudo docker pull TU_USUARIO/NOMBRE_DEL_REPOSITORIO_A_CREAR
Esto para descargar tu imagen en la máquina virtual.

sudo docker run -p 4000:3838 TU_USUARIO/NOMBRE_DEL_REPOSITORIO_A_CREAR
Esto para correr la imagen descargada. El puerto donde se puede acceder al contenedor (el de la máquina EC2) es el 4000, ya que, como definimos antes, el 3838 es el puerto de salida del contenedor y el puerto por defecto de shiny.

Para verificar que funcionó la imagen, busca la Dirección IPv4 Pública, haciendo click en la instancia. Pega solo ese número en la barra de búsqueda y agrega el puerto así:
:4000

¡Y listo, ya tenemos nuestro Shiny en el internet!

Comments