各EC2インスタンスで実行されている複数のアプリケーションでELBヘルスチェックを設定する方法は?


11

AWSでは、ELBを使用して、複数のアプリケーションをホストするEC2インスタンスの負荷を分散させたいと考えています。理想的には、アプリケーションのヘルスチェックが必要です。

ただし、AWS Elastic Load Balancerでは現在、ヘルスチェックのために1つの場所のみにpingを実行できます。

各EC2インスタンスにデプロイされた複数のアプリケーションの状態を考慮したELBでヘルスチェックを実装する最良の方法は何でしょうか?


4
1つの方法は、両方のアプリケーションのチェックに基づいてスクリプトがステータスを返すようにすることで、独自のヘルスチェックを実装することです。
ネイサンC 14

1
ELBはマネージドサービスです。独自のヘルスチェックを使用して、2番目のアプリケーション用に別のELBを作成します。コストの大部分はリクエストごとであるため、2つのELBを操作するのとほぼ同じコストがかかります。
ガイ14年

@NathanCの答えが最良の解決策だと思います。2つの条件のいずれかが失敗した場合、ヘルスチェックが失敗するという同様のケースがあります。別のELBを追加すると、別のヘルスチェックが可能になりますが、トラフィックのルーティングに使用できるELBは1つだけです(またはそうでない)
Tom Harrison Jr 14

実際、@ Guyでは、リクエストに関係なくELB時間が請求されるため、1か月あたり約20米ドル(地域によって異なります)なので、1か月あたり2.5 TBを超えるデータを既に提供している場合にのみ、ほとんどのコストがリクエストごとになります( $ 0.008 / GB)
ジョシップ・ロダン

回答:


10

これを解決する2つの方法があります。

最初のオプションは、ホストにオンラインを維持することをロジックが指示している場合、ヘルスを検証し、HTTP 200をELBに返す別のヘルスチェックをホストに追加することです。もちろん、そこにあるロジックはあなた次第です。ここでの欠点は、App 2が一部のホストに正常に展開された場合、すべてのホストが依然として「正常」であり、トラフィックを受信して​​いることです。

別のオプションは、アプリケーションごとに追加のELBを使用することです。複数のELBを同じバックエンドEC2インスタンスに向けることができ、そのためのコストはごくわずかです。これにより、アプリケーションごとにヘルスチェックを行い、オールオアナッシングアプローチではなく、アプリケーションごとのレベルで問題のあるホストを削除できます。

編集:これは古い回答であり、ALBではなくELBに固有のものであることに注意してください。ALBは、1つのホスト上の個別のターゲットをネイティブにサポートします。


7

ここでは、アプリごとに1つのELBを使用する方法を説明します。

まず、各アプリケーションが独自のドメイン上にあり、SSLをサポートする必要がある場合、とにかくそれらが必要になる場合があります。Amazon ELBでは現在、ドメインごとに1つのSSL証明書のみが許可されており、SSL対応ドメインごとに個別のELBが必要です。(ワイルドカードSSL証明書は例外です)。

ここでの課題は、ELBヘルスチェックが現在EC2インスタンスでホストされている特定の仮想ドメインに向けられないことです。(「Host:」ヘッダーは送信されません)。ELBヘルスpingは、ブラウザにEC2インスタンスのIPアドレスをロードしたかのように、常にデフォルトドメインに送信されます。そのため、デフォルトドメインでヘルスチェックを受信し、特定のアプリケーションのヘルスステータスを返信するには、何らかの接着剤が必要です。

Nginx serverディレクティブに追加できる実用的な設定例を次に示します。負荷分散される各EC2インスタンスにインストールされます。

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

「first-application.com」のELBの「ヘルスチェック」設定で、「HTTP」とポート80を選択し、次のようなパスを入力します。

/health-check/first-application.com

上記のNginx構成がホストで実行されている場合、要求はデフォルトドメインで受信され、https: //first-application.com/api/v1/statusの同じホスト上のNginx構成からの応答をプロキシします。

このアプローチでは、Nginxにアプリごとの構成はありません。各アプリに一意のドメイン名がある限り、アプリごとに適切にELBを設定する必要があります。


3
ありがとうございました。しかし、これはトリックを行うようでした。これにより、複数の負荷分散が必要になるのを避けたいと思っていました。
ツアーダウン

6

2016年8月11日に、AmazonはApplication Load Balancerを導入しました。これらを使用すると、複数のターゲットグループを指定でき、それぞれに独自の種類のヘルスチェックがあります。したがって、これは単一のロードバランサーを使用して可能になりました!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.