Google Cloud のアプリケーションロードバランサーを構成するときに pathMatcher の使用方法が分からなかったので,まとめます.
2025/01/05現在,Google Cloud で提供されている外部アプリケーションロードバランサーには2種類あります.グローバル外部(Global external; EXTERNAL_MANAGED)と従来(Classic; EXTERNAL)です.日本語の名称,英語の名称に加えて loadBalancingScheme 値がありますので,対応関係を理解するのが重要です.
2020年までは Global external の機能が限定されており,例えば Cloud Run などのサーバーレスなバックエンドサービスに対応しておらず使いにくかったのですが,2025年現在はほとんどのバックエンドサービスに対応しているので,新規で外部アプリケーションロードバランサーを構築するならば Global external が第一選択となります.
Google Cloud のロードバランサーにはいくつかの種類がありますが,いずれも urlMaps というリソースを用いて,URL とバックエンドサービスの対応を指定します.
hostname は URL のドメインの部分を指し,path は "/" 以下を指します.なお,path は "/" を含むので原則は "/" から指定します.
pathMatchers で routeRules の配列を指定します.routeRules は以下の構造のオブジェクトです.
{ "priority": integer, "service": string, "matchRules": ... "headerAction": ... "routeAction": ... "urlRedirect": ... }
priority の小さい値の routeRules から順番に評価されていく仕組みで,合致すれば service で指定したバックエンドサービスにリクエストが送られます.ドキュメントによると,matchRules は以下の構造のオブジェクトだそうです.
{ "prefixMatch": string, "fullPathMatch": string, "regexMatch": string, "ignoreCase": boolean, "headerMatches": ..., "pathTemplateMatch": string }
様々な機能を使えそうな印象を受けますが,Global external ロードバランサーで使用可能なのは,このうち prefixMatch, fullPathMatch, headerMatches, pathTemplateMatch の 4 種類だけです.
Regular expressions can only be used when the loadBalancingScheme is set to INTERNAL_SELF_MANAGED. (https://cloud.google.com/compute/docs/reference/rest/v1/urlMaps)
正規表現は使用できないので注意が必要です.
prefixMatch は前方一致,fullPathMatch は完全一致,headerMatches はヘッダーによる条件一致を指定するので,名前の通りです.pathTemplateMatch は少しややこしいですが,*, **, {name=*} のように部分一致を利用して条件を指定するとともに,pathTemplateRewrite を併用すれば,一部を変数に格納して URL を書き換えることができます.これはとても便利で, /** を /index.html に書き換えて,バックエンドに Cloud Storage を指定し,index.html を公開すれば,Single Page Application (SPA) が簡単に実装できます.
なお,Classic ロードバランサーではこの機能を利用できないので,SPA を公開するときはバックエンドサービスとして任意の URL に対して index.html を返すだけのWebサーバーをデプロイする必要があります.
routeRules の headerAction で,リクエストヘッダやレスポンスヘッダの追加や削除ができて便利です.
ロードバランサーには様々な機能があり,urlMaps リソースの公式リファレンスを通読するのはかなり大変ですが,主要な機能はこれぐらいだと思います.
urlMaps をうまく設定すれば,様々なバックエンドサービスを利用して自由にWebサービスを公開できることが分かりました.