Amazon S3 と ローカルファイルのチェックサムの比較
2020-07-245 min read
目次
概要
Amazon S3 の Etagを使ってファイルの整合性チェックをする。
s3apiでEtagを取得
S3 APIを利用するとEtagを取得します。この値はmd5のハッシュ値になります。
$ aws s3api head-object --bucket hoge-bucket --key index.html
{
"AcceptRanges": "bytes",
"LastModified": "Sat, 11 Jul 2020 16:29:05 GMT",
"ContentLength": 54331,
"ETag": "\"177238eb55e3042bf9cbecf3ba5aaf35\"",
"ContentType": "text/html",
"Metadata": {}
}
検証
MD5の値は、md5コマンドであれば
$ md5 index.html
MD5 (index.html) = 177238eb55e3042bf9cbecf3ba5aaf35
opensslコマンドであれば
$ openssl md5 index.html
MD5(index.html)= 177238eb55e3042bf9cbecf3ba5aaf35
phpであれば
php > echo hash_file('md5', 'index.html');
177238eb55e3042bf9cbecf3ba5aaf35
php > echo md5_file('index.html');
177238eb55e3042bf9cbecf3ba5aaf35
マルチアップロード時の注意点
s3にマルチパートアップロードされた際のEtagの値は通常のmd5値と異なるようです。
What is the algorithm to compute the Amazon-S3 Etag for a file larger than 5GB?
phpで対応する場合の実装
function calculate_aws_etag($filename, $chunksize)
{
$chunkbytes = $chunksize*1024*1024;
if (filesize($filename) < $chunkbytes) {
return md5_file($filename);
} else {
$md5s = array();
$handle = fopen($filename, 'rb');
if ($handle === false) {
return false;
}
while (!feof($handle)) {
$buffer = fread($handle, $chunkbytes);
$md5s[] = md5($buffer);
unset($buffer);
}
fclose($handle);
$concat = '';
foreach ($md5s as $indx => $md5) {
$concat .= hex2bin($md5);
}
return md5($concat) .'-'. count($md5s);
}
}
$etag = calculate_aws_etag('path/to/myfile.ext', 8);
Recommends
New Posts
Hot posts!
Date
Tags
(110)
(54)
(54)
(47)
(45)
(36)
(30)
(29)
(24)
(24)
(22)
(21)
(21)
(20)
(19)
(17)
(16)
(16)
(15)
(14)
(12)
(12)
(12)
(12)
(12)
(12)
(11)
(10)
(10)
(10)
(10)
(10)
(9)
(9)
(8)
(8)
(8)
(8)
(7)
(7)
(6)
(6)
(6)
(6)
(6)
(5)
(5)
(5)
(5)
(4)
Author