Implementación de aplicaciones Node.js en AWS EC2 con Docker

I

Introducción

Una vez que haya escrito una aplicación web, existen docenas de ofertas para que su aplicación esté en línea y que otras personas puedan utilizarla. Una oferta bien conocida es parte de la plataforma Amazon Web Services (AWS): Nube informática elástica (EC2).

EC2 es una parte fundamental de AWS, y muchos de los otros servicios de AWS se construyen sobre él; por lo tanto, es bueno comprender qué es EC2 y cómo implementarlo.

En este tutorial, crearemos una aplicación Node.js básica con Docker, iniciaremos y configuraremos una instancia EC2 e implementaremos nuestra aplicación en ella. Al final de este tutorial, tendrá su aplicación Node ejecutándose en AWS y comprenderá mejor cómo interactuar con un servicio central de AWS.

Prerrequisitos

Cuenta de AWS

Servicios web de Amazon (AWS) es una colección de herramientas para crear aplicaciones en la nube. Como EC2 es un servicio de AWS, necesitaremos configurar una cuenta de AWS.

AWS tiene un nivel gratuito para muchas cosas increíbles, y EC2 no es una excepción: puede usar 750 horas (31 días) de EC2 al mes en el nivel gratuito durante todo un año.

Estibador

Estibador nos permite agrupar nuestras aplicaciones en unidades pequeñas y fáciles de implementar que se pueden ejecutar en cualquier lugar donde esté instalado Docker. Esto significa no más de eso ‘¡pero funciona en mi máquina!’

Este artículo asumirá una familiaridad básica con Docker y no profundizará en él; sin embargo, si desea profundizar, consulte Implementación de una aplicación Node.js en un Droplet de DigitalOcean con Docker.

Aplicación de node

Hagamos una aplicación de node realmente simple que responda a una solicitud. Para hacer esto, abriremos una terminal y ejecutaremos:

$ mkdir node-ec2
$ cd node-ec2
$ npm init

Esto creará una nueva carpeta, se moverá a esa carpeta y luego inicializará una nueva aplicación de node.

Sigamos con los valores predeterminados de NPM por ahora: este artículo asumirá que dejó el punto de entrada como index.js. Esto generará nuestro package.json archivo, que es esencialmente un archivo de configuración para nuestra aplicación.

Una vez el package.json se crea el archivo, ábralo y agregue la siguiente línea al comienzo del scripts sección:

"start": "node index.js",

Al hacer esto, en lugar de ejecutar node index.js, estaremos usando npm start, que ejecutará todo en nuestro script. En este caso específico, simplemente se ejecuta node index.js, aunque en realidad podría ser mucho más que eso. Por ejemplo, si podemos agregar banderas al comando sin tener que escribirlo cada vez, o podríamos establecer algunas variables de entorno como NODE_ENV=production node index.js.

Para atender nuestras solicitudes, usaremos el Rápido framework: es minimalista y fácil de usar:

$ npm install express --save

Nuestra package.json ahora debería verse algo como esto:

{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}

Espere la instalación, y luego vamos a abrir nuestro editor de código preferido para crear otro archivo nuevo en la misma ubicación llamado index.js.

El archivo configurará Express y definirá un controlador de solicitudes:

const express = require('express');
const app = express();
const port = 3000;

app.get('/status', (req, res) => res.send({status: "I'm alive!"}));

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

Esta aplicación se iniciará en el puerto 3000y servirá como punto final en /status. Podemos verificar que esto funciona ejecutando:

$ npm start
Example app listening on port 3000!

Encaminado a http://localhost:3000/status – deberíamos obtener una respuesta con {status: "I'm alive!"}. Una vez que tenga éxito, asegúrese de detener el servidor con CTRL + C.

Con nuestra sencilla aplicación Node lista, conviértala en una imagen de Docker que implementaremos en EC2.

Dockerizar la aplicación de node

Cree un nuevo archivo en el mismo directorio que su aplicación Node, llamado Dockerfile:

FROM node:13-alpine

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000
CMD [ "node", "index.js" ]

