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 edge 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については、こちらにも書いてます。