Masahiko Kitamura

Failover(3) NetStorageを用いたSorryコンテンツの配信設定

Blog Post created by Masahiko Kitamura Employee on May 23, 2017

1. はじめに

 

前回までの記事ではオリジンサーバが異常動作・ダウンした時にアカマイのエッジサーバがFailover動作を発動するまでのプロセスを解説しました.今回は,Failover動作が発動された時に返す臨時コンテンツ(Sorryコンテンツ)の配信設定について解説していきます.まずFailover動作でサポートする動作方式を説明し,Sorryコンテンツの作成方法を見たあと,アカマイのNetStorageを用いてSorryコンテンツを返す設定方法を具体的に見ていきたいと思います.

 

 

2. Failover時の代替コンテンツ提供の方法

 

アカマイではFailover時のSorryコンテンツを返す方法として,以下の3つの方法が利用可能になっています.

 

  1. エッジサーバ上に有効期限切れのキャッシュが残っていれば,それを返す(Serve Stale Content)
  2. 別のURLにリダイレクトする(外部サイト)
  3. 代替オリジンサーバからSorryコンテンツを返す

 

1.に関しては,クライアントがアクセスしたエッジサーバ上に有効期限切れのキャッシュデータが残っていれば,それをクライアントに返すという動作になります.残っていなければ,オリジンサーバからのエラーレスポンスに基づいて,クライアントに適切なエラーレスポンスを返します.例えば,オリジンサーバがダウンしてタイムアウトを起こしている場合は,504 Gateway Timeoutを返します.

 

2.では,別のURL(外部のサイト)にリダイレクトします.よって,ブラウザ上のアドレスバーにはリダイレクト先URLが表示されることになります.リダイレクトの設定例はFailover(1)の記事にありますので参考にしてください.

 

3.では,エッジサーバ上でSorryコンテンツのリクエストを生成,代替オリジンへ送出し,その結果をクライアントに返します.これをアカマイではリクリエーション(Re-Creation)と呼びます.このリクリエーションではブラウザのアドレスバーにオリジナルリクエストのURLを表示したまま,Sorryコンテンツを提示することが可能になります.

 

以上が,Failover時のSorryコンテンツの提供方法になります.今回の記事では,最もよく使用される3.の方法について詳しく見ていきます.Sorryコンテンツを配信するための代替オリジンサーバとしてNetStorageを用いることにします.

 

 

3. Sorryコンテンツの用意

 

Sorryコンテンツを作成する際には,ベースページ(HTML)から参照されるコンテンツ(組み込みコンテンツ)を通常の配信設定と識別するためにディレクトリを分けておく必要があります.詳細は後述しますが,Failover時にエッジサーバに届くリクエストに対して,通常コンテンツへのリクエストなのか,Failover時のSorryコンテンツ用のリクエストなのかを識別する必要があるためです.

 

ここでは,例として"/sorrycontent/"をSorryページ向けの組み込みコンテンツを配置するディレクトリとして使用します. 今回はNetStorageからSorryコンテンツを配信するため,以下のようなディレクトリ構成でSorryコンテンツを準備しました.

 

sorry.htmlのコード例は下記の通りになります.特に,ページ内の組み込みコンテンツ(png, css, jsファイル)は"/sorrycontent/..."というように絶対パスで記述する必要があります.

<html>
  <head>
    <link rel="stylesheet" type="text/css" href="/sorrycontent/sorry.css">
    <script type="text/javascript"  src="/sorrycontent/sorry.js"></script>
  </head>
  <body>
    <h1>Sorry Page on NetStorage</h1>
    <img src="/sorrycontent/sorry.png">
  </body>
</html>

以上で,NetStorageからSorryコンテンツを配信する準備が整いました.

 

 

4. Luna上での設定

 

