-

クラウド CDN 比較 (Amazon CloudFront・Azure CDN・GCP Cloud CDN)

前へ << クラウドデータベース比較 (Amazon RDS・Azure SQL Database GCP Cloud SQL) クラウド DNS サービス比較 (Amazon Route53, Azure DNS, GCP Cloud DNS) >> 次へ

CDN とは

CDN とは "Content Delivery Network" の略で、「シーディーエヌ」と発音します。 ざっくり言うと、CDN 事業者がサーバを立て、サービス事業者であるあなたの代わりにコンテンツを配信してくれる、というものです。

得られるメリットは下記です。

  • サーバ負荷を受け持ってくれる
  • ネットワーク帯域の節約になる
  • エンドユーザ (利用者) の近くに CDN のサーバがあるので速い (かもしれない)
  • キャッシュしてくれるので早い
  • ワンタイム URL やタイマ機能などを利用できる (かもしれない)

例えば、以前関わったことのある EC サイトにて、画像の CDN 化を行なったときは、 ネットワークピーク転送量 70% 減、サーバ負荷 20% 減となりました。 ネットワーク契約の帯域料を削減して月30万節約、一方で CDN 費用は 2万円/月でした。

デメリットは下記です。

  • お金がかかる
  • 正しく使わないと、セキュリティ事故が発生する可能性がある (後述)
  • 別 FQDN になる場合があるので、Cookie の扱いなどに注意が必要

CDN が向いているサービス

例えば、ある日の Gigazine のページを分析すると、下記のようになりました。

  • 合計サイズ 2.5MB: 内訳は下記
  • - 画像が 35% (893KB)
  • - スクリプトが 25% (644KB)
  • - HTML が 3% (86KB)
  • - その他 が 35% (891KB) (うち動画 mp4 ファイルが 700KB 超)

Gigazine は、ぱっと見、誰が見ても同じコンテンツを返すように見えます (実は「シークレットクラブ」という会員機能があるようですが、ほとんどは非会員からのアクセスと思われます)。 このような誰が見ても同じコンテンツがある、というときに、CDN は最大の効果を発揮します。 利用者 A さんに送った画像ファイルを CDN でキャッシュしておけば、利用者 B さんにもそのキャッシュが使えるためです。

上記の比率を見ると、もし画像 + スクリプト + 動画 mp4 ファイルを CDN 化できたならば、 90% 以上のデータを CDN 経由とすることができ、その分 Gigazine サーバへのアクセスを減らすことができます。

いろいろなパターン

CDN を使わない場合、利用者とサービス事業者の関係は、下記です。
利用者 ←→ サービス事業者のサーバ
CDN を使う場合、CDN 事業者が間に入る形となります。この場合のサービス事業者のことを、 オリジンと言います (origin は起源とか発端という意味の英単語)。
利用者 ←→ CDN事業者のサーバ ←→ サービス事業者 (オリジン)
いろいろな接続方法があります。 下記は、そもそもクラウドサービスを使っていないけれども、画像だけを CloudFront に乗せた場合。
HTML コンテンツ (www.myservice.xxx)
  利用者 ←→ サービス事業者
画像 (img.myservice.xxx)
  利用者 ←→ Amazon CloudFront ←→ サービス事業者サーバ
下記は、HTML は EC2 で、画像は S3 に起き、それぞれに CloudFront を使用する形。
HTML コンテンツ (www.myservice.xxx)
  利用者 ←→ Amazon CloudFront ←→ サービス事業者が使用している EC2
画像 (img.myservice.xxx)
  利用者 ←→ Amazon CloudFront ←→ サービス事業者が使用している S3

各クラウドサービスの CDN

Amazon・Microsoft・Google の提供する CDN サービスは下記のとおりです。 Azure はややこしいのですが、3種類あります。
  • Amazon が提供する CDN サービスは "CloudFront"
  • Google が提供する CDN サービスは "Cloud CDN"
  • Microsoft が提供する CDN サービスは下記の 3つ。
    • Azure CDN Standard from Akamai (略称 Standard Akamai)
    • Azure CDN Standard from Verizon (略称 Standard Verizon)
    • Azure CDN Premium from Verizon (略称 Premium Verizon)

