Como configurar as verificações de integridade do ELB com vários aplicativos em execução em cada instância do EC2?

11

Na AWS, gostaríamos de usar ELBs para equilibrar as instâncias do EC2 que hospedam vários aplicativos. Idealmente, gostaríamos de ter uma verificação de saúde para aplicação.

No entanto, atualmente, o AWS Elastic Load Balancers permite executar ping apenas em um local para uma verificação de integridade.

Qual seria a melhor maneira de implementar uma verificação de integridade com o ELB que leve em consideração o estado de vários aplicativos implantados em cada instância do EC2?

Andrei Fierbinteanu
fonte
4
Uma maneira seria implementar sua própria verificação de integridade, fazendo um script retornar um status com base nas verificações de ambos os aplicativos.
Nathan C
1
ELB é um serviço gerenciado. Crie outro ELB para o segundo aplicativo com sua própria verificação de saúde. A maior parte do custo é por solicitação e, portanto, custará quase o mesmo para operar 2 ELBs.
Guy
Acho que a resposta do @ NathanC é a melhor solução; Tenho um caso semelhante em que, se uma das duas condições falhar, a verificação de integridade deve falhar. Adicionando outra ELB vai permitir que você tenha um outro exame de saúde, mas AFAIK apenas um ELB pode ser usado para rotear o tráfego (ou não)
Tom Harrison Jr
@Guy, na verdade, considerando que as horas ELB são cobradas independentemente de solicitações, isso significa ~ 20 USD por mês (dependendo da região), portanto, a maior parte do custo é por solicitação apenas se você já fornecer mais de 2,5 TB de dados por mês ( por $ 0,008 / GB)
Josip Rodin

Respostas:

10

Aqui estão duas maneiras de resolver isso;

A primeira opção é adicionar outra verificação de saúde no host que valide a saúde e retorne HTTP 200s para o ELB se a lógica indicar que você deseja manter o host online. A lógica que depende, é claro, de você. A desvantagem aqui seria que, se o App 2 fosse implantado com êxito em alguns hosts, todos os hosts ainda ficariam "íntegros" e receberiam tráfego.

Outra opção é usar um ELB adicional para cada aplicativo. Você pode apontar vários ELBs para as mesmas instâncias de back-end do EC2 e o custo é bem pequeno para isso. Dessa forma, você pode verificar a integridade por aplicativo e eliminar hosts com problemas no nível por aplicativo, em vez de uma abordagem do tipo tudo ou nada.

Edit: Observe que esta é uma resposta mais antiga e é específica para ELB e não para ALB. O ALB suporta destinos separados em um host nativamente.

Nathan V
fonte
7

Usar um ELB por aplicativo é o caminho a seguir aqui.

Primeiro, você pode precisar deles de qualquer maneira, se cada aplicativo estiver em seu próprio domínio e precisar oferecer suporte a SSL. Atualmente, os Amazon ELBs permitem apenas um certificado SSL para cada domínio, exigindo ELBs separados para cada domínio ativado para SSL. (Certificações SSL curinga sendo uma exceção).

O desafio aqui é que atualmente as verificações de integridade do ELB não podem ser direcionadas para um domínio virtual específico hospedado em uma instância do EC2. (Nenhum cabeçalho "Host:" é enviado). Os pings de integridade do ELB sempre vão para o domínio padrão, como se você tivesse carregado o endereço IP da instância do EC2 no seu navegador. Portanto, é necessária alguma cola para receber as verificações de integridade no domínio padrão e, em seguida, responder com o status de integridade de um aplicativo específico.

Aqui está um exemplo de configuração de trabalho que pode ser adicionado a uma serverdiretiva Nginx . Ele seria instalado em cada uma das instâncias do EC2 com balanceamento de carga.

    # 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;
    }

Na configuração "Verificação de integridade" do ELB para "first-application.com", você selecionaria "HTTP" e a porta 80 e insira um caminho como:

/health-check/first-application.com

Com a configuração do Nginx acima em execução no host, a solicitação seria recebida no domínio padrão e forneceria proxy da resposta da configuração do Nginx no mesmo host para https://first-application.com/api/v1/status

Com essa abordagem, não há configuração por aplicativo no Nginx. Desde que cada aplicativo tenha um nome de domínio exclusivo, você precisa apenas configurar um ELB para cada aplicativo adequadamente.

Mark Stosberg
fonte
3
obrigado. Isso parecia fazer o truque embora. Eu esperava evitar a necessidade de ter vários balanços de carga com isso.
usar o seguinte comando
6

Em 11 de agosto de 2016, a Amazon lançou os Application Load Balancers . Isso permite que você especifique vários grupos de destino, cada um com seu próprio tipo de verificação de saúde. Agora isso é possível usando um único balanceador de carga!

Thomas
fonte