それでは実際にLuna Control Centerでの配信設定を説明していきます.細かい動作に関しては後述しますので,ここでは設定項目だけを簡潔に示すことにします.例として"site.myexample.com"というサイト配信に対してオリジンサーバがダウンした場合に上記で準備したSorryコンテンツをNetStorageから配信する場面を考えます.Luna上での配信設定のメイン画面の上部から見ていきます.

 

A. 配信ホスト名(プロパティホスト名)

上図の通り,配信ホスト名("site.myexample.com")に加えて,Failover用配信ホスト名("failoverns.myexample.com")を登録します.Failover用配信ホスト名はFailover発生時にアカマイエッジサーバ上のみで使用する名前になるため,DNSへのレコード登録や新たな証明書の取得は不要です.

 

B. Defaultルール

Defaultルールに関しては,通常の配信設定と同様になります.図中の設定項目およびその値は参考としてみてください. ここではキャッシュ設定をNo-Storeとしていますが,No-Store設定を用いずにキャッシュを許可する場は"Always revalidate with origin"を選択する必要があります(下図).

 

 

C. Site Failoverルール

ここではSite Failover配信設定の親ルールになります.このルールの下にFailoverに関するすべての設定を入れていきます.

 

C-1. Origin Health Detectionビヘイビア

Origin Health Detection(OHD)の設定をします.マッチ条件なしで設定しているので,すべてのリクエストに対して適用されます.OHDに関しては前回の記事を参照してください.

 

 

D. Failover Trigerルール

 

Failoverの条件とその時の動作を規定します.各項目について見ていきましょう.

 

D-1. マッチ条件

オリジンサーバからのレスポンスコードが500, 503, 504のいずれかであった場合,または,オリジンタイムアウトが発生した場合にFailoverが動作するように設定します.

 

D-2. Site Failoverビヘイビア

この設定により,Failover時にSorryコンテンツにアクセスするためのリクエスト("failoverns.myexample.com/sorry.html")を再生成します.この部分が先ほど説明したリクリエーションの設定になります.

 

 

E. Sorry Contentルール

Failover時にリクリエーションされたリクエストに対して,NetstorageからSorryコンテンツを配信する設定を行います.

 

E-1. マッチ条件

ホスト名が"failoverns.myexample.com"である,または,パスが"/sorrycontent/*"であるリクエストを条件にします.

 

E-2. Origin Serverビヘイビア

前節で準備したNetstorageをオリジンサーバとして使用します.

 

E-3. Site Failoverビヘイビア

代替オリジンサーバからエラーレスポンスが返ってきた場合にSiteFailoverの無限ループを回避するために設定します.

 

E-4. Origin Base Pathビヘイビア

Netstorage上のディレクトリ構成に合わせるために"/failoverpage/"をBase Pathとして設定します.

 

E-5. Caching ビヘイビア

Netstorageからコンテンツを配信するためキャッシュ時間を10分に設定します.

 

E-6. Cache HTTP Error Responsesビヘイビア

Netstorageからのレスポンスがエラー(4xx, 5xx)の場合にネガティブキャッシュする設定をします.

 

E-7. Cache Key Query Parameterビヘイビア

Netstorageを使用するのでキャッシュキーにクエリパラメータを含めない設定にします.

 

 

F. Sorry Base Pageルール

Sorryコンテンツのベースページ(HTML)に関して設定を行います.

 

F-1. マッチ条件

Sorryコンテンツのベースページ("/sorry.html")をマッチ条件にします.

 

F-2. Set Reponse Codeビヘイビア

Sorryコンテンツをステータスコード503で返すように設定します.

 

F-3. Downstream Cacheablityビヘイビア

Sorryコンテンツをクライアント側にキャッシュさせないように設定します.

 

 

以上がLuna上での配信設定になります.

 

 

5. Failover時の動作プロセス

 

続いて,オリジンサーバがダウンしている時の動作を追っていきましょう. まずは,クライアントであるブラウザがアクセスするところから始めます.

1. ブラウザで"http://site.myexample.com/jp/"にアクセスします.

 

