[AWSJP.COM トップ]
[AWS CLI サンプルコード トップへ]





【AWS CLI サンプルコード】Windows環境で S3アップロード時に整合性を確認する

Powershell で AWS API を操作するサンプルコードの紹介です。Windows 環境を想定しています。




Windows 環境にて S3へファイルをアップロードする場合の整合性確認方法を紹介します。
大きなファイルをアップロードすると"Multi Upload"機能が自動で実行され場合によっては整合性の確認に失敗します。
これを避ける方法の一つにaws s3api put-object コマンドが存在します。

現時点ではPowershell の aws s3api put-object で大きなファイルアップロード時の整合性確認方法は簡単にはできないようです。(content-md5 を送信するオプションが見当たらない)

MD5を計算


ファイルのMD5を計算します。Get-FileHash コマンドレットを使用して、アップロードするファイルの MD5 を計算します。
(fciv.exe をダウンロードしてファイルのMD5を計算することも可能ですが、標準装備されているPowershellのコマンドを使うほうがよいと思われます。)

ただしこの時点では16進数の値となります。このまま送ると"An error occurred (InvalidDigest) when calling the PutObject operation: The Content-MD5 you specified was invalid."が発生します。

base64に変換


16進数の文字列(バイナリ)をbase64に変換します。標準関数は見当たりませんでした。

ヘッダーに設定して送信


最後にヘッダーに設定して送信します。


C:\>aws s3api put-object --bucket mybucketname --key test.txt --body c:\temp\test.txt --content-encoding base64 --content-md5 ********************************




以下はサンプルコードです。

$ErrorActionPreference ="Stop"

Set-Item env:tz -Value jst

try{
#元のファイル
$FileName = "c:\temp\test.txt"

#圧縮するファイル
$FileNameZiped = "c:\temp\test.zip"

$evsession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession

if(!(test-path $FileName))
{
Throw
}

#zipで圧縮。必須ではない。
Compress-Archive -Path $FileName -DestinationPath $FileNameZiped


$Hash = (Get-FileHash $FileNameZiped -Algorithm MD5).Hash.ToString()
$bytes = New-Object -TypeName byte[] -ArgumentList ($Hash.Length / 2)

for ($i = 0; $i -lt $Hash.Length; $i += 2)
{
$bytes[$i / 2] = [System.Convert]::ToByte($Hash.Substring($i, 2), 16)
}

$B64H = [System.Convert]::ToBase64String($bytes)

#mybucketname はS3に作成したバケットの名前。異なるリージョンのS3にもアップロード可能なためリージョン名は指定しない。ただし通信費用に注意。
aws s3api put-object --bucket mybucketname --key "test.zip" --body $FileNameZiped --content-md5 $B64H

}
catch
{
Write-Host "Error..."
Write-Host $error[0]
}









[AWS CLI サンプルコード トップへ]
[awsjp.com トップ]


本サイト内掲載されている情報は、著作権法により保護されています。いかなる場合でも権利者の許可なくコピー、配布することはできません。 Copyright(c) awsjp.com 2018-2019