KeyCDN を CloudFront で冗長化してアカマイ級の信頼性を

2015年3月2日  カテゴリー:WEB クラウド  タグ: , , ,
Pocket
LINEで送る

KeyCDN は高性能かつ低コストで使えるCDN(コンテンツデリバリーネットワーク)です。以前「KeyCDN 設定メモと転送スピードの比較」の記事で紹介しました。 でもいざ本番で使うとなると CDN が単一障害点になるため少し不安が残るところではないでしょうか? そこで今回は KeyCDN を Amazon CloudFront で冗長化して、インターネットの巨人アカマイ級の信頼性を「目指してみよう」という試みをご紹介します。

下準備

以下のものが必用です。無料期間をうまく使えばお金をかけずに試すことができますね。

  • KeyCDNのアカウント(30日間お試し無料)
  • AWSのアカウント(登録から1年間は CloudFront の無料利用枠があります)
  • 独自ドメイン(Route 53で管理している必用があります)
  • オリジンサーバ(HTTPが動けばS3等なんでもかまいません)

独自ドメインは無料で取得することも可能です。もしよければ「Dot TK 無料ドメインを Amazon Route53 で管理する」の記事もご参照ください。

冗長構成図

KeyCDN の障害検知と CloudFront への切替は Amazon Route 53 のヘルスチェックと DNS フェイルオーバーという仕組みを使います。ヘルスチェックで障害を検知するとDNSが返す内容を変えることができます。

【通常時】
keycdn-cloudfront-01

【障害時】
keycdn-cloudfront-02

今回CDNに使う独自ドメイン名は「cdn.apar.jp」になります。ご自分のドメイン名に読替えてください。

ヘルスチェック用ファイルの配置

オリジンサーバにRoute 53のヘルスチェック用ファイルと動作確認用に適当なファイルをアップロードしておきます。

ヘルスチェック用:http://origin.apar.jp/route53-health-check.txt
動作確認用:http://origin.apar.jp/sample.png

ヘルスチェック用のファイルはRoute 53から常時アクセスされ KeyCDN の課金が発生しますので、できるだけ容量が少ないものが良いでしょう。ただし、0バイトのファイルは KeyCDN にキャッシュされませんので注意です。私は「1」と書いただけのテキストファイルにしました。

KeyCDN の設定

KeyCDN の管理画面にログインして「Zones」→「+New Zone」をクリックします。
keycdn-cloudfront-03

下記を入力/選択して「Save」をクリックします。Zoneの作成が開始し5分くらいで完了します。
keycdn-cloudfront-04

