¡Despliega tu R Shiny App en AWS gratis y en 5 minutos!

¿Quieres compartir tu aplicación Shiny R? ¿Quieres evitar instalaciones en local o subirla a servidores gestionados por 3ros? Levanta tu máquina EC2 en AWS y despliga tu App gratis y en 5 minutos.

1. Preparar nuestra Shiny APP

En primer lugar prepararemos la app de Shiny. Vamos a dejar la aplicación lista y preparada para ser desplegada en AWS. Para ello recomendamos:

  • minimizar el número de librerias a instalar,
  • comenzar la app con una función del estilo LoadOrInstallRequiredPackages
  • despliega tu app en Github/GitLab

Como veremos en breve, no es totalmente necesario tener la app en un repositorio, aunque sí altamente recomendable. Explicaremos una alternativa de transferencia de ficheros a la máquina de AWS.

2. Levantar la máquina EC2 en AWS

2.1 Intro & Launch Instance

Como pincelada, comentar qe el servicio de EC2 dentro de la cloud de Amazon nos facilita instanciar máquinas virtuales con imágenes preconfiguradas.

Para ello, lo primero que debemos hacer es crearnos una cuenta en AWS, si no la tenemos ya. Amazon nos permite el acceso a un Tier Gratuito con acceso a la gama baja de diferentes servicios, sin incurrir en coste alguno. Aun así, en el registro deberemos introducir una tarjeta como requisito, pero todo lo que explicaremos a continuación no tendrá coste alguno.

Abre en una nueva pestaña https://portal.aws.amazon.com y comienza el proceso de alta.

Planes AWS

Seleccionamos el Basic Plan, ya que nos permite desplegar de manera gratuíta el tiempo equivalente a tener 1 máquina levantada al mes. Una vez hayamos completado el registro, nos llevará a un portal donde tendremos acceso a todos los productos de AWS (EC2, S3, Lambda…)

En la barra de búsqueda, buscamos el servicio EC2. Haremos click en él como se muestra a continuación.

Seleccionamos el servicio EC2

Esto nos lleva a la home de EC2, donde deberemos buscar el botón de Launch instance

Lanzamos la instancia de EC2

2.2 Configuración de la Instancia

Ahora debemos configurar la máquina que vamos a levantar. En primer lugar la AMI (Amazon Machine Image), que como comentábamos antes, es una preconfiguración de la máquina que nos permite agilizar el set up. En esta ocasión elegiremos un Ubuntu 18.04.

Ubuntu 18.04 x86

A continuación, debemos elegir las características de la máquina a desplegar, el instance type. Para poder hacer todo el proceso de manera gratuíta, elegimos la t2.micro ya que es la única que podremos levantar sin coste.

El free tier incluye una máquina t2.micro

2.3 Generar la key

El último paso para tener nuestra instancia levantada es guardarnos la private key usada para conectarnos a la instancia de manera segura. Descargaremos un arcivo con extensión .pem, que usaremos posteriormente en para conectarnos y que no debemos perder.

Creamos el key pair (o utilizamos una existente)

3. Conexión a nuestra instancia.

Hasta este punto, ya tenemos nuestra instancia lanzada y será cuestión de minutos que pase de estado inizialiting a running.

Cuando la tengamos corriendo, ya podremos conectarnos a ella. ¿Cómo? A contunuación os mostramos cómo hacerlo desde Windows.

3.1 Descargar Putty

Putty es un cliente SSH que nos permite conectarnos desde Windows a estas máquinas EC2.

https://www.putty.org/

Con esto descargamos PuttyGen (que usaremos en primer lugar para transformar la key descargada de AWS) y el propio Putty (que usaremos para conectarnos)

3.2 Transformar la clave con PuttyGen

Una vez abierto PuttyGen, lo único que debemos hacer es clikear en Load y seleccionar la clave con extensión .pem.

En cuanto al tipo de clave a generar, bastará con dejarlo en RSA. Por último, hacer click en Save private key, aceptar a no generar una passphrase y asignarle un nombre, que puede ser el mismo que le pusimos a la descargada de AWS (automáticamente asigna una extensión .ppk).

Putty Gen. Transformando la key descargada de AWS

3.3 Configurar la conexión

Cerramos PuttyGen y abrimos Putty. Iremos Conection -> SSH -> Auth y cargarmos la clave ppk que acabamos de generar. Volvemos a Session e introducimos la IP. Podemos ponerle un nombre y darle a Save.

Cargamos la private key para la autenticación
Seteamos la IP, Save & Open

Con esto, sólo queda darle a Open y login como user: ubuntu.

Got it!

4. Instalar R y Shiny Server en la máquina EC2 AWS

Una vez dentro, ejecutamos los siguientes comandos. Estamos configurando la máquina, descargando R, sus dependencias, Shiny, los paquetes necesarios y Shiny Server.

sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/'
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
sudo apt-get update
sudo apt-get install r-base 

sudo add-apt-repository ppa:marutter/c2d4u3.5
sudo apt-get update

sudo apt-get install -y gfortran libreadline6-dev libx11-dev libxt-dev libcairo2-dev libbz2-dev liblzma-dev libcurl4-openssl-dev cmake libssl-dev libxml2 libxml2-dev r-cran-httpuv

sudo su - \
-c "R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""

$ sudo apt-get install gdebi-core
$ wget https://download3.rstudio.org/ubuntu-14.04/x86_64/shiny-server-1.5.13.944-amd64.deb
$ sudo gdebi shiny-server-1.5.13.944-amd64.deb

En caso de que tu aplicación no comience checkeando los paquetes que se va a usar, en este paso utilizaremos

sudo su -c "R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""

Con esto, ya tenemos el Shiny Server escuchando en el puerto 3838. Pero aun no podremos acceder a http://ip_de_la_maquina_de_ec2:3838 ya que como último paso debemos de abrir este puerto en el firewall.

Para ello iremos nuestras instancias:

Dentro del panel de instancias, scroll lateral a la derecha

Instanctias -> Security Group -> Actions -> Edit inbound rules

Añadimos nueva regla TCP, al puerto 3838 y para todas las IPs de origen

5. Desplegar nuestra Shiny App

Cómo comentábamos, lo ideóneo sería tener nuestra aplicación en un repositorio.

Si dominamos git, símplemente debemos clonar el repo en la ruta /srv/shiny-server. También lo podemos hacer en el root y crear un link dentro de esa ruta.

Aclarar que en esa ruta debe estar la carpeta contenedora conel nombre de la app, y la propia app de Shiny, ya sea en formato app.R o server.R/ui.R

Un ejemplo sería el siguiente:

cd /srv/shiny-server
git clone https://github.com/CarlosVecina/Proyecto-Multivariate-Distribution.git

Con esto, ya tenemos nuestra app junto con la app de demo. Si entramos en http://3.133.94.92:383 llegaremos al root con todas las aplicaciones. Para acceder (y linkear/meter en un iframe…) a una app específica deberemos utilizar la url completa http://3.133.94.92:3838/Proyecto-Multivariate-Distribution

Una segunda opción menos recomendable sería usar Winscp para transferir los archivos.


En el próximo post trataremos cómo acceder a nuestra aplicación de Shiny en AWS con tu url personal, convertirlo en una conexión https, configurar los puertos…

Keep you posted en TypeThePipe

Carlos Vecina
Carlos Vecina
Senior Data Scientist at Jobandtalent

Senior Data Scientist at Jobandtalent | AI & Data Science para aportar valor en la empresa