Akamai (アカマイ) というのは老舗の CDN 事業者です。 世界中の 10〜20% のトラフィックをさばいている、とはよく聞きますが、 昔はともかく今もそうなのかはちょっと疑問です。ソース希望。 Verizon (ベライゾン) は米国の大手通信会社です。 日本ではあまり馴染みがない名前ではありますが、グループ全体の売上高は 12兆円です。 売上12兆円というのは日本の企業だと第5位くらいで、要は、超巨大企業です。

マイクロソフトとしては、自前で CDN ネットワークを調達するよりは、 Akamai や Verizon に頼った方がよいと判断したんでしょうね。

Amazon CloudFront・Azure CDN・Google Cloud CDN の機能比較

機能比較表をまとめてみました。 詳細は後述。

- Amazon CloudFront Azure CDN Cloud CDN
接続方式
リバースプロキシ
ストレージへの接続 ◯ (S3 へ) ◯ (Azure Storage へ) ◯ (Cloud Storage へ)
クラウド以外のオリジン ×?
料金
料金(日本・転送量・1ヶ月あたり・最初の10TB) 0.140 USD/GB 14.08円/GB 0.09 USD/GB
クラウドからCDNへの転送料 無料 有料 無料?
SSL (HTTPS) 追加料金 あり なし なし
SSL/TLS
SSL/TLS
無料 SSL/TLS 証明書
SSL/TLS 強制・リダイレクト ◯ (httpのみ・httpsのみ・http→httpsリダイレクト) △ (httpを無効化するのみ) ×?
キャッシュ無効化
キャッシュ無効化 (削除)
キャッシュ無効化速度 5秒で90%、1分で完了 Verizon で 2〜3分、Akamai で 7分 数分
キャッシュ無効化時のワイルドカード指定 △ (Standard Verizon、Premium Verizon のみ)
その他
国ごとの公開可否設定 ×
カスタムエラー表示 × ×
オリジンタイムアウト設定 × ×
独自 FQDN 設定 (http) ?
独自 FQDN 設定 (https) △ (Standard Verizon、Premium Verizon のみ) ?
独自ヘッダ設定 Premium なら可能? ×?
クエリ文字列設定 ◯ (ホワイトリスト・ブラックリスト) △ (クエリを無視、クエリ付きの場合キャッシュしない、クエリを別コンテンツ扱い、のいずれかのみ) ◯ (ホワイトリスト・ブラックリスト)
オリジンでのgzip等の圧縮
CDNでのgzip等の圧縮 ×
CDN での TTL 指定 ◯ (CDNで上書き可能) × (オリジンで設定が必要) × (オリジンで設定が必要)
エラーページ TTL 指定 × ×
ワンタイム URL ×
Basic・Digest 認証 △ (オリジンへの中継なら可) ? ?
事前キャッシュ (プリフェッチ) × ◯ (Standard Verizon、Premium Verizon のみ) ×
マルチオリジン ×?
IP アドレス 複数? ? 単一IPアドレス

接続方式について

- Amazon CloudFront Azure CDN Cloud CDN
リバースプロキシ
ストレージへの接続 ◯ (S3 へ) ◯ (Azure Storage へ) ◯ (Cloud Storage へ)
クラウド以外のオリジン ×?

CloudFront・Azure CDN・Cloud CDN いずれも、リバースプロキシタイプです。 世の中の CDN には二通りあり、

  • A. FTP 等で、指定のサーバの指定のフォルダにファイルをアップすることで配信が可能となる
  • B. リバースプロキシ型。 どこかの Web サイトでコンテンツを配置しておき、CDN にアクセスがあった場合、そのサイトに取りに行くよう設定しておく
というものがありますが、3つの CDN はいずれも B です。 以前は A が多かった気がするんですが、ファイルをアップするのも手間ですし、 A だと動的コンテンツに対応ができないので、現在は B が主流ではなかろうかと当ページ管理人は思っています。

