ロードバランサのバックエンドにあるCompute Engine上のWebアプリケーションにアクセスすると "no healthy upstream" が表示される

記事タイトルとURLをコピーする

G-gen の佐々木です。当記事ではロードバランサを経由して Compute Engine 上の Web アプリケーションにアクセスしたときに "no healthy upstream" が表示されてしまうときの原因と対処方法を記載します。

事象

以下の図に示すように、当記事では仮の構成としてロードバランサのバックエンドに Compute Engine を配置し、インスタンスに Web アプリケーションをホストしています。
クライアントからロードバランサには HTTPS でアクセス(HTTP でも可)し、バックエンドの Compute Engine には HTTP 通信が行われます。

当記事で想定する構成

ブラウザからロードバランサ経由でWebアプリケーションにアクセスすると、以下のように "no healthy upstream" とだけ表示されてしまいます。

no healthy upstream が表示されてしまう

原因と対処方法

"no healthy upstream" は、ロードバランサがトラフィックを送信することができる正常なバックエンドが存在していないことを示します。
実際にコンソールからロードバランサのバックエンドの状態を確認すると、インスタンスがロードバランサのヘルスチェックに失敗していることがわかります。
バックエンドのインスタンスは何らかの設定不備により、ヘルスチェックに設定されたプロトコルでトラフィックを受信できる状態でないと考えられます。

バックエンドのインスタンスがヘルスチェックに失敗している

今回のような構成でバックエンドのインスタンスがヘルスチェックに失敗している場合、アプリケーションの設定ミスを疑う前に、まずは Compute Engine インスタンスに適用されているファイアウォールルールを確認します。
Google Cloud では、ロードバランサのバックエンドに Compute Engine インスタンスを配置する場合、ヘルスチェックのトラフィックがインスタンスに到達できるように、ファイアウォールルールでヘルスチェックのソース IP アドレスに対する許可ルールを作成する必要があります。

具体的には、以下の IP アドレス範囲をソースとした、ヘルスチェックで設定したプロトコルの Ingress 通信を許可するルールを作成する必要があります。

  • 35.191.0.0/16
  • 130.211.0.0/22

バックエンドのトラフィックに IPv6 を使用する場合、もしくは外部パススルー ネットワーク ロードバランサを使用している場合、バックエンドにハイブリッド NEG を使用している場合などは例外的に設定内容が異なります。詳細については当記事の末尾に記載しているドキュメントを参照してください。

当記事の構成ではヘルスチェックに TCP のポート80番 を使用しているため、ヘルスチェックのソース IP 範囲に対して、ポート80番の Ingress トラフィックを許可します。

ヘルスチェックのソースIPアドレス範囲を許可する

ヘルスチェック用のファイアウォールルールを作成すると、バックエンドのインスタンスのヘルスチェックが成功していることがわかります。

バックエンドのインスタンスがヘルスチェックに成功する

再度、ブラウザからロードバランサ経由でWebアプリケーションにアクセスすると、正常にページが表示されます。
当記事では WordPress が構成済みのインスタンスを使用しているため、WordPress のページが表示されています。

Webアプリケーションが正常に表示される

参考

佐々木 駿太 (記事一覧)

G-gen最北端、北海道在住のクラウドソリューション部エンジニア

2022年6月にG-genにジョイン。Google Cloud Partner Top Engineer 2024に選出。好きなGoogle CloudプロダクトはCloud Run。

趣味はコーヒー、小説(SF、ミステリ)、カラオケなど。