※2024年7月追記
S3のEタグ周りについては本記事を含んで下記の記事をシリーズとして投稿しています。
- EtagをつかってS3にアップロードしたファイルの整合性をたしかめてみる(マルチパートアップロードなし)
- EtagをつかってS3にアップロードしたファイルの整合性をたしかめてみる(マルチパートアップロードあり)
- AWSマネジメントコンソールからS3にマルチパートアップロードした時の分割サイズについて
- PowerShellでS3のEtagを計算してみる(暗号化なし&SSE-S3&マルチパートアップロード対応)
追記おしまい
マネジメントコンソールからS3に暗号化なし or SSE-S3でマルチパートアップロードした場合。
マルチパートアップロードにパートレベルのチェックサムを使用する
上記ドキュメントにある通り、分割したファイルごとにMD5を計算し、連結した値のMD5 と ファイルの分割数をEタグに格納します。
このため、マネジメントコンソールからアップロードされたファイルのEタグをローカルのファイルから計算する事がででき。
これを計算するためには分割サイズが必要となりますが、この分割サイズの値がAWSのドキュメントには記載をみつける事ができませんでした。
2023年9月現在、AWSドキュメントでマネジメントコンソールからマルチパートアップロードでアップロードするファイルに関する記述は下記となりますが、ここにはマネジメントコンソールからは16MBより大きいファイルは分割されると閾値についてだけしか記述がなく、分割されるファイルサイズについては記載がありません。
Content-MD5 と ETag を使用して、アップロードされたオブジェクトを検証する
オブジェクトが Multipart Upload または Part Copy オペレーションによって作成された場合、暗号化の方法に関係なく、オブジェクトの ETag は MD5 ダイジェストではありません。オブジェクトが 16 MB より大きい場合、AWS Management Console はそのオブジェクトをマルチパートアップロードとしてアップロードまたはコピーするため、ETag は MD5 ダイジェストではありません。
このためスクリプトを書いて、分割サイズを総当りで計算してみた所、マネジメントコンソールからアップロードしたファイルは下記のサイズで分割されている事がわかりました。
17179870 Byte
このマジックナンバーについてぐぐってみると、下記のように言及しているページがありました。
How many exact bytes does each S3 multi-part upload have
What is the algorithm to compute the Amazon-S3 Etag for a file larger than 5GB?
16 MiB は 16777216 Byte で 17 MiB は 17825792 Byteとなるため。
16 MiBよりは大きくて、17 MiBよりは小さい数字となっています。
何か意味がある数字なんでしょうが、由来については調べきれませんでした。
int32の最大値2147483647を125で割ると17179869.176
となって近い数字になったりするなとは思いつきますが。
それっぽい理屈が思いつきませんでした。
総評
マネジメントコンソールからアップロードする場合、17179870 Byte
でファイル分割される事がわかりましたが。
なぜ17179870 Byte
で分割してるのかはよくわかりませんでした。
が、この数字を使えばマネジメントコンソールから暗号化なし もしくは SSE-S3でファイルをマルチパートアップロードした場合については、Eタグについて計算することができます。
他の形式(SSE-C、SSE-KMS)についてはどのような計算方式かは公開されていない? ので計算はできません。
この場合は下記の機能を利用しましょう。