CloudFrontのキャッシュ時間(TTL)はどの程度なのか
よく訓練されたアップル信者、都元です。
CloudFrontはContents Delivary Network、所謂CDNですが、ざっくりと言ってしまえば、要するにキャッシュ機能を持ったHTTPリバースプロキシです。CloudFrontでは、元々のコンテンツ提供をするサーバのことをオリジンと呼びます。
CloudFrontでは、オリジンから提供されるコンテンツを、エッジサーバと呼ばれる世界各地に点在するコンテンツ配信専用のサーバ上にキャッシュすることによって、高い転送速度パフォーマンスを発揮しています。しかし、キャッシュというのはオリジン上のコンテンツの更新があった時に、内容が乖離してしまうという問題があります。
通常、CloudFrontは静的コンテンツ *1の配信に利用します。しかし、静的なコンテンツではあるのですが、定期的にファイルの差替えを行う、という可能性が無いわけではありません。
ところで、CloudFrontでは、MinimumTTLという値が設定できるようになっています。この値を0にすれば、CloudFrontはコンテンツをキャッシュしないように設定できないか…? と考えたのですが、その値はデフォルトで0です。そう、この値はあくまでもMinimumのTTLでしかありません。
CloudFrontでは、基本的にオリジンからのレスポンスにおけるCache-ControlやExpiresヘッダを尊重するようになっています。しかしその設定を無視して、より長いキャッシュ期間を設定するのがMinimumTTL機能の役割です。というわけで、オリジンが返すヘッダの値とMinimumTTLの値によって、CloudFrontがどの程度の期間キャッシュを持つのか整理したのが下の表です。
Minimum TTL = 0 (Default) | Minimum TTL > 0 | |
---|---|---|
Cache-Control max-ageがある場合 | max-ageの期間 | 「max-age」と「MinimumTTL」の何れか長い方 |
Cache-Control max-ageがない場合 | 24時間 | 「24時間」と「MinimumTTL」の何れか長い方 |
Cache-Control max-ageとCache-Control s-maxageの両方がある場合 | s-maxageの期間(ブラウザキャッシュとしてはmax-ageの期間) | 「s-maxage」と「MinimumTTL」の何れか長い方(ブラウザキャッシュとしてはmax-ageの期間) |
オリジンがExpiresを付与している場合 | Expiresが未来の場合、その期日まで。Expiresが過去の場合、キャッシュしない | Expiresが未来の場合、その期日まで、Expiresが過去の場合、MinimumTTLの期間 |
Cache-Control no-cache, no-storeがあり、かつ/またはprivateの場合 | キャッシュしない(ヘッダの指示を尊重) | MinimumTTLの期間 |
まぁ、このページの表そのまんまですが。
結局、「CloudFrontを経由するのだが、キャッシュをして欲しく無い」場合は、オリジンのレスポンスに「Expiresを過去の値にする」または「Cache-Controlをno-cache, no-storeにする」という対処になるかと思います。カスタムオリジンの場合は、そのHTTPサーバによる設定をすればOKです。S3オリジンの場合は、以下のように、S3オブジェクトのプロパティから値を設定可能です。
脚注
- つまりリクエストに応じてその場で生成するのではなく、完成品のファイルがあらかじめ用意されており、時と場合によって内容が変化したりしないコンテンツ。 ↩