はじめに
モバイルゲームのクライアントとして 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 を参照し続けてしまう可能性がある.
参考
- Amazon Web Services ブログ: 【AWS発表】Route53 に DNS フェイルオーバー機能が追加。 S3 のウェブホスティング機能と連携したバックアップサイトを作成可能に。
- [AWS] Route53 DNS フェールオーバー を試してみた。 | 公式ブログ | 株式会社プラウディット
- AWS - Amazon CloudFront の障害に備えてフェイルオーバーを設定する - Qiita
- Route53 の Health Check ターゲットを ELB で試してみた - まめ畑
クライアントアプリによる対応
アプリでプライマリ CDN のヘルスチェックを行い,異常が検知された際にセカンダリ CDN を参照するように実装する.作り込みが必要となるが,参照する CDN をクライアント自身が直接指定するため, DNS で対応する場合に比べてダウンタイムは短縮できる.
フェイルオーバーに要する時間
ヘルスチェック間隔 (XX sec.) + 参照先 CDN 変更時間 (YY sec.) = ダウンタイム (ZZ sec.)
アプリの実装に依存する.
まとめ
実践! ヌーラボサービスでの CloudFront の障害対策 - ヌーラボ [Nulab Inc.] より引用・改変
対応方法 | pros | cons |
---|---|---|
DNS | アプリの変更なし,Route 53 で手軽に実現可能 | アプリに DNS キャッシュを持たせていると CDN 切替まで時間がかかる場合がある |
アプリ | CDN 障害時に即切替可能 | アプリの作り込みが必要 |
利用する CDN の検討
要件と簡単な比較
次の要件を満足する CDN をピックアップする.
- 日本にエッジロケーションがある
- 従量課金制である
- Amazon S3 をオリジンとして利用できる
以下に各 CDN の pros/cons を簡単にまとめた.機能的には決定的な差がないため,主に料金や実績の面で選定することとなる.
CDN | pros | cons |
---|---|---|
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) |
---|---|
KeyCDN | 0.040 |
CDN77 | 0.125 |
CloudFront | 0.140 |
Cachefly | 0.150 |
Fastly | 0.190 |
転送量 50 - 100 TB の場合
CDN | 料金 (USD / GB / month) |
---|---|
KeyCDN | 0.04 |
Cachefly | 0.08 |
CDN77 | 0.12 |
CloudFront | 0.12 |
Fastly | 0.14 |
HTTP メソッドのリクエスト料金
CDN | 料金 (USD / 10,000 req / month) |
---|---|
KeyCDN | 0 |
CDN77 | 0 |
Cachefly | 0.008 |
CloudFront | 0.009 |
Fastly | 0.009 |
CloudFront では HTTPS を用いると 0.012 USD となる.
ストレージ料金
基本的に CDN とは別に S3 のような形でオリジンを用意するため, CDN のストレージを用いることはない予定である.ただし CDN によってはログを蓄積するためにストレージが必要な場合もあるらしいので契約前に確認が必要である.