🔍

CloudFrontのCache Policyで最小TTLが0でも圧縮・キャッシュは有効かを検証

に公開

CloudFrontのCache Policyで最小TTLが0でも圧縮・キャッシュは有効なのか?

AWS CloudFrontのCache policyを設定して圧縮を行う際の、TTLの設定に関する検証です。

背景:CloudFrontのキャッシュ設定オプション

CloudFrontでは、キャッシュの設定方法として以下の2つのオプションがあります。

  • Legacy cache settings(従来のキャッシュ設定)
  • Cache policy and origin request policy(キャッシュポリシーとオリジンリクエストポリシー)※推奨

今回検証するのは Cache policy and origin request policy を使った場合の「Cache policy」になります。

公式ドキュメントの気になる記述

AWSの公式ドキュメント「圧縮ファイルの配信」を確認したところ、以下の記載がありました。

オブジェクトを圧縮するように CloudFront を設定するには (コンソール)
1. CloudFront コンソールにサインインします。
2. ディストリビューションを選択し、編集する [動作] を選択します。
3. [オブジェクトを自動的に圧縮] 設定では、[はい] を選択します。
4. キャッシュポリシーを使用してキャッシュ設定を指定し、[Gzip] と [Brotli] の両方の圧縮形式を有効にします。
5. キャッシュポリシーの [TTL 設定] を 0 より大きい値に設定します。最小 TTL 値をゼロに設定すると、CloudFront は圧縮されたコンテンツをキャッシュしません。

元記事のキャプチャはこちら。

気になるのが、5番目の記述です。

最小 TTL 値をゼロに設定すると、CloudFront は圧縮されたコンテンツをキャッシュしません。

TTL設定について

CloudFrontのTTL(Time To Live)設定には以下の3種類があります。

設定項目 説明
最大TTL オリジンがCache-Controlヘッダーで長いキャッシュ期間を指定しても、この最大TTLが上限になる。
最小TTL オリジンがCache-Controlヘッダーで短いキャッシュ期間を指定しても、この最小TTLが下限になる。
デフォルトTTL オリジンがCache-ControlやExpiresヘッダーを指定しない場合、この値がキャッシュ期間になる。

疑問点

オリジンにCache-Controlの設定がない場合、デフォルトのTTLが使われ、最小TTLと最大TTLの設定はキャッシュ期間に影響しないと考えられます。
が、公式ドキュメントでは「最小TTLを0より大きくしないといけない」と書かれています。0ではダメなのでしょうか。

実際に検証してみます。

検証方法

AWS構成

CloudFlontが使えれば良いので、下記程度の構成です。
s3にはテスト用のファイルをアップロードしておきます。

Cache policy設定

  • 最小TTL: 0
  • デフォルトTTL: 60(1分)
  • 最大TTL: 60(1分)
  • 圧縮設定: GzipとBrotliを有効化

検証結果

結論から言うと、最小TTLが0でも問題なく圧縮され、キャッシュもされました

初回アクセス

X-CacheMiss from cloudfront となっており、オリジンから取得したことがわかります。
content-encodingbr なので、Brotliで圧縮されています。

2回目アクセス

X-CacheHit From cloudfront となっており、CloudFrontでCacheされているものが返ってきていることがわかります。
content-encodingbr なので、Brotliで圧縮されています。

まとめ

CloudFrontのCache policyで圧縮を有効にする際、公式ドキュメントでは「最小TTL値をゼロに設定すると、CloudFrontは圧縮されたコンテンツをキャッシュしない」と記載されていますが、実際の検証では最小TTLが0でも問題なく圧縮され、キャッシュも機能することが確認できました。

ただし、AWSのサービスは常にアップデートされているため、この記事の内容が将来的に変わる可能性もあります。重要な本番環境に適用する前には、最新のドキュメントを確認するか、テスト環境で検証することをお勧めします。

参考資料

DELTAテックブログ

Discussion