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 コンソールで「同等のコード」ボタンから確認

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によって自動生成されているとのことで、元のリポジトリを見てみる。

これっぽい。
https://github.com/GoogleCloudPlatform/magic-modules/blob/main/mmv1/products/compute/UrlMap.yaml#L358-L377

        - 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を作成していたので、ここらへんを調べると理解が深まりそうな感じがする