2. アカマイエッジサーバがブラウザからのリクエストを受信し,(B) Default Ruleに基づいてオリジンサーバへリクエストを転送します.しかし,オリジンサーバがダウンしているため,タイムアウトが発生します(5xxのレスポンスが返る場合も同様です).

 

3. (D)Failover Trigerルールにおいて,(D-1)マッチ条件と(D-2)Site Failoverビヘイビアにより,リクエスト"failoverns.myexample.com/sorry.html"がリクリエーションされます.このリクリエーションは新しいリクエストがエッジサーバにに届くのと全く同様に扱われます.すなわち,通常のリクエストと同様に配信設定のDefaultルールから処理動作が評価・適用されていきます.

 

4. (E)Sorry Contentルールの(E-1)マッチ条件と(E-2)Origin Serverビヘイビア,(E-4)Origin Base Pathビヘイビアによって,NetStorageへ"failoverpage/sorry.html"リクエストを送出します.

 

5. NetStorageからsorry.htmlがステータスコード200で返ります.

 

6. (F)Sorry Base Pageルールの(F-1)マッチ条件と(F-2)Set Reponse Codeビヘイビアによって,sorry.htmlのコンテンツがステータスコード503でブラウザに返ります.さらに,(F-3)Downstream Cacheablityビヘイビアにより,ブラウザ上(および,ダウンストリームにあるプロキシサーバ上)にはSorry.htmlをキャッシュさせないようにCache-Controlヘッダが付与されます.

 

これで,ブラウザに対して,Sorryコンテンツのベースページ(HTML)が返されることになります.

 

7. 続いて,このSorryコンテンツ(sorry.html)の中には組み込みコンテンツが含まれているので,ブラウザは引き続きこれらのコンテンツをエッジサーバに対してリクエストします.

 

ただし,ブラウザ上では,"http://site.myexample.com/jp/"のコンテンツとしてSorry.htmlの内容が返っていることになりますので,続くリクエストもこのURLを起点にして生成されます.よって,ブラウザはエッジサーバに対して,

のリクエストを送信します.

 

8. エッジサーバ上において,これらのリクエストは(E)Sorry Contentルールのマッチ条件(Path is one of "/sorrycontent/*")に該当するため,このルール内のビヘイビアが適用され,ベースパスに"/faiover/"を加えた後,オリジンとしてNetstorageにリクエストを転送します.

 

この動作,すなわち,Sorryコンテンツに関連するリクエストをNetStorageオリジンに向けるために,"2. Sorryコンテンツの準備"で説明した通常コンテンツとfailoverコンテンツ分離のためのディレクトリ構成が必要になります.もし,この分離ができない場合,Sorryページの組み込みコンテンツのリクエストがあった場合に,これらをダウンしている通常のオリジンサーバに対してリクエストを転送することになり,結果としてSorryページ内の組み込みコンテンツがロードできないことになってしまいます.

 

9. オリジンサーバからはそれぞれのコンテンツがステータスコード200で返され,エッジサーバがそれをブラウザへ転送します.これらのコンテンツは(F)Sorry Base Pageルールにはマッチしないため,ベースページの時とはブラウザへのレスポンス動作が若干異なります.そして最終的に,ブラウザに組み込みコンテンツが読み込まれ,Sorryページ全体が表示されます.

 

以上が,ブラウザからリクエストが送信されてから,FailoverによってSorryコンテンツが表示されるまでのプロセスになります.

 

 

6. むすび

 

今回は,Failover時における代替コンテンツ提供方式,Sorryコンテンツの準備方法,および,NetStorageを用いたSorryコンテンツの配信設定について説明しました.次回はFailover設定のまとめとして,Netstorageを用いないFailoverの設定方法およびFailover設定のテスト方法について解説する予定です.

 

注意: LUNAの表示する言語をEnglishとしております。日本語の場合には表示されるメニュー名が翻訳されていることがあります。

Outcomes