VCL スニペットについて

VCL スニペットは、VCL ロジックの短いブロックであり、サービス設定に直接含めることができます。カスタム VCL を必要とするような、複雑で特殊な設定がいらない場合に、コードの小さなセクションを追加するのに最適です。Fastly は、以下2種類の VCL スニペットをサポートしています。

レギュラー VCL スニペット

レギュラー VCL スニペット は、Fastly 設定のバージョンを作成すると生成されます。特定のサービスに属し、そのサービスの新しいバージョンをデプロイすると、スニペットに対して行った変更はすべてロックされて適用されます。レギュラースニペットは、削除されるまでサービスと共にデプロイ・クローンされるため、通常の Fastly オブジェクトと同様に扱うことができます。レギュラースニペットは、Fastly のコントロールパネルまたは API 経由で作成できます。

使用例: 位置情報を利用したリダイレクト。 例えば、お客様の会社が大規模なコンテンツパブリッシャーであると想定し、ユーザーのリクエストがどの国から来ているのかに応じて、出版物の異なるエディションにリダイレクトさせたいとします。また、Cookie に基づいて配信するエディションを上書きする機能が必要であるとします。

レギュラー VCL スニペットを使用すると、以下のように関連する VCL を持つオブジェクトを追加することができます。

if (req.http.Cookie:edition == "US" || client.geo.country_code == "US") {
set req.http.Edition = "US";
set req.backend = F_US;
} elseif (req.http.Cookie:edition == "Europe" || server.region ~ "^EU-" ) {
set req.http.Edition = "EU";
set req.backend = F_European;
} else {
set req.http.Edition = "INT";
set req.backend = F_International;
}

これにより、VCL で Edition ヘッダーが作成されますが、条件を設定してそれを上書きすることができます。Vary に Edition ヘッダーを追加し、他のバックエンドに false 条件 (例: !reg.url) を追加することで、正しいエディションが確実に提供されるようにすることができます (バックエンドが設定される前に VCL にスニペットが追加されることにご注意ください)。

動的 VCL スニペット

動的 VCL スニペット は、変更時にいつでも修正してデプロイすることができます。バージョンレスオブジェクトであるため (エッジのディクショナリACL と同様)、動的スニペットはサービスの変更とは別に変更することができます。そのため、本番環境に対応していないサービスバージョンをデプロイすることなく、スニペットコードを迅速に変更することができます。動的スニペットの作成は、API 経由でのみ可能です。

ユースケース: Web スクレイパーをブロックする。 例えば、お客様の Webサイトをスクレイピングしようとするユーザーをブロックするため、受信リクエストに対してパターンマッチングを実装したいとします。また、すべての受信リクエストをチェックして、受信 IP アドレス、ブラウザ、取得しようとしている URL を組み合わせてスクレイパーを特定できるルールセットを生成するシステムを開発したとします。さらに、システムが20分ごとにルールを更新するとします。

システムの更新中に、お客様の同僚が Fastly 設定の他の部分に変更を加えている場合、サービスの最新バージョンがテストされていない可能性があるため、システムが自動的に最新バージョンをデプロイすることは望ましくありません。その代わり、ルールをダイナミック VCL スニペットとして生成することができます。スニペットが更新されても、他のロジックはすべて現在デプロイされているバージョンと同じままで、ルールだけが変更されます。

VCL スニペットの制約事項

  • スニペットのサイズは、デフォルトで 1 MB に制限されています。制限よりも大きいスニペットを保存する必要がある場合は、サポートチームまでご連絡ください
  • スニペットは現在、Fastly のコントロールパネル経由で作成された条件をサポートしていません。ただし、スニペットコードにて if ステートメントを使用することは可能です。
  • 現在、スニペットをサービス間で共有することはできません。
  • スニペットはネストできません (例: スニペットを別のスニペットに含めることはできません)。