gzip 圧縮ファイルのトランス コーディング

このページでは、gzip ファイルの圧縮や解凍について説明します。このページには、Cloud Storage でのトランス コーディングの概要、関連するメタデータの操作に関するベスト プラクティス、および圧縮ファイルの動作が記載されています。

トランス コーディングと gzip

gzip は、データ圧縮の 1 つの形式で、主にファイルのサイズを縮小します。圧縮されていない場合よりも高速でファイルを転送でき、より小さいスペースでの保存が可能です。ファイルを圧縮するとコストと転送時間の両方を減らすことが可能です。Cloud Storage の「トランス コーディング」は、ファイルをリクエスト元に提供する前にファイルの圧縮を自動的に変更します。トランス コーディングの結果としてファイルが gzip 圧縮される場合、ファイルは「圧縮」と見なされ、これに対し結果のファイルが gzip 圧縮されなくなった場合、「解凍」と見なされます。Cloud Storage は、トランス コーディングの解凍形式をサポートします。

解凍トランス コーディング

ファイルが gzip 圧縮されたオブジェクトとして Cloud Storage に保存される場合、ファイルはリクエスト元に送信される前に自動的に解凍され、結果としてファイルが「ID エンコード」されます(つまり圧縮はされません)。これにより、Cloud Storage 内のオブジェクトの保存コストが削減されますが、リクエスト元にはファイル自体が圧縮されずに提供されます。これはお客様にファイルを提供する場合などに便利です。

解凍トランス コーディングを利用するには、オブジェクトが次の 2 つの条件を満たしている必要があります。

  1. ファイルが Cloud Storage への保存時に gzip 圧縮されている。

  2. 関連付けられているメタデータContent-Encoding: gzip が含まれている。

オブジェクトがこれらの 2 つの条件を満たす場合、リクエストされたときに解凍トランス コーディングが実行されます。この場合、Content-Encoding ヘッダーなしで提供されます。両方の条件を満たすオブジェクトを圧縮された状態で提供する必要がある場合は(たとえば、出力のコストまたは時間を減らすため)、次の 2 つの方法で解凍トランス コーディングが実行されないようにすることが可能です。

  • オブジェクトのリクエストに Accept-Encoding: gzip ヘッダーが含まれている場合、そのリクエストではオブジェクトはそのままの状態で提供され、Content-Encoding: gzip レスポンス ヘッダーが付けられます。

  • オブジェクトの Cache-Control メタデータ フィールドが no-transform に設定されている場合、Accept-Encoding リクエスト ヘッダーの有無にかかわらず、後続のすべてのリクエストでオブジェクトは圧縮されたオブジェクトとして提供されます。

Content-Type と Content-Encoding の比較

Content-TypeContent-Encoding がトランス コーディングに与える影響について知っておくべきいくつかの動作があります。どちらもメタデータであり、オブジェクトとともに保存されます。オブジェクトにメタデータを追加する方法については、オブジェクトのメタデータの表示と編集をご覧ください。

Content-Type は、アップロードするオブジェクトの種類を示すもので、すべてのアップロードに追加する必要があります。次に例を示します。

Content-Type: text/plain

これはアップロードされるオブジェクトがプレーン テキスト ファイルであることを示します。指定された Content-Type がアップロードされたオブジェクトの本来の性質と一致するとは限りませんが、種類を誤って指定すると、リクエスト元が予期しないものを受け取る場合があり、そのため意図しない動作が発生する可能性があります。

Content-Encoding はオプションです。必要に応じて、圧縮されるファイルのアップロードに追加できます。次に例を示します。

Content-Encoding: gzip

上記はアップロードされたオブジェクトが gzip 圧縮されていることを示します。Content-Type と同様に、指定された Content-Encoding がアップロードされたオブジェクトに実際に適用されるとは限りません。また、オブジェクトのエンコードを誤って指定すると、それ以降のダウンロード リクエストで意図しない動作が発生する場合があります。

推奨される方法

  • gzip 圧縮されたオブジェクトをアップロードする場合は、Content-TypeContent-Encoding の両方を指定するようにメタデータを設定することをおすすめします。たとえば、圧縮されたプレーン テキスト ファイルの場合は次のように指定します。

    Content-Type: text/plain
    Content-Encoding: gzip
    

    これにより、オブジェクトにアクセスするすべてのユーザーにオブジェクトの状態に関するほとんどの情報が提供されます。このようにすると、オブジェクトを後でダウンロードするときに解凍トランス コーディングできるようになり、クライアント アプリケーションが Content-Type のセマンティクスを正しく処理できるようになります。

  • または、圧縮を示すように Content-Type を設定し、Content-Encoding をまったく指定せずにオブジェクトをアップロードできます。次に例を示します。

    Content-Type: application/gzip
    

    ただし、この場合、オブジェクトに関してすぐにわかる情報は gzip 圧縮されていることだけで、基になるオブジェクト タイプに関する情報はありません。さらに、このオブジェクトでは解凍トランス コーディングを利用できません。

