Amazon S3にアップロードしたファイルの整合性を検証してみる(2020年版・Windows 10)

Amazon S3にデータを保存する際に、手元にあるファイルと保存されたオブジェクトの内容に相違がないか心配になることもあるかと思います。このnoteでは、保存されているオブジェクトのETagを比較して、整合性を検証してみました。

(恐らく、アップロードの際に自動的に破損がないか確認されていると思うのですが、いまいち確証が得られませんでした。詳しい方がいらっしゃいましたら教えて頂ければ幸いです!)

【A.容量の小さいファイルについて】

Amazon S3では、アップロードされたオブジェクトのETagに、MD5のハッシュ値が記録されます。容量の小さいファイル(アップロードする方法によりますが概ね16~64MB以下のファイル)であれば、次の方法で検証できます。

コマンドプロンプトに、次のコマンドを入力します。

certutil -hashfile (ファイル名) MD5

ファイルをコマンドプロンプトの画面にドラッグすると、ファイル名を入力できます。※一部環境では「MD5」を小文字で「md5」と入力すると動作しない場合がある様なのでご注意下さい。

求めたハッシュ値が、オブジェクトのETagの値と同一であれば、正常にアップロードできていると考えられます。

【B.容量の大きなファイルについて】

一方、容量の大きいファイルは、分割してアップロードされます(マルチパートアップロード)。マルチパートアップロードされたオブジェクトのETagには「各パートのMD5のハッシュ値の合計-パート数」という値が設定されます。各パートのサイズが分かっていれば、計算することが可能です。

ただし、S3 コンソールでアップロードすると、各パートのサイズが一定しない模様です。そこで、まず各パートのサイズを一定にする必要があります。

【B-1.S3コンソールでコピーする】

試してみたところ、アップロードしたオブジェクトに対してS3コンソールでコピー操作を行うと、各パートのサイズが16MBの状態でマルチパートアップロードされたのと同じ状態になる様です。同じ場所にコピーすることで上書き保存されます(警告画面などは表示されないのでご注意を)。

画像14
画像11
画像12
画像13

【B-2.AWS CLIでアップロードする】

または、公式のコマンドラインツールであるAWS CLIを使用すると、マルチパートアップロードの各パートのサイズを指定してアップロードすることができます。

まず、AmazonのWEBサイトからAWS CLIをダウンロードします。

画像1

画面の指示に従ってインストールします。

画像2

次に、AWSのサービスの一覧から「IAM」を選んでユーザーを追加します。

画像3

ユーザー名を入力して、「プログラムによるアクセス」にチェック。

画像4

アクセス権限を指定するためにグループを作成して、ユーザーを追加します。

画像5
画像6

確認画面で内容を確認したら、発行されるアクセスIDとシークレットアクセスキーを記録しておいて下さい。

画像7
画像8

コマンドプロンプトを起動して、AWS CLIが正常に起動するか確認します。

aws --version

正しくバージョンが表示されることを確認したら、初期設定を行います。

aws configure

順番に、アクセスキーID、シークレットアクセスキー、リージョンを入力します。リージョンの値はAWSコンソールの右上で確認できます。

画像9

次のコマンドを入力すると、S3のバケットの一覧が表示されます。

aws s3 ls

実際の操作画面です。

画像10

問題なく利用できることが確認できたら、S3関係のコマンドの初期設定を変更してみます。今回はマルチパートアップロードの各パートのサイズを16MBに設定します。リファレンスを確認して、次の様に入力しました。

aws configure set default.s3.multipart_chunksize 16MB

なお、変更した内容は設定ファイルから確認することができます。設定ファイルは次の場所にあります。

%UserProfile%\.aws\config
※拡張子のない「config」というファイル名のテキストファイルです

「%UserProfile%」は、Windowsのユーザー環境変数です。ユーザー名が「NAME」の場合、実際のパスは(初期設定では)「C:\Users\NAME\.aws\config」になります。

《configの内容》

[default]
region = us-east-1
s3 =
   multipart_chunksize = 16MB

それでは、実際にファイルをアップロードしてみます。次のコマンドでアップロードできます。ファイル名は、ファイルをコマンドプロンプトにドラッグすると簡単に入力できます。最後のオブジェクト名は省略できます。

aws s3 cp ファイル名 s3://バケット名/オブジェクト名

アップロードしたファイルのeTagは、次のコマンドで確認できます。

aws s3api head-object --bucket "バケット名" --key "オブジェクト名"

なお、5GBまでのファイルについては、次のコマンドで、分割せずにアップロードすることが可能です。

aws s3api put-object --bucket "バケット名" --key "オブジェクト名" --body "ファイル名"

以上です。

直接ストレージクラス「S3 Glacier Deep Archive」でアップロードする場合には、次のコマンドを実行します。

aws s3 cp s3://(バケット名)/(オブジェクト名) --storage-class DEEP_ARCHIVE

アップロードしてあるオブジェクトのストレージクラスを「S3 Glacier Deep Archive」に変更するには自身にコピーします。

aws s3 cp s3://(バケット名)/(オブジェクト名) s3://(バケット名)/(オブジェクト名) --storage-class DEEP_ARCHIVE

なお、Amazonの公式のドキュメントで、「--content-md5」オプションを利用すれば整合性を検証しながらアップロードできると説明されていたのですが、私の環境では上手く行えませんでした。(正確でない値を入力してもエラーが出ることなくアップロードされました)

【B-3.マルチパートアップロードのハッシュ値を求める】

各パートのMD5の合計を求めます。

今回は、こちらの@speaktechさまのPowerShellのスクリプトを利用させて頂きました。Archive-FileToS3.ps1をテキストエディタなどで保存します。

※今回はAWS Toolsのインストールやプロファイルの作成作業は不要です
※Archive-FileToS3.ps1の「$ChunkSize = 5」とある箇所を「$ChunkSize = 16」に変更して使用しています

PowerShellでスクリプトを実行する際に、「スクリプトの実行が無効になっている」というエラーが出る場合には、右クリックで管理者としてPowerShellを起動し、こちらのコマンドを実行して下さい。

 #スクリプトの実行を許可する 
Set-ExecutionPolicy RemoteSigned
 #元の設定に戻す 
Set-ExecutionPolicy Restricted

続けて実行すると、この様な形になります。

Set-ExecutionPolicy RemoteSigned
Y
Import-Module .\Archive-FileToS3.ps1
Get-S3ETagHash -Path .\ファイル名
Set-ExecutionPolicy Restricted
Y

実際の操作画面です。(見やすいように、入力した箇所に色を付け、求めたハッシュ値を赤枠で囲っています。)

画像15

これで、整合性を確認できました。


(2023年4月24日 追記)PowerShellは管理者権限で実行しなくても、Get-S3ETagHashのスクリプトを直接コピペすることで実行できます。また、セミコロン(;)で区切ることで、連続してハッシュ値を求めることができます。

Get-S3ETagHash -Path ファイル名1 ; Get-S3ETagHash -Path ファイル名2

同様に、コマンドプロンプトではアンド(&)で区切ることで、複数のコマンドを連続して実行できます。

aws s3 cp ファイル名1 s3://バケット名/オブジェクト名1 & aws s3 cp ファイル名2 s3://バケット名/オブジェクト名2 

~ 前回のお話 ~


この記事が気に入ったらサポートをしてみませんか?