Cloud Load Balancingでマッチしたパスを特定のサービスに振り分ける
記事というより個人的なメモです。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