es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo configuro una aplicación NodeJS de Elastic Beanstalk con un balanceador de carga clásico para usar HTTPS?

Tengo una aplicación de Elastic Beanstalk que se está ejecutando con un Balanceador de Carga Clásico. El Balanceador de Carga está utilizando un certificado SSL de ACM. La aplicación NodeJS está ejecutando un servidor HTTP en el puerto 8080, que cuando se accede, redirige al servidor HTTPS que se está ejecutando en el puerto 3000. Sin embargo, esto no parece funcionar. Ninguno de los servidores cargará nada. Actualmente, mi balanceador de carga está escuchando en el puerto 80 y enviando al puerto de instancia 80, y escuchando en el puerto 443 y enviando al puerto de instancia 443 con el certificado SSL de ACM. ¿Cómo debo configurar mi aplicación EB, el balanceador de carga y la aplicación nodeJS para que funcione?


EDIT: Como es por defecto para las aplicaciones de Elastic Beanstalk, también hay una instancia de nginx en ejecución. Mis disculpas por no mencionarlo.

Según el consejo de @kgiannakakis, mi aplicación nodeJS ahora es la siguiente:

var express = require('express');
var path = require('path');
var routes = require("./routes");

const port = process.env.PORT || 8080;

var app = express();

app.set('views', <strong>dirname + '/views');
app.set('view engine', 'pug');
app.set('port',port)
app.use(express.static(path.join(</strong>dirname, 'public')));
app.enable('trust proxy')
app.use((req, res, next) => {
    req.secure ? next() : res.redirect('https://' + req.headers.host + req.url)
})

function init() {
    app.get('/', routes.index);

<pre><code>app.get("/ping", function(req, res){
    res.send("Ok");
    res.end();
});

app.listen(app.get('port'), () => {
    console.log("App running on port %s.",app.get('port'));
});
</code></pre>

}

init();

Las solicitudes HTTP funcionan bien, sin embargo, HTTPS no funciona.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para que tu configuración funcione, debes modificar la configuración de Elastic Beanstalk, Load Balancer y la aplicación NodeJS. Aquí tienes los pasos que debes seguir:

    1. Modificar el entorno de Elastic Beanstalk:

      Para hacer que tu aplicación funcione con HTTPS, debes configurar HTTPS a nivel del entorno de Elastic Beanstalk. Sigue estos pasos:

      a. En la Consola de administración de AWS, navega hasta tu entorno de Elastic Beanstalk.

      b. Haz clic en la sección de Configuración en el menú lateral izquierdo.

      c. Haz clic en la tarjeta de Load Balancer.

      d. Haz clic en el botón de Modificar.

      e. Habilita la opción de Secure listener para el Load Balancer.

      f. Haz clic en el botón de Agregar regla.

      g. Configura la regla de la siguiente manera:

      • Protocolo: HTTPS
      • Puerto del Load Balancer: 443
      • Puerto de la instancia: 3000 (el puerto en el que tu aplicación NodeJS está escuchando para las solicitudes de HTTPS)
      • Certificado SSL: ACM (selecciona el certificado SSL adecuado que hayas configurado)

      h. Guarda los cambios y espera a que Elastic Beanstalk implemente tu aplicación con la nueva configuración.

    2. Modificar tu aplicación NodeJS:

      Para hacer que tu aplicación NodeJS funcione con HTTPS, debes modificar la forma en que maneja las solicitudes HTTP y HTTPS. Aquí te explicamos cómo hacerlo:

      a. Actualiza tu aplicación NodeJS para que escuche en el puerto 3000 tanto para las solicitudes HTTP como HTTPS.

      b. Actualiza tu aplicación NodeJS para redirigir las solicitudes HTTP a HTTPS.

      c. Aquí tienes un ejemplo de código de aplicación NodeJS que realiza esto:

    var express = require('express');
    var path = require('path');
    var routes = require("./routes");
    var http = require('http');
    var https = require('https');
    var fs = require('fs');
    
    const httpPort = process.env.PORT || 8080;
    const httpsPort = 3000;
    
    var app = express();
    
    app.set('views', __dirname + '/views');
    app.set('view engine', 'pug');
    app.use(express.static(path.join(__dirname, 'public')));
    app.enable('trust proxy');
    app.use((req, res, next) => {
      if (req.secure) {
        // la solicitud fue a través de HTTPS, así que no se requiere un manejo especial
        next();
      } else {
        // la solicitud fue a través de HTTP, así que redireccione a HTTPS
        res.redirect('https://' + req.headers.host + req.url);
      }
    });
    
    app.get('/', routes.index);
    
    app.get("/ping", function(req, res){
        res.send("Ok");
        res.end();
    });
    
    // Servidor HTTP
    var httpServer = http.createServer(app);
    httpServer.listen(httpPort, () => {
      console.log("Servidor HTTP ejecutándose en el puerto " + httpPort);
    });
    
    // Servidor HTTPS
    var privateKey = fs.readFileSync('/ruta/a/la/clave/privada');
    var certificate = fs.readFileSync('/ruta/a/tu/certificado');
    var ca = fs.readFileSync('/ruta/al/CA/bundle');
    var httpsServer = https.createServer({
      key: privateKey,
      cert: certificate,
      ca: ca
    }, app);
    httpsServer.listen(httpsPort, () => {
      console.log("Servidor HTTPS ejecutándose en el puerto " + httpsPort);
    });
    

    d. Guarda el código actualizado de la aplicación NodeJS en el paquete de implementación de Elastic Beanstalk (archivo zip).

    1. Modificar el Load Balancer:

      Para hacer que el Load Balancer funcione con los servidores HTTP y HTTPS de tu aplicación NodeJS, debes modificar los listeners y puertos del Load Balancer de la siguiente manera:

      a. En la Consola de administración de AWS, navega hasta tu Load Balancer.

      b. Haz clic en la pestaña de Listeners.

      c. Modifica el listener HTTP de la siguiente manera:

      • Protocolo: HTTP
      • Puerto del Load Balancer: 80
      • Puerto de la instancia: 8080 (el puerto en el que tu aplicación NodeJS está escuchando para las solicitudes HTTP)

      d. Modifica el listener HTTPS de la siguiente manera:

      • Protocolo: HTTPS
      • Puerto del Load Balancer: 443
      • Puerto de la instancia: 3000 (el puerto en el que tu aplicación NodeJS está escuchando para las solicitudes HTTPS)
      • Certificado SSL: ACM (selecciona el certificado SSL adecuado que hayas configurado)

      e. Guarda los cambios y espera a que el Load Balancer actualice su configuración.

    ¡Eso es todo! Una vez que hayas realizado estas modificaciones, tu aplicación de Elastic Beanstalk, Load Balancer y la aplicación NodeJS deberían estar configurados correctamente para funcionar con solicitudes HTTPS.

Comments are closed.