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

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

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

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

Cloud Storage では、Brotli 圧縮オブジェクトの解凍トランス コーディングはサポートされていません。

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

解凍トランス コーディングを使用すると、ファイルの圧縮バージョンを Cloud Storage に保存できます。保存時のストレージ コストを抑えながら、圧縮を行わずにファイル自体をリクエスト元に提供できます。これは、お客様にファイルを提供する場合などに便利です。

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

  1. ファイルが Cloud Storage への保存時に gzip 圧縮されている。
  2. オブジェクトのメタデータContent-Encoding: gzip が含まれている。

オブジェクトがこれらの 2 つの条件を満たす場合、提供時に解凍トランス コーディングが実行されます。オブジェクトを含むレスポンスに Content-Encoding または Content-Length ヘッダーが含まれません。

その他の条件下でオブジェクトの解凍トランス コーディングを抑止するには、次の 2 つの方法があります。

解凍トランス コーディングは、アウトバウンド データ転送のコストや時間を減らす場合や、ダウンロードしたオブジェクトに対して予想される crc32c/md5 チェックサムを検証する場合などに役立ちます。

考慮事項

解凍トランス コーディングを使用する場合は、次の点に注意してください。

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 の使用

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

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

Range ヘッダーの使用

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

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

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

次のステップ