S3バケットに対してファイルをアップロードしたり、S3からファイルをダウンロードする際に気になるのが、ファイルの同一性(データ整合性)。転送中にファイルが破損していないか、ハッシュ値を用いて確認することが一般的です。
S3ではどのようにして実現できるでしょうか。
AWS CLIでのアップロード
AWS CLIにはS3オブジェクトのデータ整合性を自動的にチェックを補助する機能が備わっています。
S3 APIではオブジェクトのアップロード時、S3 Put APIリクエスト時のヘッダにContent-MD5オプションでMD5ハッシュ値を渡すと、アップロード完了後にS3オブジェクトのハッシュ値と突合し、合わなければエラーを返してくれます。
AWS CLIを利用する場合にはContent-MD5が自動的に付与され、ファイル整合性のチェックも自動的に行ってくれます。また、aws s3とaws s3apiの両方で対応しているようです。
[参考] AWS CLI S3 FAQ
https://docs.aws.amazon.com/cli/latest/topic/s3-faq.html
また、AWS CLIではダウンロード時も自動的に整合性チェックをしてくれます。
ただし、マルチパートアップロードでアップロードされたオブジェクトは、ダウンロード時の自動チェックは働きません。
ETagとは
AWS CLI以外では、どのように整合性チェックができるでしょうか。
$ aws s3api get-object --bucket your-bucket-name --key test.txt localfile.txt
{
"AcceptRanges": "bytes",
"ContentType": "binary/octet-stream",
"LastModified": "Tue, 24 Apr 2018 06:58:49 GMT",
"ContentLength": 5,
"ETag": "\"d8e8fca2dc0f896fd7cb4cb0031ba249\"",
"Metadata": {}
}
ETagというキーが存在していることが分かると思います。これはS3オブジェクトに自動で付与されるメタデータで、オブジェクトのMD5ハッシュ値とイコールです。
$ openssl md5 test.txt
MD5(test.txt)= d8e8fca2dc0f896fd7cb4cb0031ba249
注意しなければならないのはマルチパートアップロードでアップロードされたオブジェクトのETag値は、オブジェクトのMD5値と異なる値となってしまう点です。AWS CLIの自動チェックが効かないのも、これが原因です。AWS CLIではダウンロード時にETag値とダウンロード完了したファイルのハッシュ値を比較して整合性チェックを行っているのです。
マルチパートアップロードされたオブジェクトの整合性チェック
オブジェクトをマルチパートアップロードした場合、ETag値を整合性チェックに利用することはできません。
アップロード時に明示的にオブジェクトにメタデータを付与し、そちらを利用することになります。
詳細は以下を参照ください。
[参考] AWS CLI を使用して、Amazon S3 にファイルをマルチパートメッセージとしてアップロードする方法を教えてください。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-multipart-upload-cli/