AWSCli で音源をS3に格納しました。
その際、ローカルのMD5値とS3のETag値を比較し確認をしましたが、一致しないケースが多数ありました。
どうにか確認できないかと調べてみました。
例)
音源ファイル :xxxxxx.3gp
ETag値 :396321df76a1493be6856ef7180541de-2
MD5値 :7cdfe2bcd8652d4686dbc0e294997186
そもそもETag(エンティティタグ)とは…
HTTPのレスポンスヘッダの一つ。キャッシュの有効性確認に使われる値。
URLにあるリソースに何かしらの変化があればETagも新しい値となる。生成方法は特に規定がない。
参考URL:RFC2616、wiki
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!
最近書いた記事
- 2018.06.18別アカウントが所有するS3へのアップロードそしてダウンロードを挑戦した結果
- 2018.02.16S3マルチパートアップロードのETagの値