Amazon CloudFront
開発者ガイド (API バージョン 2016-09-29)

圧縮ファイルの供給

ビューワーがリクエストヘッダーに Accept-Encoding: gzip を含めるようのリクエストした場合は、CloudFront が自動的に特定のタイプのファイルを圧縮し圧縮ファイルを供給するように設定できます。コンテンツが圧縮されるとファイルが小さくなるため、ダウンロード時間が短縮されます。—場合によっては、オリジナルの 4 分の 1 以下のサイズになることがあります。特に、JavaScript および CSS ファイルでは、ダウンロード時間が短縮されると、ユーザーにウェブページが表示されるまでの時間が短縮されます。また、CloudFront のデータ転送コストは供給されたデータの総量に基づくので、圧縮ファイルを供給すると、非圧縮ファイルを供給するよりもコストが安くなります。

重要

ビューワーのリクエストにはリクエストヘッダーに Accept-Encoding: gzip が含まれている必要があり、含まれていない場合 CloudFront はリクエストされたファイルを圧縮しません。

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

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

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

コンテンツを圧縮するように CloudFront を設定した場合に、CloudFront がコンテンツを供給する方法を示します。

  1. CloudFront ディストリビューションを作成し更新して、コンテンツを圧縮するように CloudFront を設定します。

  2. ビューワーがファイルをリクエストします。ビューワーはリクエストに Accept-Encoding: gzip ヘッダーを追加します。これは、ビューワーが圧縮コンテンツをサポートすることを示します。

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

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

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

    注記

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

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

  7. 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 ヘッダー

コンテンツを圧縮するように CloudFront を設定した場合、CloudFront は圧縮したファイルから ETag レスポンスヘッダーを削除します。ETag ヘッダーがある場合、CloudFront とオリジンはそれを使用して、CloudFront エッジキャッシュ内のファイルのバージョンがオリジンサーバーのファイルのバージョンと同じであるかどうかを判別できます。ただし、圧縮後は 2 つのバージョンが同じになることはありません。その結果、圧縮ファイルの期限が切れて CloudFront が別のリクエストをオリジンに転送するときに、オリジンは HTTP ステータスコード 304 (変更なし) を返す代わりに、常にファイルを CloudFront に返します。

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

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

カスタムオリジンが既にファイルを圧縮するように設定されている

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

注記

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

リクエストに Accept-Encoding: gzip は含まれません

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

CloudFront の使用率が高い

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

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

ウェブディストリビューションがコンテンツを圧縮するよう設定するには、次の方法の 1 つを使用して、圧縮されたコンテンツを配信するキャッシュ動作を更新します。

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

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

application/eot

application/x-otf

application/font

application/x-perl

application/font-sfnt

application/x-ttf

application/javascript

font/eot

application/json

font/ttf

application/opentype

font/otf

application/otf

font/opentype

application/pkcs7-mime

image/svg+xml

application/truetype

text/css

application/ttf

text/csv

application/vnd.ms-fontobject

text/html

application/xhtml+xml

text/javascript

application/xml

text/js

application/xml+rss

text/plain

application/x-font-opentype

text/richtext

application/x-font-truetype

text/tab-separated-values

application/x-font-ttf

text/xml

application/x-httpd-cgi

text/x-script

application/x-javascript

text/x-component

application/x-mpegurl

text/x-java-source

application/x-opentype

 

カスタムオリジンを使用してコンテンツを圧縮する

CloudFront は、gzip を使用していくつかのタイプのファイルを圧縮することができます (「CloudFront が圧縮するファイルタイプ」を参照)しかし、他のファイルタイプを圧縮したい場合、gzip (例: brotli) ではない圧縮アルゴリズムを使用したい場合は、お使いのサーバー上のファイルを圧縮し、CloudFront を使用してファイルを提供することができます。

CloudFront を使用して gzip ではない圧縮アルゴリズムでファイルを提供するには、Accept-Encoding ヘッダーに基づいて CloudFront をキャッシュに設定します。この操作を行うと、CloudFront は Accept-Encoding ヘッダーを変更せず、オリジンはビューワーに適切な圧縮ファイルを返すことができます。

オリジンが圧縮されたファイルを CloudFront に返す場合、ファイルが既に圧縮されていることを CloudFront に示す Content-Encoding ヘッダーが含まれます。その後、CloudFront は圧縮されたファイルをにビューワーに返します。

Amazon S3 オリジンを使用してコンテンツを圧縮する

Amazon S3 を使用してコンテンツを保存する場合、gzip 圧縮アルゴリズムを使用すると CloudFront を使用してコンテンツを圧縮できます。しかし、gzip の代わりに、または gzip に加えて、brotli のような他の圧縮アルゴリズムを使用することが必要になる場合があります。

ファイルを圧縮した後、次のようにして CloudFront でファイルを提供することができます。

  • Accept-Encoding ヘッダーに基づいてキャッシュするように CloudFront を設定します。

  • オリジンリクエストでトリガーする Lambda@Edge 関数を使用して、URI を変更して Accept-Encoding ヘッダーに基づいて、返す圧縮ファイルを指すようにます。

  • S3 に保存されているファイルに Content-Encoding メタデータを追加して、ビューワーが圧縮ファイルの形式を判断できるようにします。詳細については、Amazon Simple Storage Service コンソールユーザーガイド の「S3 オブジェクトにメタデータを追加する方法」を参照してください。

オリジンサーバーで IIS が実行されている場合の圧縮ファイルの供給

デフォルトでは、IIS は、CloudFront などのプロキシサーバー経由で送信されたリクエストに対して圧縮コンテンツを供給しません。IIS を使用しており、IIS が httpCompression 要素を使用してコンテンツを圧縮するように設定されている場合、noCompressionForProxies 属性の値を false に変更すると、IIS は圧縮コンテンツを CloudFront に返します。

さらに、数秒間隔よりも短い頻度でリクエストされるオブジェクトを圧縮した場合は、frequentHitThreshold および frequentHitTimePeriod の値を変更する必要がある場合があります。

詳細については、Microsoft のウェブサイトで IIS に関するドキュメントを参照してください。

オリジンサーバーで NGINX が実行されている場合の圧縮ファイルの供給

CloudFront がリクエストをオリジンサーバーに転送するとき、Via ヘッダーが含められます。これにより、NGINX は、リクエストがプロキシ処理されていると解釈します。デフォルトでは、NGINX は、プロキシ処理されたリクエストの圧縮を無効にしています。使用しているバージョンの NGINX に gzip_proxied 設定が含まれている場合は、値を any に変更して、NGINX が圧縮コンテンツを CloudFront に返すようにします。詳細については、NGINX のドキュメントの ngx_http_gzip_module モジュールに関する記述を参照してください。