GCLB の urlmap 作成で No default backend service specified for path matcher エラー
Table of Contents
Cloud Load Balancing (GCLB)
言わずと知れた Google Cloud のマネージドロードバランササービス。
今回、 terraform からグローバル外部アプリケーションロードバランサを作成しようとしたところ、エラー終了したので、調査していく。
エラー
発生したエラーは以下の通り。パスマッチャーの構成配下でdefault_serviceが足りていない模様。
google_compute_url_map.main: Creating...
╷
│ Error: Error creating UrlMap: googleapi: Error 400: Invalid value for field 'resource.pathMatchers[0].defaultService': ''. No default backend service specified for path matcher, invalid
│
│ with google_compute_url_map.main,
│ on main.tf line xxx, in resource "google_compute_url_map" "main":
│ xxx: resource "google_compute_url_map" "main" {
│
╵
ただ、google_compute_url_mapの.pathMathchers[].defaultServiceはOptionalな設定値であるとterraformのドキュメントへ記載があるため、調査をしてみることにする。
google_compute_url_map | Resources | hashicorp/google | Terraform | Terraform Registry
発生環境
- terraform(クライアント): v1.12.1
- provider: hashicorp/google v6.44.0
Google Cloud コンソールから確認
Google Cloud コンソールから同じようになるか見ていく。
ブラウザ上では明示的に設定しなくても、同等のコードを見ると、urlmapの作成時に.pathMathchers[0].defaultServiceが作成されている。

Google Cloud コンソールで「同等のコード」ボタンから確認
POST https://compute.googleapis.com/compute/v1/projects/${PROJECT_ID}/global/urlMaps
{
"defaultService": "projects/${PROJECT_ID}/global/backendBuckets/gryu7-test-backendbucket-20250715",
"hostRules": [
{
"hosts": [
"example"
],
"pathMatcher": "path-matcher-1"
}
],
"name": "gryu7-test-lb-20250715",
"pathMatchers": [
{
"defaultService": "projects/${PROJECT_ID}/global/backendBuckets/gryu7-test-backendbucket-20250715",
"name": "path-matcher-1",
"pathRules": [
{
"paths": [
"/example/*"
],
"service": "projects/${PROJECT_ID}/global/backendBuckets/gryu7-test-backendbucket-20250715"
}
]
}
]
}
そして、実際に作成してみて、Google Cloud コンソール上から確認すると、作成しようとしていた画面と作成後の画面では、自動的にこのパスマッチャーに対してデフォルトのルールが追加されていることが観測できる。

作成前の確認

作成後の詳細情報
赤線部分のようにパスマッチャーのデフォルトルールが追加されている
なお、Google Cloud コンソールから作成ボタンを押下して発行したHTTPリクエストをみてみると、同等のコードに含まれていた.pathMathchers[0].defaultServiceは送られていない。
今回意図せず知ったが、Google Cloud コンソールから発行しているHTTPリクエストの宛先は、terraformなどで発行しているREST API(Compute Engine API: https://compute.googleapis.com/ )の宛先とは異なっており、
https://cloudconsole-pa.client6.google.com/v3/entityServices/entities/NETWORKING_LB_HTTPS_ADVANCED_LOAD_BALANCER/async/CREATE
となっていた。
このHTTPリクエストの宛先については面白そうなので、もう少し調べたいなという気持ちだが、今回はいったん蚊帳の外において、urlmapを見ていく。
ひとまず、同等のコードに出力されていた Compute Engine API のurlmapに関するドキュメントを見るが、ここからは送信しているRequest Bodyの各フィールドがRequired/Optionalのどちらなのかは読み解けない。
https://cloud.google.com/compute/docs/reference/rest/v1/urlMaps/insert
terraform側の確認
とりあえず、.defaultServiceと同じ値を.pathMathchers[0].defaultServiceへ設定してから再度terraform applyをすると作成完了。
Google Cloud コンソール上でも期待値のurlmapが作成されていた。
今回ドキュメントでOptionalになっているのが誤りのように思えたので、terraformのコードを見ていくことに。
Google Cloudのterraform providerは、こちらにあるが、これはMagic Modulesによって自動生成されているとのことで、元のリポジトリを見てみる。
- name: 'defaultService'
type: ResourceRef
description: The backend service or backend bucket to use when none of the given paths match.
# TODO: (mbang) won't work for array path matchers yet, uncomment here once they are supported.
# (github.com/hashicorp/terraform-plugin-sdk/issues/470)
# exactly_one_of:
# - path_matchers.0.default_service
# - path_matchers.0.default_url_redirect
# - path_matchers.0.default_route_action.0.weighted_backend_services
terraformでの実行においては、単一のパスマッチャー内で、default_serviceはRequiredではないが、
- default_service
- default_url_redirect
- default_route_action.0.weighted_backend_services
のいずれか一つは指定する必要がある模様。
解決方法
繰り返しですが、.pathMathchers[0].defaultServiceを.defaultServiceと同じ値で設定することで、期待するurlmap自体は作成できました。
所感・まとめ
- APIの受け取り側で指定されていて、Errorが返却される項目なので、Compute Engine API側のドキュメントにも記載されていてほしい
- Google Cloud向けのHTTPリクエストがGoogle Cloud コンソールとREST APIそれぞれ別の宛先になっている件はもう少し理解を深めたい
- GCLB自体、マネージドなロードバランササービスであるのに、複数のリソースから成り立っていることでいつも複雑に思う
- Google Cloud コンソールからだと、
NETWORKING_LB_HTTPS_ADVANCED_LOAD_BALANCERという1つのCREATEのリクエストでGCLBを作成していたので、ここらへんを調べると理解が深まりそうな感じがする
- Google Cloud コンソールからだと、
