運用しているサービスを東日本に移したタイミングで Azure CDN を使うようにしましたが、一部どのような挙動になっているのか分からない部分があったので、調べた結果をメモしておきます。
エッジサーバーのロケーション
Azure CDN は当然ながら世界中に CDN のエッジサーバーが存在しています。
Azure Content Delivery Network (CDN) Node Locations
日本には東京と大阪の 2 箇所に CDN エッジサーバーが設置されています。それって Azure のデータセンターの中にあるんじゃないかと思ってしまいますが、Azure CDN は EdgeCast という会社の CDN を使っているのでネットワーク的に別物になっています。
なので、tracert を叩いてみると Microsoft のネットワークに入る前にトレースが完了します。
EdgeCast が東京に持っている CDN は Equinix 内に置かれているようですね。大阪に関してはどこに置かれているのか、ちょっと分かりませんでした。
ポータルから行える設定
Azure CDN は管理ポータルに以下の設定しかありません。とてもシンプルな感じです。
- エンドポイントの有効化 / 無効化
- HTTPS の有効化 / 無効化
- クエリ文字列の有効化 / 無効化
- ドメインの管理
この中で重要になるのがクエリ文字列の有効化の設定です。この設定を有効にしない場合には、以下の URL は同じものとして CDN エッジサーバーにキャッシュされます。
- http://az******.vo.msecnd.net/container/sample.jpg
- http://az******.vo.msecnd.net/container/sample.jpg?1234567890
よく使われるテクニックとしてクエリ文字列にタイムスタンプを付けて、最新版を読み込ませるというものがありますが、Azure CDN を使っている場合にはクエリ文字列を有効にしておかないと無意味です。
個人的には以下のような URL ヘルパーを用意して使っています。
public static class UrlExtensions { private static readonly long _timestamp = DateTime.UtcNow.Ticks; public static string StaticContent(this UrlHelper urlHelper, string contentPath) { return ConfigurationManager.AppSettings["CdnEndpoint"] + contentPath + "?" + _timestamp; } }
タイムスタンプを static なフィールドに保存しておくことで、デプロイなどでアプリケーションが再読み込みされたタイミングで新しいファイルを読み込むように出来ます。
エッジサーバーにキャッシュされる期間
Blob から Azure CDN にキャッシュされたデータは、デフォルトでは 7 日間キャッシュされます。ただし、Blob のメタデータとして Cache-Control ヘッダーが設定されていた場合には、その値に従って有効期間が設定されます。
Cache-Control ヘッダーを Blob に設定する方法は、以下のページでコード付きで紹介されています。
Azure コンテンツ配信ネットワーク (CDN) で BLOB コンテンツの有効期限を管理する方法
あまり関係ないですが、Azure CDN は要求されたデータをまだキャッシュしていない場合には、そのタイミングで関連付いている Blob まで取りに行きます。このような仕組みなので、Blob には存在しているのに 404 が返ることは起こりえません。
まだ Blob に存在していなくて 404 をエッジサーバーが返したとしても、そのレスポンスをキャッシュしたりはしないので変な心配は不要です。
おまけ:CDN 利用料金について
当然ながら Azure CDN は使った分だけ課金が行われます。CDN って何となく高そうに思うのですが、思ったほど高くはありません。むしろ結構安いと思います。
日本はゾーン 2 にあたるので、1GB の送信あたり最大で 19.38 円が課金されます。月に 100GB を CDN から送信したとしても 1,938 円で済みます。
Pricing Details - Data Transfers | Microsoft Azure
ちなみに Azure ストレージの Blob から送信する場合にも課金が行われますが、月に 5GB までは無料かつ超えた分は 1GB あたり 19.38 円が課金されます。つまり Blob から直接送信しようと、CDN から送信しようと料金には 5GB の無料分ぐらいしか差が出ないということです。*1
*1:厳密には Blob から CDN へコピーする時の送信にも課金される