Zone Name・・・KeyCDN のドメイン名の一部になります。アルファベット小文字のみ使えます。
Zone Status・・・「active」を選択
Zone Type・・・・「pull」を選択
Origin URL (incl. http:// or https://)・・・オリジンサーバのURLを入力。

「URL」列に表示されているのが、KeyCDN のドメイン名です。Route 53の設定でこのドメイン名を使いますのでメモしておきます。
keycdn-cloudfront-05

メモ「origin-e61.kxcdn.com」

続いて「Zonealiases」→「+New Zonealias」をクリックします。
keycdn-cloudfront-07

「Alias」にCDNに使う独自ドメイン名、Zoneは先ほど作成したZoneを選択して「Add」をクリックします。
keycdn-cloudfront-06

以上で KeyCDN の設定は完了です。

Amazon CloudFront の設定

AWSのマネジメントコンソールから「CloudFront」を選択します。
cloudfront-01

「Create Distribution」をクリックします。
cloudfront-02

コンテンツの配信方法は「WEB」を選択します。
cloudfront-03

「Origin Domain Name」にオリジンサーバのドメイン名を入力します。
keycdn-cloudfront-08

下の方にスクロールして「Alternate Domain Names(CNAMEs)」にCDNに使う独自ドメイン名を入力して「Create DistriBution」をクリックします。
keycdn-cloudfront-09

10分くらいでStatusがDeployedになりディストリビューションの作成が完了します。
「Domein Name」列に表示されているのが、CloudFront のドメイン名です。Route 53の設定でこのドメイン名を使いますのでメモしておきます。
keycdn-cloudfront-10

メモ「d348mnwuilmt44.cloudfront.net」

以上で CloudFront の設定は完了です。

Amazon Route 53 の設定

ヘルスチェックの設定

AWSのマネジメントコンソールから「Route 53」を選択します。
keycdn-cloudfront-11

「Health Checks」をクリックします。
keycdn-cloudfront-12

「Create Health Checks」をクリックします。
keycdn-cloudfront-13

下記を入力/選択して「Create」をクリックします。
keycdn-cloudfront-14

Name・・・ヘルスチェックの名前です。分かりやすい名前をつけておきましょう。
Specify Endpoint By・・・「Domain Name」を選択します。
Domain Name・・・メモしておいた KeyCDN のドメイン名を入力します。
Path・・・オリジンサーバにアップロードしたヘルスチェック用のファイル名を入力します。
Failure Threshold・・・「1」を選択します。

以上でヘルスチェックが作成されました。5分くらいでStatusが「Healthy」になり、KeyCDN が正常に稼働していることが確認できます。
keycdn-cloudfront-15

ヘルスチェックが障害を検知した時に、通知メールを送信することもできます。設定方法は「Amazon CloudWatch で Route 53 ヘルスチェックのメール通知設定」をご参照ください。

KeyCDN の管理画面「Reporting」→「Real-time Logs」で確認すると、世界各地のRoute 53からKeyCDNのエッジサーバにアクセスされていることが分かります。Route 53 と KeyCDN のサーバが世界中に配置されていることが実感できますね。
keycdn-cloudfront-16

DNS フェイルオーバーの設定

今回の一番キモになる部分です。通常時は KeyCDN のドメインを返し、障害時は CloudFront のドメインを返すように設定します。

「Hosted Zones」をクリックします。
aws-route53-02-min

対象のドメイン名にチェックを入れ、「Go to Record Set」をクリックします。
aws-route53-03-min

「Create Record Set」をクリックします。
aws-route53-04-min

下記を入力/選択して「Create」をクリックします。
keycdn-cloudfront-17

Name・・・CDNに使う独自ドメイン名を入力します。
Type・・・CNAME
TTL・・・30(秒) 理論上はヘルスチェック間隔の30秒+TTLが切り替えに要する時間です。
Value・・・メモしておいた KeyCDN ドメイン名を入力します。末尾のドット「.」をお忘れなく。
Routing Policy・・・Failover
Failover Record Type・・・Primary
Set ID・・・<自動で設定されます>
Associate with Health Check・・・Yes
 ※警告が出ていますが問題ありません。ヘルスチェック先と登録しようとしているドメイン名が同じ場合はヘルスチェックが正しく動きませんよ。とのことです。
Health Check to Associate・・・先ほど作成したヘルスチェック名を選択します。

続いて切り替え先 CloudFront のドメイン名を返すレコードを登録します。下記を入力/選択して「Create」をクリックします。
keycdn-cloudfront-18

Name・・・CDNに使う独自ドメイン名を入力します。
Type・・・CNAME
TTL・・・30(秒)
Value・・・メモしておいた CloudFront のドメイン名を入力します。末尾のドット「.」をお忘れなく。
Routing Policy・・・Failover
Failover Record Type・・・Secondary
Set ID・・・<自動で設定されます>
Associate with Health Check・・・No

以上で設定完了です。続いて動作確認をしてみましょう。

動作確認

まずは動作確認用ファイルが KeyCDN から取得できることを確認します。

curl -I http://cdn.apar.jp/sample.png
------------------------------
HTTP/1.1 200 OK
Server: keycdn-engine ←KeyCDNから取得できています。
(略)
------------------------------

続いて、KeyCDN を無効にして取得先が CloudFront に切り替わることを確認します。

KeyCDN の管理画面から「Zones」→ 先ほど作成したゾーンの「Edit」を選択します。
keycdn-cloudfront-19

Zone Status を「inactive」(無効)に変更して「Save」をクリックすると5分くらいで KeyCDN からの配信が停止します。
keycdn-cloudfront-20

下の一行野郎(^^;)は10秒ごとに取得先のCDN名を表示します。赤字のURL部分を書き換えてくださいね。

while true; do echo '---'; date; curl -s -I http://cdn.apar.jp/sample.png | grep -e HTTP -e X-Cache -e Server; sleep 10; done
------------------------------
2015年 3月 2日 月曜日 05時09分38秒 JST
HTTP/1.1 200 OK
Server: keycdn-engine
X-Cache: HIT
---
2015年 3月 2日 月曜日 05時09分48秒 JST
HTTP/1.1 404 Not Found ← KeyCDN 配信停止
Server: keycdn-engine
---
(略)
---
2015年 3月 2日 月曜日 05時10分38秒 JST
HTTP/1.1 404 Not Found
Server: keycdn-engine
---
2015年 3月 2日 月曜日 05時10分48秒 JST
HTTP/1.1 200 OK
Server: Apache
X-Cache: Miss from cloud front ← CloudFrontに切り替え
---
2015年 3月 2日 月曜日 05時10分59秒 JST
HTTP/1.1 200 OK
Server: Apache
X-Cache: Hit from cloud front
------------------------------

計算通り ヘルスチェック間隔の30秒+TTL30秒 = 1分 で切り替わりました。

また、KeyCDN を「active」(有効)に変更すると取得先が KeyCDN に戻ります。
------------------------------
2015年 3月 2日 月曜日 05時18分46秒 JST
HTTP/1.1 200 OK
Server: Apache
X-Cache: Hit from cloud front
---
2015年 3月 2日 月曜日 05時18分56秒 JST
HTTP/1.1 200 OK
Server: keycdn-engine
X-Cache: HIT
------------------------------

終わりに

複数のCDNを組み合わせて冗長化するなんて事は数年前では考えられませんでしたが、こんな簡単に実現できてしまうのには正直おどろきました。ますます進化するクラウドサービスですが、情報収集を怠らないようにしたいと思います。

スポンサーリンク
Pocket
LINEで送る

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です