ハッシュと ETag: ベスト プラクティス

Cloud Storage では、バケット間で送受信するデータの検証に CRC32c チェックサムまたは MD5 チェックサムを使用することをおすすめします。このセクションでは、これらの検証を実行するためのベスト プラクティスについて説明します。

整合性チェックでのハッシュの使用

Cloud へのアップロードや Cloud からのダウンロード中にデータが破損する可能性がある状況は、次のように多岐におよびます。

  • ノイズの多いネットワーク リンク
  • クライアントやサーバーのコンピュータ上のメモリエラーや、パスに沿ったルーター
  • ソフトウェアのバグ(たとえば、ユーザーが使用するライブラリにある)

データの破損を防ぐために、Cloud Storage では CRC32C と MD5 の 2 種類のハッシュ(以下で説明)をサポートしています。Google では、下記の検証セクションで説明されているようにすべてのケースで CRC32C を使用することをおすすめします。MD5 を使用するユーザーはそのハッシュを使用できますが、複合オブジェクトではそのハッシュはサポートされていません。

CRC32C

Cloud Storage のすべてのオブジェクトには CRC32 ハッシュがあります。CRC32C は、Castagnoli の多項式に基づいた 32 ビットの巡回冗長検査(CRC)です。この CRC は SCTP の IETF 仕様に定められています。CRC32c の計算用のライブラリには、Google の CRC32CBoost(C++)、crcmod(Python)、digest-crc(Ruby)が含まれています。Java の場合、GoogleCloudPlatform crc32c Java プロジェクトにアルゴリズムの実装があります。

Base64 でエンコードされた CRC32c のバイト順はビッグ エンディアンです。

MD5

Cloud Storage では、非複合オブジェクト用に MD5 ハッシュをサポートしています。このハッシュは、完全なオブジェクトにのみ適用されるため、範囲 GET の実行によって生じる部分ダウンロードの整合性チェックに使用することはできません。

ETag

オブジェクトの MD5 はこれまで ETag ヘッダーを使用して表現されていました。この動作は、XML API の非複合オブジェクトにおいて継続されますが、複合オブジェクトでは MD5 ハッシュをサポートしていないため、仕様のように、値は基になるオブジェクトが変化するたびに変化するということ以外、ETag 値について仮定することはできません。

認証

ダウンロードの整合性チェックは、ダウンロードしたデータをすばやくハッシュ化して結果をサーバーによって提供されたハッシュと比較することで実行できます。ハッシュ値が不適切なダウンロード済みのデータを破棄し、高コストになりがちな無限ループを回避するロジックを再試行します。

Cloud Storage では、アップロード用にサーバー側検証をサポートしていますが、クライアント側検証もよく使用される方法です。アップロードを開始する前にアプリケーションでオブジェクトの MD5 や CRC32c がすでに計算されている場合は、アップロード リクエストでそれを指定できます。指定したハッシュが計算された値と一致する場合にのみ、Cloud Storage でオブジェクトが作成されます。

また、新しいオブジェクトのメタデータのリクエストを発行して報告されたハッシュ値を比較し、不一致の場合はオブジェクトを削除することで、クライアント側検証を実行するよう選択することもできます。独立したプロセスで互いのデータが削除されたり、上書きされたりする競合状態を回避するために、オブジェクトの生成と前提条件を使用することもおすすめします。

オブジェクト作成を使用した並列アップロードの場合は、コンポーネントのアップロードごとに整合性チェックを実行してから、コンポーネントの前提条件をその作成リクエストとともに使用して、競合状態を回避します。オブジェクト作成では、サーバー側 MD5 検証が提供されないため、エンドツーエンドの整合性チェックを実行するユーザーは、クライアント側検証を新しい複合オブジェクトに適用する必要があります。

コピー オペレーションが終了したときに、gsutilcp コマンドと rsync コマンドにより、ローカル ファイルのチェックサムが Cloud Storage に保存されているオブジェクトのチェックサムに一致することが検証されます。一致しない場合は、無効なコピーが削除され、警告メッセージが出力されます。これが発生するのは非常にまれです。発生した場合は、オペレーションを再試行できます。

XML API

XML API では、Base64 でエンコードされた MD5 と CRC32c のハッシュは、x-goog-hash ヘッダーを介して露出され受け付けられます。これまで、MD5 はオブジェクトの ETag として使用されていましたが、オブジェクトの変更時に変更以外を保証しない不完全な ETag 値が複合オブジェクトで使用されるため、ETag としての使用の仮定を回避することをおすすめします。

サーバー側アップロード検証は、x-goog-hash リクエスト ヘッダーを使用してローカルで計算されたハッシュを入力することで実行できます。さらに、標準 HTTP の Content-MD5 ヘッダーを使用して MD5 を指定できます(仕様をご覧ください)。

JSON API

JSON API では、オブジェクト リソースmd5Hash プロパティと crc32c プロパティにそれぞれ、Base64 でエンコードされた MD5 のハッシュと CRC32c のハッシュが含まれています。どちらのメタデータ プロパティを指定するかはオプションです。オブジェクトの挿入でこれらのプロパティを指定しない場合には、Cloud Storage で値が計算され、オブジェクトのメタデータに書き込まれます。挿入クエストでどちらかのプロパティを指定すると、新しいオブジェクトに対してサーバー側検証がトリガーされます。Cloud Storage でどちらかのプロパティの値が計算され、その値が指定した値と一致しない場合、オブジェクトは作成されません。再開可能なマルチパート アップロードでは、1 つのオブジェクトを挿入する場合と同じ方法で md5Hash プロパティと crc32c プロパティを処理します。

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

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

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