圧縮ファイルの供給 - Amazon CloudFront

圧縮ファイルの供給

CloudFront を使用すると、特定のタイプのファイルを自動的に圧縮して、ビューワーでサポートされていれば、その圧縮ファイルを提供できます (ビューワーは圧縮ファイルのサポートを Accept-Encoding HTTP ヘッダーで示します)。CloudFront は、Gzip および Brotli 圧縮形式を使用してファイルを圧縮できます。ビューワーが両方の形式をサポートしている場合、CloudFront では Brotli が使用されます。

注記

ウェブブラウザ Chrome および Firefox では、HTTPS を使用してリクエストを送信する場合のみ、Brotli 圧縮がサポートされます。これらのブラウザでは、HTTP リクエストで Brotli がサポートされません。

コンテンツを圧縮するとファイルが小さくなるため、ダウンロード時間を短縮できます。場合によっては、元のサイズの 4 分の 1 以下になることがあります。特に、JavaScript および CSS ファイルでは、ダウンロードが速くなると、ユーザーにウェブページが表示されるまでの時間が短縮されます。また、CloudFront のデータ転送コストは供給されたデータの総量に基づくため、圧縮ファイルを供給すると、非圧縮ファイルを供給するよりもコストが安くなる可能性があります。

カスタムオリジンを使用している場合は、ファイルが圧縮されるようにオリジンを設定できます。オリジンでは、CloudFront で圧縮されないファイルを圧縮できる場合があります (「CloudFront が圧縮するファイルタイプ」を参照)。オリジンが圧縮ファイルを CloudFront に返す場合、CloudFront はファイルが Content-Encoding ヘッダーの値に基づいて圧縮されていることを検出し、ファイルを再度圧縮することはありません。

圧縮コンテンツが供給されるように CloudFront を設定する場合は、圧縮オブジェクトのキャッシュも行う必要があります。

CloudFront ディストリビューションがコンテンツを圧縮するように設定する

コンテンツが圧縮されるようにディストリビューションを設定するには、次の操作を実行して、圧縮コンテンツを供給するキャッシュ動作を更新します。

  1. [オブジェクトを自動的に圧縮する] 設定が有効になっていることを確認します。(AWS CloudFormation または CloudFront API では、Compresstrue に設定します)。

  2. キャッシュポリシーを使用してキャッシュ設定を指定し、GzipBrotli の設定がどちらも有効になっていることを確認します。(AWS CloudFormation または CloudFront API では、EnableAcceptEncodingGzipEnableAcceptEncodingBrotlitrue に設定します)。

  3. キャッシュポリシーの TTL 値が 0 より大きい値に設定されていることを確認します。TTL 値をゼロに設定すると、キャッシュは無効になり、CloudFront によるコンテンツの圧縮は行われません。

キャッシュ動作を更新するには、次のいずれかのツールを使用できます。

CloudFront を使用してコンテンツを圧縮する

CloudFront は、Amazon S3 オリジンとカスタムオリジンの両方のファイルを圧縮することができます。コンテンツを圧縮するように CloudFront を設定した場合は、1 つまたは複数のキャッシュ動作で設定を指定します。

コンテンツを圧縮するように CloudFront を設定した場合、CloudFront では次のようにしてコンテンツが供給されます。

  1. CloudFront ディストリビューションを作成し更新して、コンテンツを圧縮するように CloudFront を設定します。詳細については、前述のトピックを参照してください。

  2. ビューワーがファイルをリクエストします。ビューワーにより Accept-Encoding HTTP ヘッダーがリクエストに含められます。ヘッダー値には gzipbr、またはその両方が含められれます。これは、ビューワーが圧縮コンテンツをサポートすることを示します。ビューワーが両方の形式をサポートしている場合、CloudFront では Brotli が使用されます。

    注記

    ウェブブラウザ Chrome および Firefox では、HTTPS を使用してリクエストを送信する場合のみ、Brotli 圧縮がサポートされます。これらのブラウザでは、HTTP リクエストで Brotli がサポートされません。

  3. エッジロケーションで、CloudFront はリクエストされたファイルの圧縮バージョンのキャッシュを確認します。

  4. 圧縮ファイルがキャッシュにすでに存在する場合、CloudFront はファイルをビューワーに返し残りのステップをスキップします。

  5. 圧縮ファイルがキャッシュにない場合、CloudFront はリクエストを Amazon S3 バケットまたはカスタムオリジンであるオリジンサーバーに送信します。

    注記

    CloudFront は、キャッシュにファイルの非圧縮バージョンがある場合、リクエストをオリジンに送信します。

  6. オリジンサーバーは、リクエストされたファイルの非圧縮バージョンを CloudFront に返します。

  7. CloudFront は、ファイルが圧縮可能であるかどうかを判別します。

    • ファイルは CloudFront が圧縮するタイプである必要があります。詳細については、「CloudFront が圧縮するファイルタイプ」を参照してください。

    • ファイルサイズは 1,000 ~ 10,000,000 バイトの間である必要があります。

    • 応答には Content-Length ヘッダーを含めて、ファイルのサイズが CloudFront の圧縮範囲に含まれるかどうかを CloudFront が判断できるようにする必要があります。Content-Length ヘッダーがない場合、CloudFront はファイルを圧縮しません。

    • レスポンスに Content-Encoding ヘッダーを含めることはできません。

  8. ファイルが圧縮可能な場合、CloudFront はそれを圧縮して圧縮ファイルをビューワーに返し、キャッシュに追加します。

  9. ビューワーがファイルを解凍します。

