Azure Blob StorageできれいなURLを使う

AWS S3と異なり、Azure Blob StorageではURLのルートパスに直接ファイルを置くことができない。コンテナ名が必ず入ってしまうため、意味も無く一段深いURL構造になってしまっていた。カスタムドメインを使っていてもこの問題はついて回るため、あきらめて長いURLを使うか何らかのリダイレクションを行うしか無かった。

初期状態)
https://xarsh.blob.core.windows.net/container_name/filename.jpg

カスタムドメイン使用後)
https://foo.xar.sh/container_name/filename.jpg

ほんとはこうしたい)
https://foo.xar.sh/filename.jpg

他のサービスをつかえばなんとかなるんだけども、できるだけ楽にそのなんとかをしたい。Azure上で完結するやり方としては二つある。

Azure Functions Proxies

これは任意のURLを内部で書き換えてくれるサービスで、たとえば上の例でいえばルートパスにアクセスされた場合にコンテナ名付きのリクエストであるかのようにルーティングしてくれる。30xリダイレクトじゃないので取り回しが楽だ。

作ったFunctionsにカスタムドメインを割り当て、上のような設定にするとうまくいった。 まぁ毎度のことながらほとんど情報がないし解説してくれる人もいないので設定がわかりにくい。AzureのPreviewサービスは英語のドキュメントすら用意されていないことがまともに普通になっている。ユーザーに試行錯誤が要求されているのはすこし面倒だ。

Azure CDN

こちらは転送量に応じて多少お金がかかる。が、一つ目のFunctions Proxiesよりも簡単に設定できるし応答も早い。

このように、CDNのOriginを設定するときにOrigin pathを設定できる。というわけでここでコンテナ名を指定すると、CDNのエンドポイントからはコンテナ名を削除してアクセス可能だ。そしてCDNのエンドポイントにカスタムドメインを指定すれば理想の状態となる。AzureCDNのバックエンドにはAkamaiが使われている。言うまでもないがCDN業界でのシェアはトップクラスなわけで、普通にAzure BlobStorageにアクセスするよりもかなり速くなる。

このブログはGitで管理していることもあり大きなバイナリとかを入れたくない。でもたまに動画を貼ったりしたい。 そのような用途ではAzure Storageは設定も柔軟で速度もはやいのでとても便利だった。URLが好きにいじれるとなると、もう不満はない。これからも便利に使わせてもらおう。