はじめに
Amazon CloudFrontには「オブジェクトを自動的に圧縮する」という設定と、キャッシュポリシーに含まれる「圧縮サポート」という設定があります。
▶︎ AWS | オブジェクトを自動的に圧縮する
▶︎ AWS | キャッシュポリシーを理解する | 圧縮のサポート
この2つがどのように圧縮に関係しているのか気になったので、公式ドキュメントの確認と検証を行いました。
CloudFrontの圧縮設定は圧縮そのものを制御し、キャッシュポリシーの「圧縮サポート」はオリジンで圧縮されたコンテンツをキャッシュするかどうかを制御するように思えます。
そこで、実際にCloudFrontの動作を確認し、仮説を検証しました。
公式ドキュメントの確認
CloudFrontの公式ドキュメントを確認すると、「オブジェクトを自動的に圧縮する」を有効にしても、キャッシュポリシーの「圧縮サポート」にGzipやBrotliの両方を有効にしないと圧縮が適用されない可能性があることが分かりました。
また、TTL(Time To Live)のすべての設定を0より大きい値にする必要があることも分かりました。
詳細については、以下の公式ドキュメントを参照ください。
▶︎ AWS | オブジェクトを圧縮するように CloudFront を設定する
検証環境
以下の環境で検証しました。
- 構成:CloudFront → ALB → EC2(Nginx)
- 圧縮判定方法:HTTPレスポンスヘッダーの
Content-Encoding
の有無 - 検証の前提条件:
- TTLの全設定を0より大きくする
- HTMLの
Content-Length
が1000byte以上となるように拡張 - Nginxの圧縮を無効化
検証項目と結果
検証したいのは以下の項目である。
- 自動圧縮はキャッシュポリシーの「圧縮サポート」に関係なく機能するのか
- Gzip, Brotliの両方をサポートした場合に自動圧縮するのか?
- Gzipだけサポートした場合にGzipのみ自動圧縮するのか?
- TTLのすべての設定を0にしても(キャッシュを無効にしても)自動圧縮するのか?
メインの検証に入る前に、Nginxの圧縮が無効化されていることを確認する。
Nginxの圧縮が無効化されていることを確認
準備
- CloudFrontの「オブジェクトを自動的に圧縮する」→ 無効
- キャッシュポリシーの「圧縮サポート」→ Gzip, Brotliともに無効
検証結果
Gzipを要求しても圧縮されたコンテンツが応答されませんでした。

Brotliも同様でした。

結論
Nginxの圧縮は無効化されていることが分かりましたので、メインの検証に入ります。
自動圧縮はキャッシュポリシーの「圧縮サポート」に関係なく機能するのか?
前提
- CloudFrontの「オブジェクトを自動的に圧縮する」→ 有効
- キャッシュポリシーの「圧縮サポート」→ Gzip, Brotliともに無効
検証結果
Gzipを要求しても圧縮されたコンテンツが応答されませんでした。

Brotliも同様でした。

結論
キャッシュポリシーの「圧縮サポート」の影響を受け、CloudFrontの自動圧縮が機能しなかった。
Gzip, Brotliの両方をサポートした場合に自動圧縮するのか?
前提
- CloudFrontの「オブジェクトを自動的に圧縮する」→ 有効
- キャッシュポリシーの「圧縮サポート」→ Gzip, Brotliともに有効
検証結果
Gzipを要求したら圧縮されたコンテンツが応答されました。

Brotliも同様でした。

結論
キャッシュポリシーの「圧縮サポート」でGzip, Brotliの両方を有効にすると、CloudFrontの自動圧縮が機能した。
Gzipだけサポートした場合にGzipのみ自動圧縮するのか?
前提
- CloudFrontの「オブジェクトを自動的に圧縮する」→ 有効
- キャッシュポリシーの「圧縮サポート」→ Gzipのみ有効、Brotliは無効
検証結果
Gzipを要求したら圧縮されたコンテンツが応答されました。

Brotliを要求しても圧縮されたコンテンツが応答されませんでした。

結論
CloudFrontの自動圧縮は、キャッシュポリシーの「圧縮サポート」で指定した圧縮方式が適用された。
TTLの全設定を0にしても(キャッシュを無効にしても)自動圧縮するのか?
前提
- CloudFrontの「オブジェクトを自動的に圧縮する」→ 有効
- キャッシュポリシーの「圧縮サポート」→ Gzip, Brotliともに有効
- TTLのすべての設定を0にする(キャッシュ無効)
検証結果
キャッシュが無効なポリシーでは、圧縮サポートを有効にすることができなかった。
The parameter EnableAcceptEncodingGzip is invalid for policy with caching disabled.

まとめ
CloudFrontの自動圧縮を適切に活用するためには、キャッシュポリシーの設定が重要であることが分かりました。
- CloudFrontの自動圧縮はキャッシュポリシーの「圧縮サポート」の設定に依存する
- Gzip, Brotliの両方を有効にすれば、両方とも自動圧縮される
- 片方のみ有効にすれば、その圧縮方式のみ自動圧縮される
キャッシュを完全に無効化すると圧縮サポートを有効にできないため、CloudFrontの自動圧縮を機能させるにはキャッシュを有効にする必要がある
CloudFrontで最小・デフォルトTTLを0にし、最大を1以上に設定することで、CloudFrontの自動圧縮を機能させつつ、デフォルトでキャッシュを無効化できることが分かりました
また、CloudFrontの自動圧縮はキャッシュと密接に関連するため、圧縮とキャッシュの責務を分離したい場合は、オリジンで圧縮し、CloudFrontでキャッシュするのが良いと考えました。
まだ検証できていませんが、オリジン側の圧縮設定とは関係なくCloudFrontの自動圧縮を有効にし、オリジンで Cache-Control
を付与すれば、CloudFrontのキャッシュ制御を上書きできる可能性があります。
▶︎ Amazon CloudFront ( Cache Control 編 ) AWS Black Belt Online Seminar
適切な設定を行い、最適なパフォーマンスと構成を実現しましょう!
また、CloudFrontのキャッシュに関する記事も書いていますので、興味があればぜひご覧ください。
コメント