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な理由は恐らく以下の通りだと思います。(あくまでも、個人の見解なので理由は違うかもしれないです)
http://34.36.243.201/test/hengao_
mabuta_
uragaesu.png
http://34.36.243.201/test/test/buranko_
boy_
smile.png
http://34.36.243.201/test/buranko_
boy_
smile.png
ちなみになんか画像参照できないなってときはAuditLogを有効にすると、CloudLoggingにGCSの操作ログが流れてくるので、storage.objects.get
しているログを見つけて、参照pathを確認するとデバッグが捗るようになると思います!
GoogleCloudのガイドを見ると、その点に詳細に触れずにpathを一致させるように構築していました。
特に理由について触れているところが見当たらなかったので、普通に別名で構築して、NoSuchKey. を踏んでしまいました。
↓が参考にした公式の構築例です。
たぶん、公式の何処かに明記されているか、ロードバランサー使うときの常識なのかもしれないけど、そこらへん無知だからはまってしまいました...