En este post veremos cómo instalar y poner en funcionamiento un Shiny Server en una instancia EC2 de AWS. Este es un primer paso para lograr subir a producción una Shiny app.
Acceder a la consola
Lo primero que tienes que hacer es crear una cuenta en AWS. Los pasos no son difícles, te lo puedo asegurar. Así que iniciamos en la pantalla principal que nos muestra inmediatamente luego de creada.

Posiblemente las únicas diferencias que podrían tener con esta imágen son: el nombre de usuario cchiquitov
y la Availability Zone (AZ) que automáticamente se creó en Ohio, useast-2
.
Crear servidor en EC2 (Elastic Compute Cloud)
En el campo Search podemos buscar EC2, o aprovechamos que nos aparece la opción en “Recently visited”
Es claro que acabo de crear la cuenta porque en los Recursos solamente tenemos un Security group.

Ingresamos a Instances:

y Launch Instances

Te encontrarás en la siguiente pantalla, a ti te aparecerán las opciones expandidas:

Aquí ya nombré a mi instancia “My first Web Server
”, muy astuto.
Para la AMI (Amazon Machine Image) elijo Ubuntu:

Para el tipo de instancia voy con la que me da el Free Tier:

Contiene una CPU con sólo 1 núcleo, sólo 1 GB de RAM y una conexión a Internet aceptable.
Ahora para lograr una conexión segura debemos crear un key pair
.

Un key pair
, formado por una llave pública y una llave privada, es un conjunto de credenciales de seguridad que utiliza para demostrar tu identidad al conectarse a una instancia de Amazon EC2. En el caso de las instancias de Linux, la llave privada te permite conectarse a tu instancia mediante SSH de forma segura. En el caso de las instancias de Windows, la llave privada se requiere para descifrar la contraseña de administrador, que luego se utiliza para conectarse a la instancia. Amazon EC2 almacena la llave pública en tu instancia, y tu almacenas la llave privada.

Es muy importante que guardes tu llave privada en un lugar seguro, ya que cualquiera que posea tu llave privada puede conectarse a tus instancias que utilizan el key pair
.
Entonces, creo mi key pair, para poder seleccionarlo dentro de la lista desplegable, le llamaré “mi-key-pair-useast2
”

Cuando lo creas, inmediatamente descargas un archivo, la llave privada, que para mi caso es:

Continuamos con la configuración de las redes, donde realmente dejamos lo que viene por defecto.

Para el almacenamiento podríamos cambiar hasta 30Gb sin que debamos pagar (en el primer año) pero lo dejaré por defecto.

Finalmente tenemos una instancia así:

y le damos en “Launch instance”.
Esperamos pocos minutos mientras surte el proceso:

Aparecerá:

Nos devolvemos a Instances para ver qué tenemos ahora:

Parece que no tuvieramos instancia alguna creada, pero en realidad debemos dar click en

para actualizar el dashboard.
Ahora sí tenemos nuestra instancia llamada “My first Web Server
” creada y corriendo.

Acceder al servidor
Debemos cambiar nuestro directorio de trabajo (working directory) hacia donde tenemos el archivo .pem
, yo lo he dejado en Downloads
. Así que en la Terminal:
cd Downloads/
-rw-rw-r-- 1 cchvcpcj cchvcpcj 1678 Jan 22 13:33 mi-key-pair-useast2.pem
Y vamos a cambiar los permisos de este archivo, siendo una llave privada pues debería ser privada realmente:
chmod 400 mi-key-pair-useast2.pem
-r-------- 1 cchvcpcj cchvcpcj 1678 Jan 22 13:33 mi-key-pair-useast2.pem
Ahora debes ir a la consola de EC2 para revisar la IPv4 de tu instancia, con esto completaremos el siguiente comando para acceder al servidor.