各社ストレージサービスの接続はもちろん可能です。 なお、S3・Azure Storage・Cloud Storage いずれも、配置したファイルを (CDN を使わずに) http で公開することは可能です。 CDN を使うと、さらに速度等の付加価値が付くものと考えてください。

「クラウド以外のオリジン」は CloudFront・Azure CDN は可能ですが、 GCP Cloud CDN のみ不可です。 これは、CloudFront・Azure CDN は、クラウドサービス以外、 例えば さくらインターネットやオンプレミスサーバをオリジンとして指定できるが、 Cloud CDN はできない、ということを意味します。

「Cloud CDN → HTTP(S)負荷分散 → 外部サーバ」ならできるのか? (多分できない気がするが…)

料金について

- Amazon CloudFront Azure CDN Cloud CDN
料金(日本・転送量・1ヶ月あたり・最初の10TB) 0.140 USD/GB 14.08円/GB 0.09 USD/GB
クラウドからCDNへの転送料 無料 有料 無料?
SSL (HTTPS) 追加料金 あり なし なし

料金は例によって AWS>Azure>>>>GCP です (実際はリクエスト数に応じた料金などもあり、より複雑です)。

もし、月間で数百テラバイト〜ペタバイトクラスの転送量をお持ちの場合、 各社営業に見積もり依頼するとよいでしょう。 定価の数分の1 の金額が出てくると思います。

「クラウドから CDN への転送料」について。

AWS では、2013年以降、「S3/EC2/ELB」→「CloudFront」とする際の、S3・EC2・ELB の転送量が無料となりました (それ以前は有料だった)。 GCP Cloud CDN は、記載がすごくわかりづらいのですが、 「Compute Engine/Cloud Storage」→「Cloud CDN」とする際、 Compute Engine や Cloud Storage の転送量は無料である、と当ページ管理人は読み取りました。 Azure CDN は、残念ながら有料です。

動画配信のようなファイルサイズが大きい・ファイル数が多いようなシステムでは、 オリジン → CDN の転送量だけでもバカになりませんので、この点は重要でしょう。 一方、EC サイトの商品画像のような、せいぜい数千〜数万種類の画像であれば、 それほどは影響はないと思われます。

「SSL (HTTPS) 追加料金」について。

AWS の場合、1万リクエストあたりの料金が HTTP では 1.08円 (0.009 USD)、HTTPS では 1.44円 (0.012 USD) となっており、 HTTPS の方が 33% ほど料金が高いです (2017年10月調べ)。 Azure・GCP は HTTP でも HTTPS でも料金は同じです。 HTTPS 化が進んでいる昨今、AWS も同一料金になることを期待します。

「キャッシュ無効化 (削除)」について

- Amazon CloudFront Azure CDN Cloud CDN
キャッシュ無効化 (削除)
キャッシュ無効化速度 5秒で90%、1分で完了 Verizon で 2〜3分、Akamai で 7分 数分
キャッシュ無効化時のワイルドカード指定 △ (Standard Verizon、Premium Verizon のみ)

一度キャッシュしたコンテンツを無効化したい場合が、たまによく非常にあります。 「誤った画像をアップしてしまったので、すぐに差し替えてほしい」 「上げてはいけない画像をアップしてしまったので、すぐに削除してほしい」 系ですね。「そんなのしばらく待てばそのうち差し替わるよ」と思いつつも、 他社が権利を持つタレントや商品の画像だったりすると「すぐに!いますぐに!!」と言われることもあり、悩ましいところです。 あとは、開発者のミスとしては、 「プログラムのミスで TTL を 1ヶ月にしてしまった」というのも、たまにまれによくありますね。

そもそも CDN において、キャッシュ削除というのはかなり時間がかかる処理です。 世界各国のエッジサーバ拠点が数十〜数百もあり、それぞれに数百〜数千台のサーバがあるでしょうから、 全サーバに削除処理を投げるだけでも結構な仕事であることは理解いただけるかと思います。

