条件の使用

条件は Varnish Configuration Language (VCL) を使用して、キャッシュサーバーへのリクエストの処理中に設定オブジェクトを適用するタイミングを定義します。条件に関する基本事項を理解したら、Fastly コントロールパネルを使用して条件を作成する方法と、その条件を使用するケースについて理解を深めるためにこのガイドをお役立てください。

条件設定へのアクセス

条件は、Fastly のコントロールパネルの2つのエリアに表示されます。

  • Manage conditions ページには、設定で使用可能なすべての条件が一覧表示されます。
  • 各設定オブジェクトに条件が直接追加されている場合について、それに付随する条件が表示されます。

Manage conditions ページの条件

Manage conditions ページでは、お客様のサービスで現在利用可能なすべての条件の概要が表示されます。どの条件が設定オブジェクトにマッピングされているかが一目で分かります。新しい条件を作成したり、既存の条件を検索することができます。

Manage conditions ページで条件を表示するには、以下の手順に従ってください。

  1. Fastly コンソールにログインしてください。

  2. Home ページから、適切なサービスを選択します。検索ボックスで ID、名称、ドメインによる検索が行えます。

  3. Edit configuration をクリックし、オプションを選択してアクティブバージョンをクローンします。

  4. Conditions をクリックします。 サービスのすべての条件が表示されます。

例えばこのサービスでは、利用可能なリクエスト条件が1件あります。

上記の例では、このリクエスト条件は現在、どの設定オブジェクトにも適用されていません (「Not applied to anything」と表示されています)。適用されている場合は以下のように表示されます。

設定オブジェクトに条件が直接追加されている場合

設定オブジェクトに条件が追加されていると、コントロールパネルでの表示が異なります。例えば、このリクエスト設定には条件が追加されていません。

Attach a condition をクリックして新しい条件を作成したり、既存の条件を追加すると、コントロールパネルの設定オブジェクトの表示が変わります。

デフォルトでは、設定オブジェクトに追加された条件に関する詳細の大部分が非表示になっています。Show details をクリックすると、これらの詳細を表示できます。展開した際に表示される詳細の内容は、条件の種類によって異なります。

正しく設定された条件の構成要素

条件には少数のパラメータのみが必要なので、非常にシンプルに見えます。具体的には以下が必要です。

  • 追加された条件を分類する Type パラメータ。条件管理ページで追加した場合、タイプは常に手動で選択できます。構成オブジェクトの Attach a condition リンクを介して追加された場合、そのタイプは可能な限り自動的に適用されます。
  • 人が読める形式の識別子を条件に提供する Name パラメータ。
  • 条件が True または False として解決するかどうかを決定するために VCL で実行する論理式を含む Apply if ステートメント。

条件に関する問題の多くは、Apply if パラメータで発生します。

基本的な論理式に対する一致の実行

条件を適切に設定することで、適用条件パラメータで指定した複雑な論理式に対して一致させることができます。例:

論理式一致する条件
client.ip == "127.0.0.1"お客様のサービスでリソースをリクエストしているクライアントの IP が 127.0.0.1。
req.http.host == "example.com"受信リクエストの Host ヘッダーが example.com。
req.method == "POST" && req.url ~ "^/api/articles/"リクエストが POST で、URL が /api/articles/ で始まっている。

上記の client.ip、req.http.host、req.method、req.url の条件は、いずれも VCL の設定変数を表しています。

演算子を使用した複雑な論理式で検索を実行する

また、クリエイティブな発想で、Fastly で使用されるもっと複雑な条件を作り、次のような Apply if パラメータを持たせることもできます。

req.http.host == "www.example.com" && (req.url !~ "/foo" && req.url !~ "/bar" && req.url !~ "^/baz")

この条件は、キャッシュサーバーに対して、ホストが www.example.com に一致し、URL が /foo、/bar、/baz に一致してはならないというものです。このタイプの条件は、複数の変数やオプションがあり、結果を微調整したい場合に使うことがあります。この例では、次の演算子を使って、foo、bar、baz を含む URL が不要であることを示しています。

演算子機能
( )式をグループ化し、変更を正規表現の一部に限定する
&&各式が true であることを確認する
!~指定された変数を含むすべての URL を除外する

条件追加の例

シナリオ: API リクエストの特定の部分を処理するオリジンサーバーを新たに追加したい場合。この API へのリクエストの一部は、お客様の API への他のリクエストとは異なる方法でキャッシュされなければならないため、特定のタイプのリクエストには特別なヘッダーを設定したいと考えています。具体的には、新しいオリジンサーバーが PUT、POST、DELETE リクエストをキャッシュして、各レスポンスで時間に依存したメタ情報を送り返さないようにします。そして最後に、これを行ったことによる効果を追跡したいと考えます。Fastly コントロールパネルで条件を使用してこれらすべてを実現するには、以下のステップを行います。

  1. 特別な API トラフィックを処理するためにオリジンサーバーを新規作成します。
  2. API リクエストの一部をそのオリジンサーバーにルーティングする方法をキャッシュに指示する新しい条件を作成します。
  3. オリジンサーバーが正しいレスポンスのみをキャッシュするように、新しいキャッシュ設定オブジェクトを作成します。
  4. キャッシュ設定オブジェクトを適用するタイミングを指定する新しい条件を作成します。
  5. 特定のタイプの API リクエストを追跡するために、新規ヘッダーを作成します。
  6. 新しいレスポンス条件を作成して、ヘッダーが特定タイプのリクエストにのみ設定されていることを確認します。
  7. 作業内容を確認します。