Este es un Dockerfile básico que se puede usar para la mayoría de las aplicaciones simples de Node. A continuación, compilemos la imagen de Docker y luego ejecútelo para verificar que funciona correctamente:

$ docker build . -t ec2-app
$ docker run -p 3000:3000 ec2-app

Si navega a http://localhost:3000/status nuevamente, debería ver la misma respuesta de estado de antes. Salga del proceso con CTRL + C nuevamente.

Finalmente, empujemos nuestra imagen de Docker a Docker Hub:

$ docker login # Use your Docker Hub credentials here
$ docker tag ec2-app <YOUR_DOCKER_USERNAME>/ec2-app
$ docker push <YOUR_DOCKER_USERNAME>/ec2-app

Configuración de EC2

Con nuestra aplicación “acoplada”, necesitamos configurar una instancia EC2 para que se ejecute.

Diríjase a AWS e inicie sesión.

Haga clic en el menú desplegable ‘Servicios’ en la parte superior de la página y busque ‘EC2’. AWS está experimentando actualmente con su interfaz, por lo que debería ver una página que se parece a la siguiente, pero el centro de la página puede verse ligeramente diferente.

Haga clic en el enlace ‘Instancias’ a la izquierda.

En la siguiente vista, haga clic en el botón ‘Iniciar instancia’. Verá una página que se ve así:

AMI

Aquí es donde seleccionamos la imagen de máquina de Amazon, o AMI para abreviar. Una AMI es un servidor “listo para usar” y puede venir con múltiples configuraciones.

Por ejemplo, podríamos seleccionar una de las AMI de inicio rápido que tienen Amazon Linux 2 en ellos, o si se desplaza hacia abajo, hay instancias con Ubuntu ejecutándose en ellos, etc.

Cada AMI es una imagen congelada de una máquina con un sistema operativo y posiblemente algún software adicional instalado.

Para facilitar las cosas, podemos usar esto para crear una instancia EC2 con Docker ya configurado para nosotros.

Para hacer esto, debemos seleccionar ‘AWS Marketplace’ a la izquierda, y luego en el cuadro de búsqueda queremos ingresar ‘ECS’. Deberíamos obtener algunos resultados, pero queremos la imagen ‘ECS Optimized Amazon Linux 2’.

Esta imagen viene con Docker y está optimizada para ejecutar contenedores. Presione ‘Seleccionar’ en la imagen elegida y continuaremos a la página siguiente:

Tipos de instancia

En la siguiente vista, seleccionamos qué tipo de instancia queremos. Generalmente, esto dicta los recursos disponibles para el servidor que estamos iniciando, con costos de escalamiento para máquinas con más rendimiento.

los t2.micro El tipo de instancia es elegible para el nivel gratuito, por lo que se recomienda usarlo:

Seleccione la casilla de verificación correspondiente y luego haga clic en “Revisar y lanzar” en la esquina inferior derecha. Haga clic en ‘Iniciar’ en el mismo lugar en la página siguiente y aparecerá una ventana emergente para seleccionar o crear un par de claves.

Seleccione el primer menú desplegable y seleccione ‘Crear un nuevo par de claves’. En ‘Nombre del par de claves’, ingrese cómo desea llamar su par de claves.

Asegúrese de ‘Descargar el par de claves’ en el lado derecho; esto es lo que usaremos para acceder a nuestra instancia EC2.

Al seleccionar ‘Iniciar instancia’ nuevamente, su instancia EC2 debería iniciarse:

Haga clic en el enlace resaltado para ir a la página de detalles de la instancia.

Grupos de seguridad

Antes de intentar ejecutar nuestra aplicación, debemos asegurarnos de que podremos acceder a la aplicación.

La mayoría de los recursos de AWS operan en ‘Grupos de seguridad’: estos grupos dictan cómo se puede acceder a los recursos, en qué puerto y desde qué direcciones IP.

Haga clic en el grupo de seguridad resaltado aquí:

Desde aquí, podrá ver detalles sobre el grupo de seguridad, incluidas sus reglas de entrada y salida en varias pestañas. En la pestaña de entrada, es de esperar que vea esto:

