はじめに

モバイルゲームのクライアントとして Android/iOS 用アプリを作成しており,サーバサイドではフロントに CDN (CloudFront) を配置している. CDN に冗長性を持たせられておらず SPOF となっている問題があるため, CloudFront に障害が発生することを想定して予備の CDN を用意した上でフェイルオーバーできるようにしておきたい.

フェイルオーバー案

要求

平時に参照する CDN (プライマリ) に障害が発生した際に,クライアントアプリが参照する CDN を自動的に予備の CDN (セカンダリ) に切り替えられるようにしたい.また,フェイルオーバーに要する時間 (ダウンタイム) は 3 分以内としたい.

DNS による対応

CDN 用のドメインを用意し,そのドメインで解決されるアドレスを障害発生時に自動的に切り替えるように設定する.クライアントアプリは当該ドメインを名前解決できさえすればよいため,アプリ自体に変更を加える必要はない.

具体的な方法として, Route 53 にプライマリ CDN とセカンダリ CDN を登録し,ヘルスチェックの結果によって名前解決で返却されるアドレスを切り替える方法が挙げられる.

フェイルオーバーに要する時間

Route 53 のヘルスチェック間隔 (30 sec.) + DNS TTL (60 sec.) = ダウンタイム (120 sec. 以内)

ヘルスチェック間隔は固定だが TTL はさらに短く設定できるらしい. DNS から返却されるアドレスは障害の発生から 120 sec. 以内に切り替わるが,もしもクライアントアプリで DNS キャッシュを保持している場合にはキャッシュが切れるまで障害のある CDN を参照し続けてしまう可能性がある.

参考

クライアントアプリによる対応

アプリでプライマリ CDN のヘルスチェックを行い,異常が検知された際にセカンダリ CDN を参照するように実装する.作り込みが必要となるが,参照する CDN をクライアント自身が直接指定するため, DNS で対応する場合に比べてダウンタイムは短縮できる.

フェイルオーバーに要する時間

ヘルスチェック間隔 (XX sec.) + 参照先 CDN 変更時間 (YY sec.) = ダウンタイム (ZZ sec.)

アプリの実装に依存する.

まとめ

実践! ヌーラボサービスでの CloudFront の障害対策 - ヌーラボ [Nulab Inc.] より引用・改変

対応方法proscons
DNSアプリの変更なし,Route 53 で手軽に実現可能アプリに DNS キャッシュを持たせていると CDN 切替まで時間がかかる場合がある
アプリCDN 障害時に即切替可能アプリの作り込みが必要

利用する CDN の検討

要件と簡単な比較

次の要件を満足する CDN をピックアップする.

  • 日本にエッジロケーションがある
  • 従量課金制である
  • Amazon S3 をオリジンとして利用できる

以下に各 CDN の pros/cons を簡単にまとめた.機能的には決定的な差がないため,主に料金や実績の面で選定することとなる.

CDNproscons
Akamai業界最大手, SLA 100%料金体系が不明瞭
CDN77技術的な質問への回答が迅速
KeyCDN突出して安価 (CloudFront の 1/3)低信頼 (現在は改善)
CDNetworks日本語での 24/365 サポート料金体系が不明瞭
Cachefly安価かつ実績あり
Fastly高価

料金比較

Akamai と CDNetworks は具体的なプランや料金は要問い合わせ.

最低利用料金

毎月必要となる料金である. Fastly のみ月額 50 USD であり,他の CDN は無料である.

転送量あたりの料金

KeyCDN が突出して安価である.

転送量 10 TB 以下の場合
CDN料金 (USD / GB / month)
KeyCDN0.040
CDN770.125
CloudFront0.140
Cachefly0.150
Fastly0.190
転送量 50 - 100 TB の場合
CDN料金 (USD / GB / month)
KeyCDN0.04
Cachefly0.08
CDN770.12
CloudFront0.12
Fastly0.14

HTTP メソッドのリクエスト料金

CDN料金 (USD / 10,000 req / month)
KeyCDN0
CDN770
Cachefly0.008
CloudFront0.009
Fastly0.009

CloudFront では HTTPS を用いると 0.012 USD となる.

ストレージ料金

基本的に CDN とは別に S3 のような形でオリジンを用意するため, CDN のストレージを用いることはない予定である.ただし CDN によってはログを蓄積するためにストレージが必要な場合もあるらしいので契約前に確認が必要である.