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

    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.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *