※2024年7月追記
S3のEタグ周りについては本記事を含んで下記の記事をシリーズとして投稿しています。
- EtagをつかってS3にアップロードしたファイルの整合性をたしかめてみる(マルチパートアップロードなし)
- EtagをつかってS3にアップロードしたファイルの整合性をたしかめてみる(マルチパートアップロードあり)
- AWSマネジメントコンソールからS3にマルチパートアップロードした時の分割サイズについて
- PowerShellでS3のEtagを計算してみる(暗号化なし&SSE-S3&マルチパートアップロード対応)
追記おしまい
EtagをつかってS3にアップロードしたファイルの整合性をたしかめてみる(マルチパートアップロードなし)
前編として上記記事を投稿しました。
本記事ではS3にアップロードしたファイルのEtagが、暗号化方式とマルチパートアップロードでどうなるか確認していきます。
ドキュメント
Content-MD5 と ETag を使用して、アップロードされたオブジェクトを検証する
検証に利用する環境
- Windows 10 21H2
- PowerShell 7.4.0-preview.4
- aws-cli/2.13.3 Python/3.11.4 Windows/10 exe/AMD64 prompt/off
aws-cliでマルチパートアップロードありでアップロードして確認してみる
前回の記事ではマルチパートアップロードを無効にしてアップロードするためaws s3 api put-object
を利用しました。
今回はマルチパートアップロードしたいので、aws s3 cp
コマンドを利用します。
今回、aws-cli
デフォルトの閾値8mbを利用しているため、10mbのtestfileをaws s3 cp
でアップロードするとマルチパートアップロードが有効となります。
# 前回の記事で下記コマンドで作成したtestfileを利用する
# fsutil file createnew .\testfile $(10mb)
# ファイルハッシュはF1C9645DBC14EFDDC7D8A322685F26EB
# SSE-S3でキーtestfile-sse-s3としてtestfileをアップロード
aws s3 cp ./testfile s3://<<バケット名>>/testfile-sse-s3-multipart --sse AES256
# SSE-KMSでキーtestfile-sse-kmdとしてtestfileをアップロード
aws s3 cp ./testfile s3://<<バケット名>>/testfile-sse-kms-multipart --sse aws:kms --sse-kms-key-id <<KMSキーID>>
# SSE-Cでキーtestfile-sse-cとしてtestfileをアップロード
# AESで利用する鍵を設定(32バイトの任意の文字列)
$key="7tkJjz;uqVMd@?yIg2<1i9lLsGFc=5AR"
aws s3 cp ./testfile s3://<<バケット名>>/testfile-sse-c-multipart --sse-c AES256 --sse-c-key $key
上記のようにaws-cli
でtestfileをそれぞれの暗号化方式でアップロードしました。
アップロードしたファイルのEtagを確認してみる
各オブジェクトのEtagをs3api head-object
で確認してみます。
aws s3api head-object --bucket <<バケット名>> --key testfile-sse-s3-multipart --query "ETag"
aws s3api head-object --bucket <<バケット名>> --key testfile-sse-kms-multipart --query "ETag"
# アップロード時に利用した鍵を利用
$key="7tkJjz;uqVMd@?yIg2<1i9lLsGFc=5AR"
aws s3api head-object --bucket <<バケット名>> --key testfile-sse-c-multipart --query "ETag" --sse-customer-algorithm AES256 --sse-customer-key $key
暗号化 | ファイル名 | Etag |
---|---|---|
sse-s3 | testfile-sse-s3-multipart | 669fdad9e309b552f1e9cf7b489c1f73-2 |
sse-kms | testfile-sse-kms-multipart | 2f7edf972e5e9ca78c2a49609b6e3e18-2 |
sse-c | testfile-sse-c-multipart | 3a5f6568c71a06c1dff16027afc6702e-2 |
今回、マルチパートアップロードしたため、ローカルファイルのMD5F1C9645DBC14EFDDC7D8A322685F26EB
と一致するファイルはありませんでした。
マルチパートアップロードした場合は、EtagがMD5にならない事が確認できました。
が、このままでは整合性の確認はできません。
マルチパートアップロードの場合どうするか
マルチパートアップロードにパートレベルのチェックサムを使用する
ドキュメントを確認してみるとマルチパートアップロードの場合は、分割されたファイルごとにMD5を計算し、これらを連結し、連結した値のMD5をEtagとして入力するようです。
この処理を再現してくれる機能はaws-cli
にはないようです。
ファイルを分割してそれぞれにMD5を計算して、連結して、連結した値のMD5を計算する処理を書く必要がありますが。
探してみた所、下記のようなbashで実装されたライブラリがありました。
こちらを利用して計算してみたところ下記のようになりました。
669fdad9e309b552f1e9cf7b489c1f73-2
こちらの値は、sse-s3
でアップロードしたEtagと一致しました。
総評
マルチアップロードの有無関係なく、Etagで整合性が確認できるのはsse-s3となるようです。
他の暗号化方式を利用している場合でファイルの整合性を確認したい場合は、追加のチェックサムを利用しましょう。