さいとブログ

CloudLoadBalancingでバックエンドバケットにルーティングするときはpathとバケット内の階層を一致させよう

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

環境

GoogleCloud

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


結論

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

解説

今回使用するterraformのコードの一部です。他にもgcsなどのリソースも作ってますが、解説する内容とは関係ないので省略してます。
デフォルトのルートとは別にpaths = ["/test/*"]でバックエンドバケットにルーティングするように設定されています。

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
├── 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. を踏んでしまいました。
↓が参考にした公式の構築例です。

  • https://cloud.google.com/load-balancing/docs/https/ext-load-balancer-backend-buckets?hl=ja#copy-file
  • https://cloud.google.com/load-balancing/docs/https/ext-load-balancer-backend-buckets?hl=ja#createanwith_backend_buckets


最後に

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

プロフィール

profile icon

saitoです。
ソフトウェアエンジニアとして働いています。
web開発に関する学びを当ブログに書き残しています。