GoogleCloudLoadBalancing(以下、GCLB)のurl-mapを指定して、バックエンドバケットにルーティングするときに地味にハマったエラーとその解消法について書きます。

環境

1
2
3
4
5
6
7
GoogleCloud

# terraformで構築するため一応バージョンのせておく
terraform --version
  v1.3.5
hashicorp/google
  v4.74.0

結論

GCLBを経由してGCSのオブジェクト参照するときは、オブジェクトのpathとurl-mapで指定するpathは一致させる必要があります。

解説

今回使用するterraformのコードの一部です。他にもgcsなどのリソースも作ってますが、解説する内容とは関係ないので省略してます。

デフォルトのルートとは別にpaths = ["/test/*"]でバックエンドバケットにルーティングするように設定されています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
resource "google_compute_url_map" "default" {
  name = "${local.project}-${local.prefix}"

  default_service = google_compute_backend_bucket.backend_bucket.id

  host_rule {
    hosts        = ["*"]
    path_matcher = "path-matcher-2"
  }
  path_matcher {
    name            = "path-matcher-2"
    default_service = google_compute_backend_bucket.backend_bucket.id

    path_rule {
      paths   = ["/test/*"]
      service = google_compute_backend_bucket.backend_bucket.id
    }
  }
}

上記のコードで構築した、GCLBの設定は以下のようになっています。

ホストパスバックエンド
不一致すべて(デフォルト)不一致すべて(デフォルト)training-394392-gclb-cdn-gcs
*/test/*training-394392-gclb-cdn-gcs
*/*training-394392-gclb-cdn-gcs

そして、対象のバックエンドバケットには以下のようにオブジェクトが配置されています。

1
2
3
4
training-394392-gclb-cdn-gcs
├── hengao_mabuta_uragaesu.png
└── test
      └── buranko_boy_smile.png

では、環境構築できたのでGCLB経由してオブジェクトを参照してみます。

NGなURLでは、NoSuchKeyとエラーになり、OKなURLではブラウザなどで画像参照ができます。

それぞれNGとOKな理由は恐らく以下の通りだと思います。(あくまでも、個人の見解なので理由は違うかもしれないです)

  • NGなURL
    • http://34.36.243.201/test/hengao_mabuta_uragaesu.png
      • test以下に対象のファイル名はないためエラーになる
    • http://34.36.243.201/test/test/buranko_boy_smile.png
      • test/testという階層がバケットには作られていないためエラーになる
  • OKなURL
    • http://34.36.243.201/test/buranko_boy_smile.png
      • test階層の下に対象のファイル名が存在するため画像参照できる

ちなみになんか画像参照できないなってときはAuditLogを有効にすると、CloudLoggingにGCSの操作ログが流れてくるので、storage.objects.getしているログを見つけて、参照pathを確認するとデバッグが捗るようになると思います!

補足

GoogleCloudのガイドを見ると、この点の詳細に触れずにpathを一致させるように構築していました。

特に理由について触れているところが見当たらなかったので、普通に別名で構築して、NoSuchKey. を踏んでしまいました。

↓が参考にした公式の構築例です。

最後に

たぶん、公式の何処かに明記されているか、ロードバランサー使うときの常識なのかもしれないけど、そこらへん無知だからはまってしまいました…