2016-06-16 41 views
1

Amazon S3にアップロードするファイルの整合性をチェックする方法は非常に混乱しています。私はStackOverflowのいくつかの質問を見ることができますが、私は今使っているAPIとはかなり違って見える古いAPIを使っているようですが、これはもう有効でないと思われるmd5を含むE-Tagを参照しています。 5GBを超えるファイルの場合Amazon S3の巨大なファイルの整合性

だから、基本的に、私はこのようなキャッチ/トライでMultipartUploaderを使用して、巨大なファイル(70ギガバイトを超えるそれらの一部)をアップロードするためにPHPを使用しています:

 try { 
      $result = $uploader->upload(); 
     } catch (MultipartUploadException $e) { 
      $uploader = new MultipartUploader($s3, $file, array(
       'state' => $e->getState() 
      )); 
     } 

私はこれらのようないくつかのエラーを取得:

An exception occurred while uploading parts to a multipart upload. The following parts had errors: - Part 7729: Error executing "UploadPart" on ... resulted in a 500 Internal Server Error response: InternalError We encountered an internal error. Pleas (truncated...) InternalError (server): We encountered an internal error. Please try again. - InternalError We encountered an internal error. Please try again.

Part 660: Error executing "UploadPart" on "..."; AWS HTTP error: cURL error 56: SSL read: error:00000000:lib(0):func(0):reason(0), errno 104 (see http://curl.haxx.se/libcurl/c/libcurl-errors.html) (server): 100 Continue -

Part 6542: Error executing "UploadPart" on "..."; AWS HTTP error: cURL error 52: Empty reply from server (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)

これらはすべて、現在の状態から再度アップロードしようとする「MultipartUploadException」のキャッチに分類されます。

しかし、私はまだアップロードされたファイルの完全性を心配しています。その確認方法を知りたいと思います。私はS3管理コンソールで見てみると、一つのファイルのプロパティは言う:

ETag: ba66d1235f954f28366ddc0a7efcb295-1609

しかし、私はローカルで「md5sumの」を行うとき、私は完全に異なる何かを得る:

fa693af7341c6c83e525ebc6b95422ea

これは、アップロードを意味していますファイルが壊れていますか?

アップロードしたファイルの整合性を確認する方法はありますか?

答えて

1

マルチパートのアップロードでは、各パートのmd5ハッシュのバイナリコード¹を結合し、そのmd5を実行し、結果を16進数で符号化し、次に-の後に部品の数を追加することによって、 。

アップロード部品のサイズがわかっている場合は、特定のファイルの正しいマルチパートエタグ値を計算できます。私は、この値をあらかじめ計算しておき、後で手動またはマシンの検証のためにx-amz-meta-expect-etagとして保存するs3マルチパートアップローダ(未リリース)を書きました。どこかで、私は事実の後にローカルファイルからこれを計算するスタンドアロンのユーティリティを持っているかもしれません。私はそれを探します。

あなたは慎重ではありますが、あなたの懸念事項はほとんど根拠がないかもしれません。

各パートをアップロードするときには、そのパーツのmd5ハッシュのbase64エンコードを含むContent-MD5ヘッダーを送信する必要があります。これが要求に含まれている場合、S3は意図的にその部分を受け入れることができません。これは、データが転送中に破損したとみなされるためです。

各パートは、アップロードされると、パートのmd5を含むそのパートのetagを含む応答を16進数で受け取ります。コードは、その値を検証する必要があります。

S3では、すべての部品が完了した時点でアップロードを完了するために「完了」リクエストを組み立てる必要があります。このリクエストでは、個々のパートのすべてのエタグを含めます。これは、アップロードの進行中にローカルで維持することになっています。 (リストのためにS3を調べる方法がありますが、これはクロスチェックのためのものであり、そのデータを使って実際に完全なmultipart-uploadリクエストを組み立てるべきではありません。要求は失敗し、オブジェクトはバケットに存在しません。

S3のマルチパートのアップロードは、データの整合性を保証する上で非常に優れています...間違ったものを作成して不完全なオブジェクトを作成しないように非常に努力しています。使用しているライブラリのコードを監査して、これらのことを確認する必要があります。もしそうなら、あなたはすばらしいはずです。このように書かれた内部システムの初期のバージョンでは、私は実際に確認するために各multipartアップロードの後に​​curl 'https://{pre-signed-url}' | md5sumを使用しました。これは数年前からこのように実行されており、文字通りは、マルチパートAPIによって提供されるセーフガードを使用して、S3サービス(SDKなし)に直接話すためにすべての書かれたコードを使用すると、


¹ md5ハッシュは128ビット値です。その "バイナリエンコーディング"(実際に "エンコードされていない"、 "生の"だけではないため、正確な用語ではありません)は16バイトの値です。各バイトに0〜255の範囲の値が入ります。 md5ハッシュのバイトが単純に文字列としてキャストされた場合、多くのバイトは印刷不可能な文字になります...したがって、共通の表現は16進数で32バイト(128&4) 0〜9、af)。各16進文字は4ビットしかエンコードしないため、base64(文字0-9A-Za-z +/=)では多少あまり一般的ではないため、24バイト(128÷各文字が6ビットをエンコードするので、出力の4の次の倍数)。 32バイトの16進エンコーディングを連結しない場合、各パートのmd5の生のバイナリバージョンが必要です。それぞれのバイナリバージョンは16バイトです。

+0

こんにちは。ご回答どうもありがとうございました。ファイル全体に対して完全なMD5の合計を提供していないことは残念です。私のファイルを分割してそれぞれのMD5の合計を計算するのは残念です...しかし、私はMD5を計算した最大のファイルのうち2つをダウンロードしました。非常に親切に感謝し、返信にお時間をいただきありがとうございます。 – Nuno

+0

チェックサムの作成はCPUを大量に消費します。 20 GBのビデオファイルのチェックサムを計算しようとすると、私の言うことがわかります。 –

0

S3にアップロードするとき、コピーの忠実性(完璧な転送)を保証する唯一の方法は、チェックサムを使用することです。これを管理しやすくするため、AWSではファイルを分割してチェックサムを計算し、そのチェックサムを署名の一部として「Content-Md5」ヘッダーに送信することができます。

あなたがS3に投稿する内容が間違いなく保存されていると仮定できるとは限りません。

AWS PUT APIリクエストが500またはその他のエラーを返すことはまれではありません。これは文書化されており、AWSがそのような場合に再試行する必要がある理由の1つです。

AWS S3のマルチパートアップロードの大きな利点は、主にコピー忠実度、エラー回復時(ファイル全体ではなく、その部分を再試行するだけです)、非常に太いパイプがある場合は、スループットを向上させるためのアップロード。

ブラウザ用のAWS JavaScript SDKは、テキストMIMEタイプ(ビデオ、画像、音楽のようなバイナリなし)のマルチパートアップロードでチェックサムをサポートしていないため、上記のすべてがhttps://github.com/TTLabs/EvaporateJSになっています。

関連する問題