ssh -i "mi-key-pair-useast2.pem" ubuntu@ec2-18-117-232-180.us-east-2.compute.amazonaws.com
The authenticity of host 'ec2-18-117-232-180.us-east-2.compute.amazonaws.com (18.117.232.180)' can't be established.
ECDSA key fingerprint is SHA256:N55CqCIT1Yyi5tpAY2UDj2Q/1r4aOS4+aTUgXTWfDK8.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Di “yes
” y lo lograste. Estas dentro de tu instancia.
Warning: Permanently added 'ec2-18-117-232-180.us-east-2.compute.amazonaws.com,18.117.232.180' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-1021-aws x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/pro
System information as of Wed Jan 22 19:38:46 UTC 2025
System load: 0.0 Processes: 106
Usage of /: 24.9% of 6.71GB Users logged in: 0
Memory usage: 20% IPv4 address for enX0: 172.31.5.157
Swap usage: 0%
* Ubuntu Pro delivers the most comprehensive open source security and
compliance features.
https://ubuntu.com/aws/pro
Expanded Security Maintenance for Applications is not enabled.
0 updates can be applied immediately.
Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status
The list of available updates is more than a week old.
To check for new updates run: sudo apt update
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
Para desconectar puedes usar “exit
”.
Instalar R
Recuerda que aquí hemos creado la instancia de Ubuntu, por lo que de ahora en adelante aplican comandos para este sistema operativo.
Ahora, antes de R debemos instalar algunas dependencias:
# Update commands
sudo apt update
sudo apt-get update -y
sudo apt-get dist-upgrade -y
# Install some system libraries
$ sudo apt-get -y install \
\
nginx \
gdebi-core \
apache2-utils \
pandoc \
libssl-dev \
libcurl4-gnutls-dev \
libcairo2-dev \
libgsl0-dev \
libgdal-dev \
libgeos-dev \
libproj-dev \
libxml2-dev \
libxt-dev \
libv8-dev \
libhdf5-dev git
Puedes obtener una explicación de qué hace cada expresión:
Ahora sí vamos con los comandos para R:
# Update indices
sudo apt update -qq
# Install two helper packages
sudo apt install --no-install-recommends software-properties-common dirmngr
# Add the signing key (by Michael Rutter) for these repositories
# To verify key, run gpg --show-keys /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
# Fingerprint: 298A3A825C0D65DFD57CBB651716619E084DAB9
wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc
# Add the R 4.0 repo from CRAN -- adjust 'focal' to 'groovy' or 'bionic' as needed
sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/"
# Install recommended packages
sudo apt install r-base r-base-dev
Revisamos la versión instalada con:
R --version
Y deberías obtener algo parecido a esto (es muy probable que exista una versión superior para cuando leas esto).
R version 4.4.2 (2024-10-31) -- "Pile of Leaves"
Copyright (C) 2024 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under the terms of the
GNU General Public License versions 2 or 3.
For more information about these matters see
https://www.gnu.org/licenses/.
Instalar Shiny Server
Después de instalar R, pero antes de instalar Shiny Server, debes instalar Shiny. Puedes hacerlo de dos formas:
La primera es ejecutando R para abrirlo directamente en la terminal.
sudo R
> install.packages("shiny")
La otra es “por debajo”:
sudo su - -c "R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""
La instalación de Shiny puede tomar un poco de tiempo en la instancia t2.micro por la cantidad de recursos que establecimos.
Ya podemos instalar Shiny Server:
# Install Shiny Server
sudo apt-get install gdebi-core
wget https://download3.rstudio.org/ubuntu-18.04/x86_64/shiny-server-1.5.22.1017-amd64.deb
sudo gdebi shiny-server-1.5.22.1017-amd64.deb
Verificamos la instalación:
sudo systemctl status shiny-server

Por defecto Shiny Server viene con una Shiny app ejecutandose en tu servidor.
Acceder a la Shiny app por defecto
Cada vez que reinicias la instancia, a no ser que hayas pasado por una Elastic IP, tu IPv4 va a cambiar. Por ahora realizamos de nuevo el ejercicio de arriba para obtener la IP actual.
Para este momento es:

y para acceder a la app debemos ingresar <IP:3838>
. Este puerto 3838
corresponde al servicio de Shiny Server. Para mi caso es “3.145.162.7:3838
”.
Ojo, si ingresas “https://3.145.162.7:3838
” no te va a funcionar. Aquí hay dos problemas por resolver. Uno de ellos es el https
, no hemos hecho nada aún. El otro es que debemos habilitar la conexión con un security group:
Seleccionamos nuestra instancia, vamos a la pestaña Security, y finalmente al link de Security groups:

Y editamos (Edit inbound rules):

Añadimos regla:

Type = Custom TCP
Port range = 3838
Source = Custom 0.0.0.0/0

Guardamos regla:

Si ves un mensaje emergente como el siguiente, estas listo para ingresar de nuevo <IP:3838>

Lo que estábamos esperando:

Hasta aquí hemos hecho lo básico para acceder a una Shiny app desde cualquier dispositivo.
Puedes intentarlo desde tu celular, pues acabamos de dejar expuesto el puerto 3838
donde se encuentra nuestro servicio de Shiny Server en una instancia de AWS que hemos decidido dejar con acceso abierto.
No olvides detener tu instancia. Los recursos que te da AWS son gratuitos, pero tienen un límite de uso. Revisa las condiciones del Free Tier.
En un próximo post te enseño cómo cambiar la app que viene por defecto en shiny Server.
Cómo citar
@online{chiquito_valencia2025,
author = {Chiquito Valencia, Cristian},
title = {Crear {Shiny} {Server} En {AWS}},
date = {2025-01-28},
url = {https://cchiquitovalencia.github.io/posts/2025-01-27-start_EC2_instance/},
langid = {en}
}