※2024年7月追記
S3のEタグ周りについては本記事を含んで下記の記事をシリーズとして投稿しています。
- EtagをつかってS3にアップロードしたファイルの整合性をたしかめてみる(マルチパートアップロードなし)
- EtagをつかってS3にアップロードしたファイルの整合性をたしかめてみる(マルチパートアップロードあり)
- AWSマネジメントコンソールからS3にマルチパートアップロードした時の分割サイズについて
- PowerShellでS3のEtagを計算してみる(暗号化なし&SSE-S3&マルチパートアップロード対応)
追記おしまい
ローカルからS3にアップロードしたファイルが正常にアップロードできているか確認したい場合、前提条件はつきますがエンティティタグ (Etag)
を利用すると確認できるので紹介します。
エンティティタグ (Etag)について
EtagはS3にアップロードしたファイルのオブジェクト概要にが表示されています。
このEtagについて下記ドキュメントに記載があります。
Content-MD5 と ETag を使用して、アップロードされたオブジェクトを検証する
S3ではアップロード時に追加チェックサムを利用してアップロードしたファイルの整合性を確認できますが。
このEtagに表示される値を利用してもアップロードしたファイルの整合性を確認できるとあり、本記事ではこちらを確認していきます。
Etagの値は暗号化とマルチパートアップロードの有無によってことなる
一覧にまとめると下記になります
種別 | Etagの値 |
---|---|
オブジェクトがプレーンテキスト | MD5 ダイジェスト |
オブジェクトがSSE-S3で暗号化 | MD5 ダイジェスト |
オブジェクトがSSE-Cで暗号化 | MD5 ダイジェスト ではない |
オブジェクトがSSE-KMSで暗号化 | MD5 ダイジェスト ではない |
暗号化の有無関係なくマルチパートアップロード | MD5 ダイジェスト ではない |
暗号化なし、もしくはSSE-S3
暗号のケースではEtagの値はMD5 ダイジェストとなり。
それ以外の暗号化方式(SSE-C,SSE-KMS)の場合はMD5 ダイジェストではない値になるようです。
またそもそもマルチパートアップロードした場合は暗号化方式によらずMD5 ダイジェストではない値になるようです。
このためローカルファイルのMD5を確認し、アップロードしたファイルのMD5が一致する事で整合性が確認できるのは暗号化なし か SSE-S3で暗号化したケースのみとなり、SS3-CとSSE-KMSで暗号化された場合はEtagでファイルの整合性を確認する事はできません。
本記事では、マルチパートアップロードをしないケースについて確認してみます。
ドキュメント
Content-MD5 と ETag を使用して、アップロードされたオブジェクトを検証する
Amazon S3 マネージドキーによるサーバー側の暗号化 (SSE-S3) の指定
AWS KMS (SSE−KMS) によるサーバー側の暗号化の指定
お客様が指定したキーによるサーバー側の暗号化 (SSE−C) の使用
検証に利用する環境
- 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-cli
ではマルチパートアップロードする閾値設定multipart_threshold
のデフォルト設定 8mbとなり、aws s3 cp
コマンドでは10mbのファイルをアップロードするとマルチパートアップロードされてしまうため、本記事ではaws s3api put-object
をつかってマルチパートアップロードしないようにアップロードしています。
また2023年7月現在ではs3バケットの暗号化設定がデフォルトになっており、暗号化なしは省いています。
# fsutilでファイル作成
fsutil file createnew .\testfile $(10mb)
# SSE-S3でキーtestfile-sse-s3としてtestfileをアップロード
aws s3api put-object --bucket <<バケット名>> --key testfile-sse-s3 --body ./testfile --server-side-encryption AES256
# SSE-KMSでキーtestfile-sse-kmdとしてtestfileをアップロード
aws s3api put-object --bucket <<バケット名>> --key testfile-sse-kms --body ./testfile --server-side-encryption aws:kms --ssekms-key-id <<KMSキーID>>
# SSE-Cでキーtestfile-sse-cとしてtestfileをアップロード
# AESで利用する鍵を設定(32バイトの任意の文字列)
$key="7tkJjz;uqVMd@?yIg2<1i9lLsGFc=5AR"
aws s3api put-object --bucket <<バケット名>> --key testfile-sse-c --body ./testfile --sse-customer-algorithm AES256 --sse-customer-key $key
アップロード時にそれぞれEtagが出力されるので確認してみます。
種別 | Etagの値 | 今回アップロードしたファイルの値 |
---|---|---|
SSE-S3を利用 | MD5 ダイジェスト | f1c9645dbc14efddc7d8a322685f26eb |
SSE-Cを利用 | MD5 ダイジェスト ではない | 3ea8628f5c993afe736bb2c944d31f06 |
SSE-KMSを利用 | MD5 ダイジェスト ではない | 90925a8ba3469e15cf0fa18809f11d3c |
ローカルファイルのMD5を確認してみる
今回アップロードした元ファイルtestfile
のMD5を確認してみます。
Get-FileHash
コマンドレットから取得できるため、こちらを実行します。
Get-FileHash .\testfile -algorithm MD5
Get-FileHash
コマンドレットで取得できた値は、 F1C9645DBC14EFDDC7D8A322685F26EB
となりました。
この値を比較してみるとSSE-S3
を利用してアップロードした場合のETag
の値と一致しました。
これでローカルファイルとアップロードされたファイルの整合性が確認できました。
他の暗号化方法についてはドキュメントにMD5ではないとだけ記載されており、MD5の値では無いことしかわからず、ETagで整合性を検証する事はできません。
総評
Etag
に入力されている値について、暗号化なし、 SSE-S3ではファイル整合性をたしかめるのに利用できます。
ただし他の暗号化やマルチアップロードで格納されると値が変わるため、利用ためには前提条件の確認が必要となります。