1. ホーム
  2. amazon-s3

[解決済み] 5GBを超えるファイルのAmazon-S3 Etagを計算するアルゴリズムは何ですか?

2023-06-06 08:34:27

質問

Amazon S3にアップロードされた5GB未満のファイルには、ファイルのMD5ハッシュをそのままETagとして付与しているので、ローカルのファイルとS3に置いたファイルが同じかどうかを簡単に確認することができます。

しかし、ファイルが5GBより大きい場合、AmazonはETagを異なる方法で計算します。

たとえば、私は 5,970,150,664 バイトのファイルを 380 個のパーツに分割してアップロードしました。今、S3 はそれが以下の ETag を持っていると示しています。 6bcf86bed8807b8e78f0fc6e0a53079d-380 . 私のローカルファイルには、MD5ハッシュが 702242d3703818ddefe6bf7da2bed757 . ダッシュの後の数字は、マルチパートアップロードのパート数だと思います。

また、新しい ETag (ダッシュの前) はまだ MD5 ハッシュですが、何らかの方法でマルチパートのアップロードから途中でいくつかのメタデータが含まれていると思われます。

Amazon S3 と同じアルゴリズムで ETag を計算する方法を知っている人はいますか?

どのように解決するのですか?

サーバーサイドの暗号化なしで 14MB のファイルをバケットにアップロードし、パートサイズが 5MB だとします。各パートに対応する 3 つの MD5 チェックサム、つまり、最初の 5MB、2 番目の 5MB、最後の 4MB のチェックサムを計算します。そして、それらを連結したチェックサムをとる。MD5 のチェックサムはバイナリデータの 16 進表現で出力されることが多いので、 ASCII や UTF-8 でエンコードされた連結ではなく、デコードされたバイナリ連結の MD5 を取得することを確認してください。それが終わったら、ハイフンとパーツの数を追加してETagを取得します。

以下は、Mac OS Xでコンソールから行うコマンドです。

$ dd bs=1m count=5 skip=0 if=someFile | md5 >>checksums.txt
5+0 records in
5+0 records out
5242880 bytes transferred in 0.019611 secs (267345449 bytes/sec)
$ dd bs=1m count=5 skip=5 if=someFile | md5 >>checksums.txt
5+0 records in
5+0 records out
5242880 bytes transferred in 0.019182 secs (273323380 bytes/sec)
$ dd bs=1m count=5 skip=10 if=someFile | md5 >>checksums.txt
2+1 records in
2+1 records out
2599812 bytes transferred in 0.011112 secs (233964895 bytes/sec)

この時点で、すべてのチェックサムは checksums.txt . これらを連結し、16進数をデコードして多くのMD5チェックサムを得るには、単に

$ xxd -r -p checksums.txt | md5

そして、3つのパーツがあったので、ETagを取得するために、"-3"を追加してください。

ノート

  • でアップロードした場合 aws-cli を経由して aws s3 cp を実行すると、チャンクサイズが8MBになる可能性が高いです。によると ドキュメントによると によると、これはデフォルトです。
  • バケツがサーバーサイド暗号化 (SSE) をオンにしている場合、ETag は MD5 チェックサムにはなりません ( API ドキュメント ). しかし、アップロードされたパーツが送信したものと一致するかどうかを確認するためだけなら Content-MD5 ヘッダと S3はあなたのためにそれを比較します .
  • md5 は、macOS ではチェックサムを書き出すだけですが md5sum はファイル名も出力します。これを除去する必要がありますが、チェックサムだけを出力するオプションがあるはずです。空白の原因について心配する必要はありません。 xxd はそれを無視するからです。

コードリンク