Lo que esto significa es que el tráfico que entra por el puerto 22, usando el protocolo TCP, está permitido desde cualquier lugar (0.0.0.0/0 es decir en cualquier lugar). Necesitamos agregar otra regla para permitir que cualquiera pueda acceder a nuestra aplicación en el puerto 3000.

En la parte superior de la página, haga clic en ‘Acciones’ y luego en ‘Editar reglas de entrada’. En el cuadro de diálogo que se abre, haga clic en “Agregar regla”.

Establezca el rango de puertos de la regla en 3000y, en Fuente, haga clic en el menú desplegable y seleccione “En cualquier lugar”. El resto debe completarse automáticamente.

En última instancia, debería terminar con algo como:

Conexión a su instancia EC2

Regrese a la página ‘Instancias’ (haga clic en el enlace de la izquierda) y seleccione la instancia que creó anteriormente. La dirección de su instancia EC2 se encuentra encima del enlace a los grupos de seguridad en el campo ‘DNS público’.

Regrese a la terminal y navegue hasta la carpeta donde se encuentra el par de claves que descargó anteriormente. Se le asignará el nombre que haya introducido para el nombre del par de claves, con un .pem como su extensión.

Cambiemos los permisos de la clave y luego SSH en la instancia EC2:

$ chmod 400 <NAME_OF_KEYPAIR_FILE>
$ ssh -i <NAME_OF_KEYPAIR_FILE>[email protected]<PUBLIC_DNS>

Desde aquí, solo necesitamos iniciar nuestra aplicación a través de Docker:

$ docker run -p 3000:3000 <YOUR_DOCKER_USERNAME>/ec2-app

Podrá acceder a la instancia utilizando la misma dirección que utilizó para SSH en la instancia. Simplemente navegue en su navegador para:

<PUBLIC_DNS>:3000/status

Su aplicación debería devolverle el extremo de estado que vimos anteriormente. ¡Felicitaciones, acaba de ejecutar su primera aplicación en EC2!

¿Qué sigue?

Ejecute su aplicación sin cabeza

Sin embargo, una ganancia rápida es ejecutar la aplicación “sin cabeza”. A partir de ahora, su aplicación se está ejecutando en su sesión de shell, y tan pronto como cierre esa sesión, ¡la aplicación terminará!

Para iniciar la aplicación de manera que se siga ejecutando en segundo plano, ejecute la aplicación con el adicional -d bandera:

$ docker run -d -p 3000:3000 <YOUR_DOCKER_USERNAME>/ec2-app

Seguridad

Es posible que desee volver atrás y reforzar la seguridad en la instancia / experimento con diferentes configuraciones, como configurarlo para que solo nosotros podamos acceder al puerto SSH, por ejemplo.

Cambie el campo ‘Fuente’ en la primera regla a ‘Mi IP’: AWS determinará automáticamente desde dónde accede.

Nota: Si está ejecutando este tutorial sobre la marcha, o vuelve a él más tarde, es posible que su computadora tenga una IP diferente a la que tenía cuando estableció inicialmente ‘Mi IP’. Si encuentra alguna dificultad más adelante, asegúrese de volver aquí y seleccionar ‘Mi IP’ nuevamente.

Otras AMI

Hay cientos de AMI diferentes, muchas de varias comunidades, con aplicaciones ya preinstaladas; vale la pena echarle un vistazo para ver si hay una manera fácil de configurar algo con lo que desea trabajar.

Agregar un dominio

Ahora que tiene una aplicación ejecutándose en un servidor, es posible que desee configurar un nombre de dominio y apuntarlo a su aplicación.

Conclusión

EC2 realmente es la columna vertebral de muchos servicios de AWS; por ejemplo, RDS (servicio de base de datos de AWS) es en realidad solo instancias EC2 muy optimizadas con un panel agradable.

Comprender este producto central del arsenal de AWS seguramente abrirá las puertas a nuevas formas de implementar ideas.

En este tutorial, creamos una aplicación Node.js simple con la ayuda de Express, la acoplamos, configuramos EC2 para la implementación y, finalmente, la implementamos en la instancia EC2.

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad