CloudFrontのキャッシュ時間(TTL)はどの程度なのか

117件のシェア(ちょっぴり話題の記事)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

よく訓練されたアップル信者、都元です。

CloudFrontはContents Delivary Network、所謂CDNですが、ざっくりと言ってしまえば、要するにキャッシュ機能を持ったHTTPリバースプロキシです。CloudFrontでは、元々のコンテンツ提供をするサーバのことをオリジンと呼びます。

CloudFrontでは、オリジンから提供されるコンテンツを、エッジサーバと呼ばれる世界各地に点在するコンテンツ配信専用のサーバ上にキャッシュすることによって、高い転送速度パフォーマンスを発揮しています。しかし、キャッシュというのはオリジン上のコンテンツの更新があった時に、内容が乖離してしまうという問題があります。

通常、CloudFrontは静的コンテンツ *1の配信に利用します。しかし、静的なコンテンツではあるのですが、定期的にファイルの差替えを行う、という可能性が無いわけではありません。

ところで、CloudFrontでは、MinimumTTLという値が設定できるようになっています。この値を0にすれば、CloudFrontはコンテンツをキャッシュしないように設定できないか…? と考えたのですが、その値はデフォルトで0です。そう、この値はあくまでもMinimumのTTLでしかありません。

CloudFrontでは、基本的にオリジンからのレスポンスにおけるCache-ControlExpiresヘッダを尊重するようになっています。しかしその設定を無視して、より長いキャッシュ期間を設定するのが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-ageCache-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-Controlno-cache, no-storeにする」という対処になるかと思います。カスタムオリジンの場合は、そのHTTPサーバによる設定をすればOKです。S3オリジンの場合は、以下のように、S3オブジェクトのプロパティから値を設定可能です。

2013-10-11_1028

脚注

  1. つまりリクエストに応じてその場で生成するのではなく、完成品のファイルがあらかじめ用意されており、時と場合によって内容が変化したりしないコンテンツ。