オリジンサーバーの新規作成

特別な API トラフィックを処理する新しいオリジンサーバーを作成するには、ホストの操作の手順に従ってください。Create a host フィールドに入力する際に、次のような API サーバーに関する具体的な情報を追加します。

  • Name フィールドに API サーバーの名前を入力します (例: Special API Server)。
  • Address フィールドに、API サーバーの IP アドレス (またはホスト名) を入力します。

リクエストに付与する条件を作成

特別な API トラフィックを処理する新しいオリジンサーバーを作成したら、リクエスト条件を作成して、リクエストをこのオリジンサーバーにどのようにルーティングするかをキャッシュに指示します。

  1. Hosts エリアで、先ほど作成したオリジンサーバーの名前の横にある Attach a condition をクリックします。
  2. 利用可能な条件を選択するか、Create a new request condition をクリックします。
  3. Create a new request condition フィールドを以下のように入力します。
    • Name フィールドに、新しい条件を説明する名前を入力します (例:Special API Request )。
    • Apply if フィールドに、適用される適切なリクエスト条件を入力します (例えば、req.url ~ "^/special/" は特別な API サーバーに関連するすべてのリクエストに対処することができます)。
  4. Save and apply to をクリックします。ホストの新しい条件が作成されます。

キャッシュ設定オブジェクトの作成

リクエストが、新しいオリジンサーバーに適切にルーティングされるようになりました。次に、キャッシュ設定オブジェクトを作成して、Fastly が PUT、POST、または DELETE リクエストからの応答をキャッシュしないようにします。この API は特有なもので、各レスポンスで時間に依存した追加のメタ情報を送り返します。

  1. Settings をクリックします。

  2. Cache Settings エリアで、Create cache setting をクリックします。
  3. Create cache setting フィールドに、以下のように入力します。
    • Name フィールドに、新しいキャッシュ設定の分かりやすい名前を入力します。
    • TTL (seconds) フィールドは、デフォルト値のままにしておきます。
    • Action メニューから Pass (do not cache) を選択します。
    • Stale TTL (seconds) フィールドはデフォルト値のままにしておきます。
  4. Create をクリックします。

キャッシュ設定オブジェクトの条件を作成適用する

キャッシュ設定オブジェクトを適用するタイミングを指定する新しい条件を作成します。

  1. Cache Settings エリアで、作成したキャッシュ設定の名前の横にある Attach a condition リンクをクリックします。
  2. Create a new cache condition をクリックします。
  3. 以下の要領で、Create a new cache condition ウィンドウの各フィールドに入力します。
    • Name フィールドに、新しい条件を説明する名前を入力します (例:Special API Origin Response )。
    • Apply if フィールドに、適用される適切なリクエスト条件を入力します (例: req.method ~ "PUT|POST|DELETE" && beresp.status == 200)。
  4. Save and apply to をクリックします。キャッシュ設定の新しい条件が作成されます。

新規ヘッダの作成

新しい API の効果を確実に把握するために、新しいヘッダーを作成し、特別な API リクエストが発生した際に、その情報を収集できるようにします。

  1. コンテンツをクリックします。

  2. Headers エリアで Create a header をクリックすると、新しいヘッダーが作成されます。
  3. 以下の要領で、Create header の各フィールドに入力します。
    • Name フィールドに、新しいヘッダーを説明する名前を入力します (例:Special API Set Header )。
    • Type メニューから Response を選択し、Action メニューから Set を選択します。
    • Destination フィールドに、アクションの影響を受けるヘッダーの名前を入力します (例:http.super )。
    • Source フィールドには、このヘッダーのコンテンツの元となるソースの説明を入力します (例: "Thanks for asking!")。
    • Ignore if set と Priority フィールドは、デフォルトの設定のままにしておきます。
  4. Create をクリックします。

新しいヘッダと条件の作成

ヘッダーが作成されたら、このヘッダーが特別なタイプのリクエストのみで設定されるように、関連する条件を作成します。

  1. Headers エリアで、作成したばかりの新しいヘッダーの名前の横にある Attach a condition をクリックします。

  2. 以下の要領で Create a new response condition ウィンドウの各フィールドに入力します。

    • Name フィールドに、新しい条件を説明する名前を入力します (例:Special API Response Condition )。
    • Apply if フィールドに、適用される適切なリクエスト条件を入力します (例: req.url ~ "^/special" && resp.status == 200)。
  3. Save and apply to をクリックします。ヘッダーの新しい条件が作成されます。

作業を確認する

設定を有効化する前に、生成された VCL を確認し、Fastly がオブジェクトと条件を実際の VCL に変換した方法を確認します。上の例では、リクエスト条件の VCL は次のように表示されます。

# Condition: Special API Request Prio: 10
if (req.url ~ "^/special/") {
set req.backend = F_Special_API_Server;
}
#end condition

キャッシュ設定と条件の VCL は次のように表示されます。

if (req.method ~ "PUT|POST|DELETE" && beresp.status == 200) {
set beresp.ttl = 0s;
set beresp.grace = 0s;
return(pass);
}

また、新しいヘッダーのレスポンス条件 VCL は次のように表示されます。

# Condition Special API Response Condition Prio: 10
if (req.url ~ "^/special" && resp.status == 200) {
# Header rewrite Special API Set Header: 10
set resp.http.super = "Thanks for asking!";
}

VCL の構文やプログラミングに慣れてきたら、生成された VCL を見て、設定が思った通りにできているかどうかを確認してみましょう (ほとんどの VCL は、変数が何を参照しているかさえ分かれば、とてもシンプルです)。