2016-06-16 3 views
1

Amazon S3에 업로드하는 파일의 무결성을 어떻게 확인할 수 있습니까? StackOverflow에 관한 몇 가지 질문을 볼 수는 있지만 이전 API를 사용하는 것처럼 보입니다. 이전 API는 지금 사용하고있는 것과 매우 다르게 보이며 더 이상 유효하지 않은 것으로 보이는 md5가 포함 된 E-Tag를 참조하거나 5GB가 넘는 파일의 경우Amazon S3 거대한 파일 무결성

그래서, 기본적으로,이 같은 캐치/A 시도로 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"의 캐치에 해당하는 것으로 보입니다.

그러나 업로드 된 파일의 무결성에 대해서는 여전히 염려하고 있으므로 확인하는 방법을 알고 싶습니다.

ETag: ba66d1235f954f28366ddc0a7efcb295-1609

을하지만 로컬 "md5sum이"를 수행 할 때, 나는 완전히 다른 것을 얻을 : 나는 S3 관리 콘솔에서 볼 때, 하나 개의 파일의 속성을 말한다

fa693af7341c6c83e525ebc6b95422ea

이 업로드 된 뜻을 파일이 손상 되었습니까?

그렇지 않은 경우 업로드 한 파일의 무결성을 확인하는 방법은 무엇입니까?

답변

1

멀티 파트 업로드의 경우 각 파트의 md5 해시의 ¹ 바이너리 인코딩을 결합하여 결합하여 md5를 수행하고 결과를 16 진수로 인코딩 한 다음 - 다음에 부품 수를 추가하여 etag가 계산됩니다 .

업로드 부분 크기를 알고있는 경우 주어진 파일에 대한 정확한 다중 부분 귀속 값을 계산할 수 있습니다. 나는이 값을 미리 계산하고 나중에 수동 또는 기계 검증을 위해 x-amz-meta-expect-etag으로 저장하는 s3 다중 업 로더 (출시되지 않음)를 작성했습니다. 어딘가에, 사실 이후에 로컬 파일에서 이것을 계산하는 독립형 유틸리티가있을 수 있습니다. 내가 찾아 볼게.

당신은 신중할 것이 틀림 없지만 우려 사항은 거의 근거가 없습니다. 사용중인 라이브러리가 멀티 파트 API에 내장 된 failsafe를 사용하는 경우 다음을 수행해야합니다.

각 파트를 업로드 할 때 해당 파트의 md5 해시의 base64 인코딩을 포함하는 Content-MD5 헤더를 보내야합니다 . 요청에 이것이 있으면 S3는 데이터가 전송 중에 손상된 것으로 간주되므로 의도적으로 해당 부분을 수락하지 않습니다.

각 파트를 업로드하면 파트의 md5를 포함하는 해당 파트의 etag를 포함하는 응답이 16 진수로 수신됩니다. 코드가 그 값을 확인해야합니다.

그런 다음 모든 부품이 완료되면 업로드를 완료하기 위해 "완료"요청을 수집해야합니다. 이 요청에는 업로드가 진행되는 동안 로컬로 유지 관리해야하는 개별 부품의 etag가 모두 포함됩니다. (목록에 대해 S3를 조사하는 방법이 있지만 상호 점검을 위해 사용되며 데이터가 실제로 전체 멀티 파트 업로드 요청을 어셈블하는 데 사용되어서는 안됩니다. 이러한 값이 S3가 있어야한다고 생각하지 않으면 요청이 실패하고 객체가 버킷에 존재하지 않습니다.

그래서 제대로 완료되면 S3 멀티 파트 업로드가 데이터 무결성을 보장하는 데 아주 좋습니다 ... 잘못된 결과를 가져오고 불완전한 개체를 만들지 않도록 매우 열심히 노력합니다. 사용중인 라이브러리의 코드를 감사하여 이러한 작업을 수행하는지 확인해야합니다. 그들이 그렇게한다면, 당신은 잘되어야합니다. 이렇게 쓴 내부 시스템의 초기 버전에서는 확인을 위해 각 multipart 업로드 후에 실제로 curl 'https://{pre-signed-url}' | md5sum을 사용했습니다. 이런 방식으로 2 년 동안 운영되어 문자 그대로 은 멀티 파트 API가 제공하는 안전 장치를 사용하여 S3 서비스 (SDK 없음)와 직접 대화하기 위해 작성한 코드를 모두 사용할 때 잘못된 멀티 파트 업로드를 생성하지 않습니다.


¹ md5 해시는 128 비트 값입니다. "바이너리 인코딩"(실제로 "인코딩되지 않음", "원시"이 아니기 때문에 정확한 용어는 아님)은 16 바이트 값이며 각 바이트는 0-255 범위의 값을 포함합니다. md5 해시의 바이트가 단순히 문자열로 캐스팅되면 바이트 중 많은 수가 인쇄 할 수없는 문자가됩니다 ... 따라서 공통 표현은 16 진수로 출력되며 결과는 32 바이트 (128 및 4 분의 4) 0-9, af) 각 16 진수 문자는 4 비트 만 인코딩하기 때문에 ... 또는 base64 (문자 0-9A-Za-z +/=)에서는 어느 정도 덜 일반적으로 24 바이트 (128 & divide; 각 문자가 6 비트를 인코딩하기 때문에 출력의 4의 배수). 32 바이트 16 진수 인코딩을 연결하지 않으면 16 바이트 인 각 파트의 md5 원시 이진 버전이 필요합니다.

+0

안녕하세요. 대답 해 주셔서 감사합니다. 전체 파일에 대해 전체 MD5 합계를 제공하지 않는 것은 부끄러운 일입니다. 부분적으로 파일을 분할하고 각 파일에 대한 MD5 합계를 계산하는 것은 과잉 일 것입니다. 그러나 방금 MD5를 계산 한 가장 큰 파일 2 개를 다운로드했으며 로컬 합계와 일치했습니다. 매우 친절하고 회신에 시간을 내 주셔서 감사합니다. – Nuno

+0

체크섬 만들기는 CPU를 많이 사용합니다. 20 GB 비디오 파일의 체크섬을 계산하려고 시도했다면, 무슨 뜻인지 알 수 있습니다. –

0

S3에 업로드 할 때 사본 충실도 (완벽한 전송)를 보장하는 유일한 방법은 체크섬을 사용하는 것입니다. 이를 관리하기 위해 AWS를 사용하면 파일을 여러 부분으로 나누고 체크섬을 계산 한 다음 서명의 일부로 해당 체크섬을 보내고 "Content-Md5"헤더에 보낼 수 있습니다.

S3에 게시하는 내용이 오류없이 저장되었다고 가정 할 수는 없습니다.

AWS PUT API 요청이 500 또는 기타 오류를 반환하는 경우는 드물지 않습니다. 이는 문서화 된 것이며 AWS가 그러한 경우 다시 시도하기를 요구하는 이유 중 하나입니다.

AWS S3 멀티 파트 업로드의 엄청난 이점은 주로 복사 충실도, 업로드 오류 (사용자가 전체 파일이 아니라 부분을 다시 시도해야 함)이며, 매우 뚱뚱한 파이프가있는 경우에는 향상된 처리량을위한 업로드

브라우저의 AWS JavaScript SDK가 텍스트 마임 유형 (동영상, 이미지, 음악과 같은 바이너리가 아닌) 이외의 항목에 대한 멀티 파트 업로드에서 체크섬을 지원하지 않았기 때문에 위의 모든 내용이 매우 인기있는 브라우저 기반 구현입니다. https://github.com/TTLabs/EvaporateJS.