LoginSignup
4
0

EtagをつかってS3にアップロードしたファイルの整合性をたしかめてみる(マルチパートアップロードなし)

Posted at

ローカルからS3にアップロードしたファイルが正常にアップロードできているか確認したい場合、前提条件はつきますがエンティティタグ (Etag)を利用すると確認できるので紹介します。

エンティティタグ (Etag)について

EtagはS3にアップロードしたファイルのオブジェクト概要にが表示されています。

image.png

この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でファイルの整合性を確認する事はできまません。

本記事では、マルチパートアップロードをしないケースについて確認してみます。

ドキュメント

put-object

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バケットの暗号化設定がデフォルトになっており、暗号化なしは省いています。

PowerShellでファイルを作成してアップロード
# 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

image.png

アップロード時にそれぞれEtagが出力されるので確認してみます。

種別 Etagの値 今回アップロードしたファイルの値
SSE-S3を利用 MD5 ダイジェスト f1c9645dbc14efddc7d8a322685f26eb
SSE-Cを利用 MD5 ダイジェスト ではない 3ea8628f5c993afe736bb2c944d31f06
SSE-KMSを利用 MD5 ダイジェスト ではない 90925a8ba3469e15cf0fa18809f11d3c

ローカルファイルのMD5を確認してみる

今回アップロードした元ファイルtestfileのMD5を確認してみます。

Get-FileHashコマンドレットから取得できるため、こちらを実行します。

Get-FileHash .\testfile -algorithm MD5

image.png

Get-FileHashコマンドレットで取得できた値は、 F1C9645DBC14EFDDC7D8A322685F26EBとなりました。

この値を比較してみるとSSE-S3を利用してアップロードした場合のETagの値と一致しました。

これでローカルファイルとアップロードされたファイルの整合性が確認できました。

他の暗号化方法についてはドキュメントにMD5ではないとだけ記載されており、MD5の値では無いことしかわからず、ETagで整合性を検証する事はできません。

総評

Etagに入力されている値について、暗号化なし、 SSE-S3ではファイル整合性をたしかめるのに利用できます。

ただし他の暗号化やマルチアップロードで格納されると値が変わるため、利用ためには前提条件の確認が必要となります。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0