AmazonS3におけるetagとmd5の関係をまとめてみた

AmazonS3で、オブジェクトののetagはコンテンツの同一性チェックに使えるのでしょうか?
もしそうであれば、手元にあるファイルとS3上のオブジェクトの内容比較が簡単に(再ダウンロードせずに)できるのではないかと思い、調べてみました。

結論

ETagはオブジェクトの内容のMD5ダイジェストであり、コンテンツの同一性チェックに使える。
ただし、マルチパートアップロードでアップロードしたオブジェクトは除く。

公式APIリファレンスによると
ETag
The entity tag is a hash of the object. The ETag only reflects changes to the contents of an object, not its metadata. The ETag is determined when an object is created. For objects created by the PUT Object operation and the POST Object operation, the ETag is a quoted, 32-digit hexadecimal string representing the MD5 digest of the object data. For other objects, the ETag may or may not be an MD5 digest of the object data. If the ETag is not an MD5 digest of the object data, it will contain one or more non-hexadecimal characters and/or will consist of less than 32 or more than 32 hexadecimal digits.

(意訳)

Etagはオブジェクトのハッシュです。Etagはオブジェクトのコンテンツの同一性を識別するものなので、メタデータの変更はEtagには反映されません。
Etagはオブジェクトが作成されたときに決まります。
PUTまたはPOSTオペレーションにより作成されたオブジェクトの場合、Etagはクォート付の32桁の16進数となり、これはオブジェクトデータのmd5ダイジェストを表しています。

そうでないオブジェクトの場合は、Eta値はオブジェクトデータのMD5値であるとは限りません。
EtagがオブジェクトデータのMD5値でない場合、Etagは16進数でない文字を含み、かつ(または)文字数が32桁でないことがあります。

「PUTまたはPOSTオペレーションでない場合」というのはマルチパートアップロードのことを指しているようです。

マルチパートアップロードで作成したオブジェクトのetag

試しに300MBの大きいファイルをマルチパートアップロードしてみたらEtagは下記のような値になっていました。
ハイフンが含まれており、34文字になっています。

"9763c3a4f086c398c77772eb1de96aca-5"

つまりこれはコンテンツのMD5ダイジェストではないということです。

オブジェクトのetagを取得する方法

オブジェクトのetagは、APIでいうとHead ObjectやList Objectsオペレーションで取得することができます。
従って、マルチパートでない単純なPUT/POSTメソッドで作成したオブジェクトに関しては、これらAPIを使うことで高速に中身チェックができますね。
カテゴリ:

人気記事