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-Cache
が Miss from cloudfront
となっており、オリジンから取得したことがわかります。
content-encoding
が br
なので、Brotliで圧縮されています。
2回目アクセス
X-Cache
が Hit From cloudfront
となっており、CloudFrontでCacheされているものが返ってきていることがわかります。
content-encoding
が br
なので、Brotliで圧縮されています。
まとめ
CloudFrontのCache policyで圧縮を有効にする際、公式ドキュメントでは「最小TTL値をゼロに設定すると、CloudFrontは圧縮されたコンテンツをキャッシュしない」と記載されていますが、実際の検証では最小TTLが0でも問題なく圧縮され、キャッシュも機能することが確認できました。
ただし、AWSのサービスは常にアップデートされているため、この記事の内容が将来的に変わる可能性もあります。重要な本番環境に適用する前には、最新のドキュメントを確認するか、テスト環境で検証することをお勧めします。
Discussion