FastlyのカスタムVCLを使ってみる


#1

FastlyとVCL(Varnish Configuration Language)

FastlyのCDNはVarnishと呼ばれるOpen Sourceのリバースプロキシソフトウェアを独自にカスタマイズしたソフトウェアを使って構築されているのですが、このVarnishの挙動をコントロールする設定言語をVCL(Varnish Configuration Language)と呼びます。

FastlyではGUIを通じて設定を作成する以外に、カスタムVCLと呼ばれる機能を使って編集したVCLを直接アップロードすることも可能です。

(実はFastlyのWebポータルのGUIを通じて設定された各種設定も、設定された内容に基づいてFastlyのプラットフォーム上でVCLが生成されています。)

カスタムVCLを利用するとポータルのGUIでは設定できないような柔軟な設定が可能になります。

この記事ではカスタムVCLを利用する手順と注意事項について説明します。

カスタムVCLのアップロード機能はデフォルトでは無効化されています。機能を有効化したい場合はsupport@fastly.comまでご利用のログインメールアドレス情報を添えてご連絡下さい

特に記載がない限り本記事の記載内容はデフォルト設定での挙動となります。
Fastlyの正式なサポート情報は以下のサイトでご確認下さい。
https://docs.fastly.com/
https://docs.fastly.com/ja/guides/vcl/mixing-and-matching-fastly-vcl-with-custom-vcl

カスタムVCL利用時の注意事項

カスタムVCLを利用するにあたってまず以下の点に注意して下さい。

Fallback(Default) TTL

Cache-ControlヘッダーなどでTTLが指定されていなかった場合に適用されるFallback TTLはGUI上で設定可能ですが、カスタムVCLを利用した場合はGUIで設定した値ではなくカスタムVCL内で指定した値が適用されます。
後述のboilerplate.vclの43行目のset beresp.ttl = 3600s;の箇所が該当します。

ボイラープレートの利用

カスタムVCLをアップロードする際には、ボイラープレートと呼ばれるVCLのテンプレートに必要な設定を追記し、追記した設定を含むボイラープレートVCL全体をアップロードする必要があります。

現在のボイラープレートは以下の通りですが、今後変更の可能性もあるので以下のサイトから最新版をダウンロードしてご利用下さい。
https://docs.fastly.com/guides/vcl/mixing-and-matching-fastly-vcl-with-custom-vcl

sub vcl_recv {
#FASTLY recv

  if (req.request != "HEAD" && req.request != "GET" && req.request != "FASTLYPURGE") {
    return(pass);
  }

  return(lookup);
}

sub vcl_fetch {
#FASTLY fetch

  if ((beresp.status == 500 || beresp.status == 503) && req.restarts < 1 && (req.request == "GET" || req.request == "HEAD")) {
    restart;
  }

  if (req.restarts > 0) {
    set beresp.http.Fastly-Restarts = req.restarts;
  }

  if (beresp.http.Set-Cookie) {
    set req.http.Fastly-Cachetype = "SETCOOKIE";
    return(pass);
  }

  if (beresp.http.Cache-Control ~ "private") {
    set req.http.Fastly-Cachetype = "PRIVATE";
    return(pass);
  }

  if (beresp.status == 500 || beresp.status == 503) {
    set req.http.Fastly-Cachetype = "ERROR";
    set beresp.ttl = 1s;
    set beresp.grace = 5s;
    return(deliver);
  }

  if (beresp.http.Expires || beresp.http.Surrogate-Control ~ "max-age" || beresp.http.Cache-Control ~ "(s-maxage|max-age)") {
    # keep the ttl here
  } else {
    # apply the default ttl
    set beresp.ttl = 3600s;
  }

  return(deliver);
}

sub vcl_hit {
#FASTLY hit

  if (!obj.cacheable) {
    return(pass);
  }
  return(deliver);
}

sub vcl_miss {
#FASTLY miss
  return(fetch);
}

sub vcl_deliver {
#FASTLY deliver
  return(deliver);
}

sub vcl_error {
#FASTLY error
}

sub vcl_pass {
#FASTLY pass
}

Fastly側のGUIで設定した各種設定はボイラープレート内の#FASTLY recv, #Fastly hitなどの箇所に挿入されて最終的なVCLが生成されます。ボイラープレートにコードを追記する際にはこの箇所を削除しないように注意して下さい。

例えばモバイルユーザーからリクエストの場合にヘッダーを付与するコードを追記してみます。

この場合処理はタイミングはユーザーのリクエストを受け付けたタイミングで行われるべきなのでvcl_recvの下にコードを以下のように追記します。

  sub vcl_recv {
  #FASTLY recv

  ### Added Special Header for mobile user ###
  if( req.http.User-Agent ~ "(Android|Applebot|BlackBerry|Googlebot-Mobile|IEMobile|iPhone|iPod|SymbianOS|Windows Phone)") {    
  set req.http.X-Mobile_Device = "true";  
  }

  if (req.request != "HEAD" && req.request != "GET" && req.request != "FASTLYPURGE") {
  return(pass);
  }

  return(lookup);
  }

このコードはHTTPリクエストのUser-Agentのヘッダーにモバイルを示す文字列が含まれる場合、リクエストにX-Mobile_device: trueヘッダーを追加する、という意味になります。

カスタムVCLのアップロード

それではカスタムVCLをアップロードしてみます。繰り返しになりますがアップロードするファイルは追記したコードを含むボイラープレート全体です。
vcl_recvを変更したからといってvcl_recvのみをアップロードしても正常に処理は行われませんので注意して下さい。

  1. FastlyのWebポータルにアクセスしてConfigureをクリックして下さい

  2. serviceから変更を行いたいServiceを選択して下さい

  3. Edit Configurationボタンをクリックして、Clone activeをクリックして下さい

  4. Custom VCL タブをクリックして下さい

  5. Create Your First VCLボタンをクリックして下さい。Upload new VCLファイルが表示されます
    image

  6. Nameフィールドに適当な名前を入れて下さい

  7. Upload fileをクリックし、ボイラープレートをベースに設定を追記したカスタムVCLファイルを選択して下さい

  8. Createボタンをクリックして下さい

UploadしたカスタムVCLファイルはView Source、Download、 Deleteすることが出来ます。

UploadしたカスタムVCLを含むServiceのバージョンをActivateすればカスタムVCLの適用は完了です。

完成したVCLの確認

カスタムVCLとFastly側で生成されたVCL両方を含むVCLは、サービスの設定画面に表示されているギアアイコンをクリックし、そこからShow VCLをクリックすることで確認することが出来ます。

その他の機能

以上がFastlyでカスタムVCLを利用する手順となります。まずは簡単な処理を追加してみて動作を確認し、少しずつ複雑な処理を追加していくのがよいと思います。

FastlyではカスタムVCLを複数のファイルに分けて記載したり、Fastlyサーバーから様々な情報を取得しつつ条件に基づいて処理を行ったりとより高度な処理を実施することも出来ます。

機能の詳細や注意事項についてはFastlyの公式サポートページをご参照下さい。
https://docs.fastly.com/