日本時間 2014/11/27 の AM9時〜AM11時頃まで、全世界的に Amazon CloudFront に障害がありました。
CDNとして CloudFront を利用しつつ、障害時にはフェイルオーバーする方法をまとめました。
S3
CloudFrontのOriginがS3でない場合は、この項の設定は関係ありません。
CloudFrontのOriginとしてS3を使う場合、以下のようにします。
-
file.example.jp
のような、使いたいドメイン名で S3バケット を作る - Static Website Hosting を有効にしておく
ドメイン名のバケットで Static Website Hosting が有効になっていないと、後述の Route53 の Alias Target に設定できません。
Health Check
Route53 の Health Checks を利用します。
- Specify Endpoint By: Domain Name
- Domain Name: 利用しているCloudFrontのドメイン名 (
xxx.cloudfront.net
) - Path: 何らかの、存在するパス
としておきます。
パスは存在するのであればよいので、/index.html
でも /robots.txt
でも、好きなものを設定しておきましょう。死活監視用なので、あまりファイルサイズが大きくないものが適切かと思われます。
定期的に、上記で設定された CloudFrontのパス にHTTPリクエストが飛んできて、死活監視されます。
Route53
Route53 は Health Checks と連動して、DNSが返す内容を変えることができます。
例えば file.example.jp をCDNのドメイン名として使う場合、
Primary
- Name:
file.example.jp
- Type: Aレコード
- Alias: Yes
- Alias Target: 利用しているCloudFront (
xxx.cloudfront.net
) - Routing Policy: Failover
- Failover Record Type: Primary
- Evaluate Target Health: No
- Associate with Health Check: Yes
- Health Check to Associate: 前項で設定した Health Check
Secondary
- Name:
file.example.jp
- Type: Aレコード
- Alias: Yes
- Alias Target: 利用しているS3 (
file.example.jp.s3-website-ap-northeast-1.amazonaws.com
) - Routing Policy: Failover
- Failover Record Type: Secondary
- Evaluate Target Health: No
- Associate with Health Check: No
とします。
もし、OriginがS3でない場合は、Secondaryの内容を、Originに直接アクセスが行くようにIPなりELBなどを設定するだけです。
OriginがELBならば
- Alias: Yes
- Alias Target: Origin ELB (
xxx.ap-northeast-1.elb.amazonaws.com.
)
別のレコードセット(ドメイン)ならば
- Alias: Yes
- Alias Target: Origin Recode Set (
www.example.jp
)
IPアドレスならば
- Alias: No
- Value: xxx.xxx.xxx.xxx
使い方
前述の設定をしておくと、例として使ったドメイン名 file.example.jp
にアクセスしたときに、CloudFront が生きている間は CloudFront にアクセスするように、Route53 によって名前解決されます。
CloudFront が死んで、Health Check で設定した閾値を超えた場合、Secondary の S3(あるいは設定したOrigin) にアクセスするように名前解決されるように変わります。
注意点
CloudFront が死んだ場合、そのアクセスはフェイルオーバー先に切り替わります。もしそれが大量のアクセスであればフェイルオーバー先にかなりの負荷がかかることになります。
必要に応じて、フェイルオーバー先に別の CDN を利用したり、ELBであれば Auto Scaling を設定するなりしたほうがよいでしょう。