次の点に注意してください。

CloudFront が圧縮するファイルタイプ

CloudFront は、多数のファイル タイプのファイルを圧縮します。詳細な一覧については、「CloudFront が圧縮するファイルタイプ」を参照してください。

CloudFront が圧縮するファイルのサイズ

CloudFront は 1,000~10,000,000 バイトのサイズのファイルを圧縮します。

Content-Length ヘッダー

オリジンは、応答に Content-Length ヘッダーを含めて、ファイルのサイズが CloudFront の圧縮範囲に含まれるかどうかを CloudFront が判断できるようにする必要があります。Content-Length ヘッダーがない場合、CloudFront はファイルを圧縮しません。

ETag ヘッダー

オリジンからの圧縮されていないオブジェクトに有効な強い ETag HTTP ヘッダーが含まれている場合、CloudFront は強力な ETag ヘッダー値を弱い ETag に変換し、ビューワーに弱い ETag 値を返します。ビューワーは、弱い ETag 値を格納し、それを使用して If-None-Match HTTP ヘッダーで条件付きリクエストを送信できます。これにより、ビューワー、CloudFront、およびオリジンは、オブジェクトの圧縮バージョンと非圧縮バージョンを意味的に同等なものとして扱い、不要なデータ転送を減らすことができます。

有効な強い ETag ヘッダー値は、二重引用符 (") で始まります。強い ETag 値を弱い値に変換するために、CloudFront は強い ETag 値の先頭に文字 W/ を追加します。

オリジンからのオブジェクトに弱い ETag ヘッダー値 (文字 W/ で始まる値) が含まれている場合、CloudFront はこの値を変更せず、オリジンから受け取ったままビューワーに返します。

オリジンからのオブジェクトに無効な ETag ヘッダー値が含まれている場合 (値が " または W/ で始まらない)、CloudFront は ETag ヘッダーを削除し、ETag レスポンスヘッダーなしでオブジェクトをビューワーに返します。

詳細については、MDN ウェブドキュメントの以下のページを参照してください。

CloudFront がファイルを圧縮するように設定した場合、コンテンツはすでにエッジロケーションに存在する

オリジンからファイルを取得するときに、CloudFront は各エッジロケーションでファイルを圧縮します。コンテンツが圧縮されるように CloudFront を設定した場合、CloudFront では、すでにエッジロケーションにあるファイルは圧縮されません。さらに、エッジロケーションのファイルの期限が切れて CloudFront がファイルの別のリクエストをオリジンに転送した場合に、エッジロケーションにすでにファイルの最新バージョンがあることを意味する HTTP ステータスコード 304 がオリジンから返されると、CloudFront はファイルを圧縮しません。エッジロケーションですでにキャッシュされているファイルを CloudFront で圧縮するには、これらのファイルを無効化する必要があります。詳細については、「ファイルの無効化」を参照してください。

ファイルが圧縮されるようにオリジンがすでに設定されている

ファイルが圧縮されるように CloudFront を設定した場合に、オリジンでもファイルが圧縮される場合、ファイルがすでに圧縮されていることを示す Content-Encoding ヘッダーがオリジンに含まれます。CloudFront はビューワーにキャッシュされたファイルを返し、それをエッジロケーションにキャッシュします。

注記

レスポンスに Content-Encoding ヘッダーが含まれる場合、ヘッダーの値に関係なく CloudFront はファイルを圧縮しません。

リクエストに Accept-Encoding ヘッダーが含まれない

Accept-Encoding ヘッダーがビューワーにない場合、CloudFront は未圧縮のコンテンツを供給します。Accept-Encoding ヘッダーに追加の値 (deflate または sdch など) が含まれる場合、CloudFront はそれらを削除してからリクエストをオリジンサーバーに転送します。

リクエストで HTTP 1.0 が使用される

CloudFront へのリクエストで HTTP 1.0 を使用する場合、CloudFront では Accept-Encoding ヘッダーが削除され、非圧縮のコンテンツが供給されます。

CloudFront の使用率が高い

ごくまれに、CloudFront エッジロケーションの使用率が非常に高い場合、ファイルが圧縮されない場合があります。

CloudFront が圧縮するファイルタイプ

コンテンツを圧縮するように CloudFront を設定すると、CloudFront は Content-Type ヘッダーに次の値があるファイルを圧縮します。

  • application/dash+xml

  • application/eot

  • application/font

  • application/font-sfnt

  • application/javascript

  • application/json

  • application/opentype

  • application/otf

  • application/pkcs7-mime

  • application/protobuf

  • application/rss+xml

  • application/truetype

  • application/ttf

  • application/vnd.apple.mpegurl

  • application/vnd.ms-fontobject

  • application/xhtml+xml

  • application/xml

  • application/x-font-opentype

  • application/x-font-truetype

  • application/x-font-ttf

  • application/x-httpd-cgi

  • application/x-javascript

  • application/x-mpegurl

  • application/x-opentype

  • application/x-otf

  • application/x-perl

  • application/x-ttf

  • font/eot

  • font/opentype

  • font/otf

  • font/ttf

  • image/svg+xml

  • text/css

  • text/csv

  • text/html

  • text/javascript

  • text/js

  • text/plain

  • text/richtext

  • text/tab-separated-values

  • text/xml

  • text/x-component

  • text/x-java-source

  • text/x-script

  • vnd.apple.mpegurl