目次

目次

S3マルチパートアップロードのETagの値

アバター画像
小田英了
アバター画像
小田英了
最終更新日2018/02/16 投稿日2018/02/16

AWSCli で音源をS3に格納しました。 その際、ローカルのMD5値とS3のETag値を比較し確認をしましたが、一致しないケースが多数ありました。 どうにか確認できないかと調べてみました。

例) 音源ファイル :xxxxxx.3gp ETag値 :396321df76a1493be6856ef7180541de-2 MD5値 :7cdfe2bcd8652d4686dbc0e294997186

そもそもETag(エンティティタグ)とは…

HTTPのレスポンスヘッダの一つ。キャッシュの有効性確認に使われる値。 URLにあるリソースに何かしらの変化があればETagも新しい値となる。 生成方法は特に規定がない。 参考URL:RFC2616wiki

AmazonドキュメントのETag値の説明

S3の共通レスポンスヘッダーに説明ありました。 Common Response Headers

  • シングルパートアップロードはMD5値が入る。
  • マルチパートアップロードはMD5値が入らない。何が入るかの説明なし。。。

マルチパートアップロード時のETag値

AWS Discussion Forumsに記載がありました。計算式があります。 Again on ETAG and MD5 checksum for multipart

ETag = MD5(Sum(p \in numberParts, MD5(PartBytes(p))) + "-" + numberParts
  • 分割したファイルのMD5値を合算している
  • 合算した値の末尾に – 分割数 を追記している。

例) 396321df76a1493be6856ef7180541de-2
2ファイルでマルチパートアップロードされ、合算MD5値は 396321df76a1493be6856ef7180541de

S3の情報とETag計算値の確認

【S3の情報】

$ aws s3api head-object --bucket xxxxxxx --key xxxxxx.3gp
{
    "AcceptRanges": "bytes",
    "ContentType": "binary/octet-stream",
    "LastModified": "Wed, 16 Nov 2016 04:35:34 GMT",
    "ContentLength": 9723278,
    "ETag": "\"396321df76a1493be6856ef7180541de-2\"",
    "Metadata": {}
}

【ETag計算値】 検索すると上記式でETag値を計算するツールなどありましたので、音源 xxxxxx.3gp のETag計算値を出しました。 必要な情報はS3のアップロード時のmultipartのパラメタで、今回はAWSCliのデフォルト値のためどちらも8MBになります。

  • multipart_threshold (マルチパート閾値)
  • multipart_chunksize (分割単位)
$ s3etag -t 8388608 -s 8388608 xxxxxx.3gp
396321df76a1493be6856ef7180541de-2

S3情報と一致。計算が正しいことがわかりました。

わかったこと

  • マルチパートアップロードのETagの値計算は可能。
  • しかし計算にアップロード時の情報(分割ブロックサイズ)が必要。。。

そもそものETagの使い方とは異なるので推奨できないですが、条件がそろえばローカルファイルとS3ファイルの一致チェックに使えます。

アバター画像

小田英了

楽曲管理システムのサポートを担当しています。
趣味:ランニング めざせサブ3.5!

目次