GoogleCloudLoadBalancing(以下、GCLB)のurl-mapを指定して、バックエンドバケットにルーティングするときに地味にハマったエラーとその解消法について書きます。
環境
|
|
結論
GCLBを経由してGCSのオブジェクト参照するときは、オブジェクトのpathとurl-mapで指定するpathは一致させる必要があります。
解説
今回使用するterraformのコードの一部です。他にもgcsなどのリソースも作ってますが、解説する内容とは関係ないので省略してます。
デフォルトのルートとは別にpaths = ["/test/*"]
でバックエンドバケットにルーティングするように設定されています。
|
|
上記のコードで構築した、GCLBの設定は以下のようになっています。
ホスト | パス | バックエンド |
---|---|---|
不一致すべて(デフォルト) | 不一致すべて(デフォルト) | training-394392-gclb-cdn-gcs |
* | /test/* | training-394392-gclb-cdn-gcs |
* | /* | training-394392-gclb-cdn-gcs |
そして、対象のバックエンドバケットには以下のようにオブジェクトが配置されています。
|
|
では、環境構築できたので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. を踏んでしまいました。
↓が参考にした公式の構築例です。
最後に
たぶん、公式の何処かに明記されているか、ロードバランサー使うときの常識なのかもしれないけど、そこらへん無知だからはまってしまいました…