Amazon-CloudFront

CloudFrontでオリジン障害時にSorryページを表示したい

はじめに

こんにちは、ディーネットの山田です。

CloudFrontについて深掘りしたことがなく、そういやCloudFrontを使っているサイトで、オリジンとの接続ができなかった場合にSorryページって表示できたっけ?と思い調べてみました。

Amazon CloudFrontについて

一言で言えば、AWSが提供するCDN(Contents Delivery Network)サービスです。

CDNと言えば、Akamaiさん、Cloudflareさん、Jストリームさんが有名なのでパッと浮かびますが、そのCDNです。

といってもCDNがわからない方向けに説明すると、ウェブコンテンツの配信を高速化するものになります。

世界中にウェブコンテンツを配信するサーバが点在しており、如何にウェブコンテンツを利用するユーザーさんと近い地域から配信するかで、高速にお届けできるといったものになってます。

Amazon CloudFront は、ユーザーへの静的および動的なウェブコンテンツ (.html、.css、.js、イメージファイルなど) の配信を高速化するウェブサービスです。CloudFront では、エッジロケーションというデータセンターの世界的ネットワークを経由してコンテンツを配信します。CloudFront でサービスを提供しているコンテンツをユーザーがリクエストすると、リクエストはエッジロケーションにルーティングされ、レイテンシー (遅延時間) が最小になります。これにより、コンテンツは可能な限り最高のパフォーマンスで配信されます。

環境の構成図

AWS環境の構成としては、一般的によく用いられる以下の構成を作成いたしました。

インターネットからはCloudFrontが面しており、その配下にALB+EC2となっております。

万が一、CloudFrontとALB+EC2の間で通信ができなくなった場合にS3に設置しているSorryページを表示させる形となります。

やりたいこと

CloudFrontから通常ページのオリジンに接続がタイムアウトもしくは特定のステータスコードが返却された際に、S3に設置しているSorryページを訪問者に対して表示させる。

実際に設定していきます

前提として、環境の構成図にある環境はできあがっているものと仮定しております。

CloudFrontの設定のみご紹介します。

オリジン設定の内容について

オリジン設定では、Sorryページ保存先のS3と通常ページのALB設定が入っていることを確認します。

ALBのみだった場合は、S3をオリジンをする設定を追加してください。

ビヘイビア設定の内容について

ビヘイビア設定では、特定のパス配下はS3をオリジンとする設定を追加します。

今回の例では、”/sorry/”配下にアクセスがあった場合は、S3をオリジンとして使用する設定となります。

エラーページ設定の内容について

オリジンとビヘイビアの設定が行えたら、エラーページ設定を使ってオリジンとの接続タイムアウトやオリジン側で発生した、エラーコードを基にSorryページに遷移させる設定を追加します。
今回は、「500」、「502」、「503」、「504」のステータスコードの場合にエラーページを表示する設定を入れました。

ステータスコード 詳細 内容
500 Internal Server Error オリジンサーバ側で生じたエラーを指します。
一般的にはオリジンサーバ側のプログラムでエラーが発生した場合に使われます。
502 Bad Gateway 一時的にコンテンツが表示できない状態を指します。
一般的にはオリジンに通信したがWebサーバが起動していない場合に使われます。
503 Service Unavailable 提供しているWebサービスが利用不可の状態を指します。
一般的にはサイトメンテナンスのために意図的に使われていたり、レンタルサーバによっては同時アクセス数が超えているために使われたりします。
504 Gateway Timeout 一定期間応答が無かったエラーを指します。
一般的にはオリジンに通信したがWebサーバからの応答が一定期間無かった場合に使われます。

★ポイント★

オリジンと接続できなかった場合は、HTTPエラーコードが「504」で表現されます。
オリジンと接続できなかった場合に素早くSorryページへ遷移させたい場合は、以下を適切に調整する必要があります。

極端に短いとSorryページへの遷移が頻度高く発生してしまうので、適切な値は案件によってご調整ください。

  • オリジン接続の試行
  • オリジン接続タイムアウト

動作テスト

オリジン接続が正常だった場合

ALB+EC2に設置している通常ページが表示されました。

オリジン接続が異常だった場合

模擬的に、ALBのセキュリティグループでCloudFrontからのアクセスをできなくします。

(オリジン接続タイムアウト×オリジン接続の試行)秒、遅延したあと、S3に設置されているSorryページに遷移しました。

ちなみに、キャッシュ保持対象だった場合、オリジン障害とは無縁なのでオリジンとの接続ができなくなっていた場合でも、キャッシュが残っていればキャッシュから応答を返す形になります。

(このブログに記載しているビヘイビア設定だと、/cache/配下は3600秒キャッシュするので、1時間近くはオリジン障害と無縁になりますので、Sorryページに切り替えたい場合はキャッシュ削除することで、Sorryへの切り替えが可能になります)

気になった点

Route 53フェイルオーバールーティングは使わず、オリジン接続のエラーが一定以上(割合でも)だった場合に、全てのアクセスをSorryページに切り替えたい場合は、CloudWatchアラームとAWS Step Functionsを組み合わせて仕組みを作らないといけないのかな?

返信を残す

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

CAPTCHA