¿Cómo configurar comprobaciones de estado de ELB con múltiples aplicaciones ejecutándose en cada instancia de EC2?

11

En AWS nos gustaría usar ELB para equilibrar la carga de instancias EC2 que alojan múltiples aplicaciones. Idealmente, nos gustaría tener un chequeo de salud para la aplicación.

Sin embargo, AWS Elastic Load Balancers actualmente solo le permite hacer ping a una ubicación para una comprobación de estado.

¿Cuál sería la mejor manera de implementar una comprobación de estado con ELB que tenga en cuenta el estado de múltiples aplicaciones implementadas en cada instancia de EC2?

Andrei Fierbinteanu
fuente
44
Una forma sería implementar su propia comprobación de estado haciendo que un script devuelva un estado basado en sus comprobaciones de ambas aplicaciones.
Nathan C
1
ELB es un servicio gestionado. Cree otro ELB para la segunda aplicación con su propio control de estado. La mayor parte del costo es por solicitud, por lo tanto, le costará casi lo mismo operar 2 ELB.
Guy
Creo que la respuesta de @ NathanC es la mejor solución; Tengo un caso similar en el que si falla alguna de las dos condiciones, la comprobación de estado debería fallar. Agregar otro ELB le permitirá tener otro control de salud, pero AFAIK solo se puede usar un ELB para enrutar el tráfico (o no)
Tom Harrison Jr
@Guy en realidad, dado que las horas ELB se cobran independientemente de las solicitudes, eso es ~ 20 USD al mes (según la región), por lo que la mayor parte del costo es por solicitud solo si ya proporciona más de 2.5 TB de datos por mes ( a $ 0.008 / GB)
Josip Rodin

Respuestas:

10

Aquí hay dos formas de resolver esto;

La primera opción es agregar otra comprobación de estado en el host que valida el estado y devuelve HTTP 200s al ELB si la lógica dice que desea mantener el host en línea. La lógica que hay, por supuesto, depende de usted. La desventaja aquí sería que si la aplicación 2 se implementara con éxito en algunos hosts, todos los hosts seguirían siendo "saludables" y recibirían tráfico.

Otra opción es usar un ELB adicional para cada aplicación. Puede apuntar varios ELB a las mismas instancias EC2 de back-end y el costo es bastante menor para hacerlo. De esa manera, puede verificar el estado por aplicación y eliminar hosts con problemas a nivel de aplicación en lugar de un enfoque de todo o nada.

Editar: Tenga en cuenta que esta es una respuesta anterior y es específica para ELB, no para ALB. ALB admite objetivos separados en un host de forma nativa.

Nathan V
fuente
7

Usar un ELB por aplicación es el camino a seguir aquí.

Primero, puede necesitarlos de todos modos si cada aplicación está en su propio dominio y necesita admitir SSL. Actualmente, los ELB de Amazon solo permiten un certificado SSL para cada dominio, lo que requiere ELB por separado para cada dominio habilitado para SSL. (Las certificaciones SSL comodín son una excepción).

El desafío aquí es que las comprobaciones de estado de ELB no se pueden dirigir actualmente a un dominio virtual particular alojado en una instancia EC2. (No se envía el encabezado "Host:"). Los pings de estado de ELB siempre van al dominio predeterminado, como si hubiera cargado la dirección IP para la instancia EC2 en su navegador. Por lo tanto, se requiere un poco de pegamento para recibir las comprobaciones de estado en el dominio predeterminado y luego responder con el estado de estado de una aplicación en particular.

Aquí hay un ejemplo de configuración de trabajo que podría agregarse a una serverdirectiva Nginx . Se instalaría en cada una de las instancias EC2 con carga equilibrada.

    # This goes in the `server` block noted by 'default_server', often /etc/nginx/sites-enabled/default

    # All AWS Health Checks from the ELBs arrive at the default server.
    # Forward these requests on the appropriate configuration on this host.
    location /health-check/ {
      rewrite ^/health-check/(?<domain>[a-zA-Z0-9\.]+) /api/v1/status break;
      # Lie about incoming protocol, to avoid the backend issuing a 301 redirect from insecure->secure,
      #  which would not be considered successful.
      proxy_set_header X-Forwarded-Proto 'https';
      proxy_set_header "Host" $domain;
      proxy_pass http://127.0.0.1;
    }

En la configuración "Comprobación de estado" del ELB para "first-application.com", debe seleccionar "HTTP" y el Puerto 80 e ingresar una ruta como:

/health-check/first-application.com

Con la configuración de Nginx anterior ejecutándose en el host, la solicitud se recibiría en el dominio predeterminado y representaría la respuesta de la configuración de Nginx en el mismo host para https://first-application.com/api/v1/status

Con este enfoque, no hay configuración por aplicación en Nginx. Siempre que cada aplicación tenga un nombre de dominio único, solo debe asegurarse de configurar un ELB para cada aplicación de manera adecuada.

Mark Stosberg
fuente
3
gracias. Sin embargo, esto pareció hacer el truco. Esperaba evitar tener que tener múltiples equilibrios de carga con esto.
tourdownunder
6

El 11 de agosto de 2016, Amazon presentó Balanceadores de carga de aplicaciones . Estos le permiten especificar múltiples grupos objetivo, cada uno con su propio tipo de comprobación de estado. ¡Esto ahora es posible usando un solo balanceador de carga!

Thomas
fuente