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に乗るだけでなく、エッジキャッシュにも乗せてくれます。
<static-files>
<include path="/**.*"/>
</static-files>
上記の設定はexpiratinを指定していないので、defaultに従い10minになります。
値を変更したい場合は、expirationを指定します。
<static-files>
<include path="/**.png" expiration="4d 5h" />
</static-files>
細かい指定については、Documentを参照してください。
Compute Engineでエッジキャッシュを利用する
HTTP(S) LBとCloud 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については、こちらにも書いてます。