Google Cloud Platformにはエッジキャッシュの機能がある。
あんまりDocumentにも乗ってないので、今回はエッジキャッシュを紹介します。

エッジキャッシュの特徴

エッジキャッシュはGoogleが利用しているキャッシュサーバに、自分のGCP上のコンテンツも乗せることができる機能です。
GCPのキャッシュサーバは全世界にあるため、日本だけで無く、海外も視野に入れたサービスでも有効です。

特徴

  • すさまじいキャパシティ
  • とっても安価

キャッシュサーバの管理はGoogleで行ってくれる上に、すさまじいキャパシティを誇り、google.co.jpが落ちるぐらいのトラフィックが来ない限りは、問題ないとまで言われています。
料金も非常に安く、うまく使えば課金額を1桁減らしてくれます。

注意点

  • アクセス制御は使えない
  • キャッシュに乗っている時間はベストエフォート
  • キャッシュを明示的に消すことはできない

エッジキャッシュは、単純にキャッシュを返すだけで、ロジックを入れることはできません。そのため、アクセス制御はできません。
キャッシュの有効期限は設定できますが、その時間まで必ずキャッシュが生存している保証はありません。また、キャッシュを明示的に削除するAPIはありません。

使用感

きめ細やかなコントロールできないけど、安価でキャパシティがでかいのが、GCPのエッジキャッシュです。そのため、誤ったものがキャッシュされるのが怖い場合は、有効期限を数秒程度にしておくと良いでしょう。それでも、同時接続数が多ければ、かなりのトラフィックをキャッシュでさばいてくれます。

エッジキャッシュを利用できるサービス

エッジキャッシュは以下のサービスで利用可能です。

  • Google App Engine
  • Google Compute Engine
  • Google Cloud Storage

App Engineでエッジキャッシュを利用する

App Engineでエッジキャッシュを利用する方法は2つあります。

cache-control header

APIのReponseにcache-control headerを付けることで、Responseをエッジキャッシュに乗せることができます。

この機能を使えば動的生成されたResponseでもエッジキャッシュに乗せることができます。
QueryStringも含めたURLでキャッシュに乗るため、検索条件がQueryに乗っていても、まるごとキャッシュしてくれます。
QueryStringが異なればOriginalを取りに行くため、?time={epoch time}などにすれば、キャッシュを避けてOriginalを取りに行くこともできます。

protected Navigation run() throws Exception {
        response.setHeader("cache-control", "public, max-age=3");
        response.setContentType("text/plain");
        response.getWriter().println("hello eage cache!");
        response.flushBuffer();
        return null;
    }

static-files setting

AppEngineには元々エッジキャッシュ以外に、static resouceを乗せるstatic serverが存在します。
static serverに乗せるためには、appengine-web.xmlに設定を記入します。
この設定を入れると、static serverに乗るだけでなく、エッジキャッシュにも乗せてくれます。

appengine-web.xml
<static-files>
  <include path="/**.*"/>
</static-files>

上記の設定はexpiratinを指定していないので、defaultに従い10minになります。
値を変更したい場合は、expirationを指定します。

appengine-web.xml
<static-files>
  <include path="/**.png" expiration="4d 5h" />
</static-files>

細かい指定については、Documentを参照してください。

Compute Engineでエッジキャッシュを利用する

HTTP(S) LBCloud CDN を利用する

gcloud compute backend-services update [BACKEND_SERVICE_NAME] --enable-cdn

CloudStorageでエッジキャッシュを利用する

CloudStorageでpublicなobjectについては、defaultで3600secのCache-Controlが設定されるようになっている。
そのため、publicにしてさえいれば、特に何もしなくても、エッジキャッシュは利用される。
設定を変えたいのであれば、FileUpload時に、ResponseHeaderにCache-Controlを付けるように指定する。

例えば、以下の様に行う。

gsutil -h "Cache-Control: public,max-age=3" cp -r {your src} gs:{your bucket name}/{your dest}

以下でもエッジキャッシュについて、言及されているので参考にどうぞ。

静的ファイルの配信を Google Cloud Storage に移行しました

また、CloudStorageのACLについては、こちらにも書いてます。

この投稿は Google Cloud Platform Advent Calendar 201415日目の記事です。