推奨されない方法

  • ファイルの圧縮特性の指定を省略して gzip 圧縮されたファイルをアップロードすることは可能ですが、このような方法は行わないようにする必要があります。たとえば、gzip 圧縮されたプレーンテキスト ファイルの場合、Content-Type: text/plain のみを指定することは避ける必要があります。そのようにすると、リクエスト元に配信されるときにオブジェクトの状態が誤って提示されます。

  • 同様に、Content-Encoding が含まれている場合でも、Content-Type が省略されたオブジェクトはアップロードしないようにする必要があります。そのようにした場合、Content-Type はデフォルト値に設定される場合がありますが、アップロードの実行方法によってはリクエストが拒否されることがあります。

誤った方法

  • オブジェクトの圧縮を冗長に報告するようなメタデータを設定しないようにする必要があります。

    Content-Type: application/gzip
    Content-Encoding: gzip
    

    これは、gzip 圧縮されたオブジェクトをもう一度 gzip 圧縮してアップロードすることを意味しますが、通常、このような操作は行いません(ファイルをあえて 2 回圧縮する場合は、後述の圧縮されたオブジェクトでの gzip の使用をご覧ください)。そのような誤って報告されたオブジェクトに対して解凍トランス コーディングを実行した場合、ID がエンコードされているオブジェクトが提供されますが、リクエスト元は依然として圧縮のレイヤが関連付けられたオブジェクトを受け取ったと考えます。オブジェクトを解凍しようとすると失敗します。

  • 同様に、gzip 圧縮されていないファイルを、Content-Encoding: gzip を設定してアップロードしないようにする必要があります。そのようにすると、オブジェクトでトランス コーディングを利用できるように見えますが、オブジェクトのリクエストを実行したときにトランス コーディングの試行が失敗します。

圧縮されたオブジェクトでの gzip の使用

gzip ファイルだけでなく、動画、音声、画像ファイルなどの一部のオブジェクトもすでに圧縮されています。そのようなオブジェクトに対して gzip を使用してもほとんどメリットはありません。ほとんどすべてのケースで、そのようにすると gzip のオーバーヘッドのためにオブジェクトが大きくなります。このため、圧縮されたコンテンツに対する gzip の使用は、一般的に推奨されず、望ましくない動作の原因になることがあります。

たとえば、Cloud Storage では、アップロードおよび保存されるオブジェクトを「二重に圧縮する」こと(つまり gzip 圧縮されるオブジェクトで基になる Content-Type 自体が圧縮されていること)は許可されますが、Cache-Control メタデータに no-transform が含まれている場合を除いて、二重に圧縮された状態でオブジェクトを提供することは許可されません。代わりに、外側の gzip レベル圧縮を削除し、Content-Encoding レスポンス ヘッダーを削除して、結果のオブジェクトを提供します。これは、Accept-Encoding: gzip を使用するリクエストでも発生します。

Range ヘッダーの使用

トランス コーディングの実行時に、オブジェクトのリクエストに Range ヘッダーが含まれている場合、そのヘッダーは自動的に無視されます。つまり、部分的なコンテンツのリクエストは処理されず、オブジェクト全体のレスポンスが返されます。たとえば、トランスコード可能な 10 GB のオブジェクトがあり、ヘッダー Range: bytes=0-10000 がリクエストに含まれる場合、そのまま 10 GB のオブジェクト全体が受信されます。

このような動作が発生するのは、最初にファイル全体を解凍しないと、圧縮されたファイルの特定の範囲を選択できないためです。ファイルの一部を対象とする各リクエストは、ファイル全体の解凍を伴います。ファイルのサイズは大きくなることもあり、その場合リソースの使用が非効率的になります。このため、トランス コーディングを使用する場合には Range ヘッダーを使用しないよう注意してください。このヘッダーを使用すると、リクエストした範囲だけでなくオブジェクト全体の転送料金が発生するためです。Range ヘッダーを使用するリクエストに対して許可されているレスポンスの動作については、仕様をご覧ください

Range ヘッダーを使用するリクエストが必要な場合は、リクエストされたオブジェクトに対してトランス コーディングを実行しないようにする必要があります。これは、オブジェクトをアップロードするときに適切なプロパティを選択することによって実現できます。たとえば、Content-Type: application/gzip が指定され、Content-Encoding が指定されていないオブジェクトに対する範囲リクエストはリクエストどおりに実行されます。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。