しかしながら、以前は数十分とか数時間かかっていた気がするのですが、 最近は遅くとも数分で完了するようになっているようです。

また、3社とも "/images/*" などのワイルドカード指定ができますが、 Azure CDN は Akamai のみワイルドカード指定ができないことに注意です。 ワイルドカード指定ができない場合、"/images/0001.jpg"、"/images/0002.jpg" … とひとつずつ無効化を行うしかありません。

無効化にはお金がかかる場合があります。

  • Amazon Cloud Front では 1000リクエストは無料、その後は 1リクエストあたり 0.005 USD、
  • GCP Cloud CDN では、1リクエストあたり 0.005 USD (最初の 1回目から有料)

Azure CDN では無効化は無料のようです。

「gzip等のCDNでの圧縮」について

- Amazon CloudFront Azure CDN Cloud CDN
オリジンでのgzip等の圧縮
CDNでのgzip等の圧縮 ×

「オリジンでのgzip等の圧縮」について。 オリジンサーバにて gzip 圧縮等に対応している場合、 クライアントがオリジンにリクエストを投げる際、Accept-Encoding: gzip などを渡すと、 レスポンスヘッダ Content-Encoding: gzip となり、ボディは gzip 圧縮して返されます。 このような状態のとき、CDN を経由したとしても、圧縮は正しく動きます。

一方、「CDNでのgzip等の圧縮」について。 オリジンサーバでは圧縮していないが、CDN で圧縮を代行してほしい場合があります。 この機能は Amazon CloudFront、Azure CDN で使用できます。 Cloud CDN では 2017年9月現在、未実装のようです。

「セキュリティ事故が発生する可能性がある」について

CDN にかぎらず、nginx や Apache proxy などでの内部キャッシュを立てている場合も同じですが、 注意喚起として書いておきます。

2017/06、メルカリが CDN 切替作業の際、やらかしました (詳細)。

簡単にまとめると、下記です。

  • マイページなどの個人情報が記載されたページは CDN でのキャッシュ対象外としていた (具体的には Cache-Control: no-cache を出力)。
  • これまで利用していた CDN とは別の CDN に切り替え作業を行なった。
  • 新 CDN では、Cache-Control: no-cache によってキャッシュ対象外とはならない仕様であった。
  • マイページなどがキャッシュされてしまったため、他人の個人情報が閲覧できてしまった。

また、はまりがちな点として、 セッション ID が入った Set-Cookie ヘッダをキャッシュしてしまう、というものがあります。 これにより、他人のセッション ID を受け取ってしまい、次回以降のアクセスでは他人として扱われてしまう、 という事故が考えられます。

CloudFront では、デフォルトでは Cookie・Set-Cookie の中継はしませんが、 中継するように設定することもできます。 GCP Cloud CDN では、Set-Cookie ヘッダが含まれている場合はキャッシュ保存しません。 しかしながら、body 内の Javascript で Set-Cookie している場合は CDN はそれを検知できませんので、 他の人向けの Cookie が設定されてしまう可能性があります。

「CDN の仕様把握をちゃんとしましょう」「Cookie 発行は気をつけましょう」という話ではあるのですが、 そもそも「動的ページでも CDN を通すべきか」はよく考えるべきでしょう。

動的ページでも CDN 経由とするメリットはあります。例えば下記。

  • CDN に SSL 復号をまかせたい
  • CDN で DDoS 対策を行なってほしい
  • DNS の名前解決のスピードを減らすため、img.XXXXX.net のような別 FQDN は極力減らしたい
  • 動的ページだけれども、数分間だけキャッシュさせる、といった風に細かなコントロールを行いたい

しかしながらその代償は、 「キャッシュ対象・非対象をちゃんと管理しないと、情報漏えい事故が起こり得る」 です。メリット・デメリットをよく考えて決めてください。

前へ << クラウドデータベース比較 (Amazon RDS・Azure SQL Database GCP Cloud SQL) クラウド DNS サービス比較 (Amazon Route53, Azure DNS, GCP Cloud DNS) >> 次へ