🛤️

Cloud Load Balancingでマッチしたパスを特定のサービスに振り分ける

2021/03/28に公開

記事というより個人的なメモです。GCPのCloud Load Balancing(負荷分散)を使うと、複数のバックエンドサービスを配置し、リクエストされたパスによって特定のサービスに振り分けることができます。

例えば、以下のように複数のGCPサービスを使っているとします。

  • フロントエンドはCloud Runにデプロイ
  • APIはGAE(App Engine)にデプロイ
  • OG画像生成する関数をCloud Functionsにデプロイ
  • 画像はCloud Storageから配信

Cloud Load Balancingを使うと、これらの別々のサービスに対して同一のドメインを使うことができます。

  • example.com/api/* => GAE
  • example.com/images/* => Cloud Storage
  • example.com/og-image/* => Cloud Functions
  • example.com/*(それ以外) => Cloud Run

こんな感じでパスによって特定のサービスに流すことができるわけです。

Cloud Load Balancingでパスのルールを設定する

ロードバランサの編集画面で[ホストとパスのルール]という項目を選択します。モードとして

  • 単純なホストとパスのルール
  • 詳細なホストとパスのルール

のどちらかを選ぶことになりますが、パス接頭辞の書き換え(後述)をするには[詳細なホストとパスのルール(URL リダイレクト、URL の書き換え)]にする必要があります。

ホストとパスのルールの追加します。以下のようにして、特定のパスを、特定のバックエンドサービスに振り分けるように設定できます。

[パス接頭辞の書き換え]を忘れずに

ここがポイントなのですが、多くのケースでは [パス接頭辞の書き換え]に / を指定する必要があるのではないかと思います。これを指定しないと、URLに/apiのような接頭辞が残ったまま、リクエストが流されます。

[パス接頭辞の書き換え]を空白にしていた場合、たとえば/api/postsへのリクエストは、そのまま/api/postsとして流されます。つまりアプリケーション側でのルーティングは/api/が含まれている前提で処理する必要があります。

[パス接頭辞の書き換え]に/を指定した場合、/api/postsへのリクエストは、/postsとしてバックエンドサービスに流されます。/apiの部分を/に変えてくれるわけですね

こちらの方がアプリケーション側でのルーティングがやりやすいと思います。

Discussion