LabHub

오브젝트 스토리지와 S3 · S3 API 핵심(버킷·키·ETag·멀티파트) · 실습

멀티파트 업로드와 ETag 계산

LabHub 에서 이어서 보기

목표

멀티파트 업로드를 저수준 API 로 직접 수행하고, 멀티파트 ETag 를 손으로 계산해 서버 값과 일치시킨 뒤, 중단된 업로드를 정리하는 것까지 익힌다.

왜 중요한가

멀티파트는 SDK 가 알아서 해 주는 경우가 많아 내부를 모르고 지나치기 쉽습니다. 그런데 두 가지 지점에서 반드시 알아야 합니다. 첫째, ETag 입니다. 멀티파트로 올라간 객체의 ETag 는 내용의 md5 가 아니라 각 파트 md5 의 이진값을 이어 붙여 다시 md5 한 값이고 뒤에 파트 수가 붙습니다. 이걸 모르면 "ETag 로 검증했는데 안 맞는다"에서 몇 시간을 씁니다. 둘째, 중단된 업로드입니다. 완료되지 않은 멀티파트의 파트들은 저장 공간을 차지하지만 객체 목록에는 보이지 않습니다. 클라이언트가 죽거나 배포 중에 끊긴 업로드가 몇 달 쌓이면 청구서에 이유 없는 수백 GB 가 나타납니다. AWS 비용 누수의 단골 항목이고, 이 실습의 7번 스텝이 그 대응입니다.

단계

1. /root/mp/big.bin 을 정확히 25165824 바이트(24MiB)로 만든다. 내용은 재현 가능해야 한다(예: 0x00~0xFF 반복).
2. /root/mp/parts.txtpart_size=5242880, parts=5, last_part=4194304 세 줄을 적는다. 5MiB 파트 4개에 마지막 4MiB 파트가 붙는다.
3. /root/mp/mp.pylab-media/big/big.bin 에 대한 멀티파트 업로드를 시작하고 UploadId 를 /root/mp/upload_id.txt 에 저장한다. 32자 이상이어야 한다.
4. 5개 파트를 올리고 각 응답의 ETag 를 /root/mp/part_etags.txt<파트번호> <etag> 형식으로 5줄 적는다.
5. 업로드를 완료한다. mc stat local/lab-media/big/big.bin 의 크기가 25165824 여야 하고 ETag 가 -5 로 끝나야 한다.
6. /root/mp/etag_calc.py 로 멀티파트 ETag 를 손으로 계산해 /root/mp/etag_calc.txtcalculated=<값>server=<값> 두 줄을 적는다. 두 값이 같아야 한다.
7. lab-media/big/orphan.bin 에 대해 업로드를 시작만 한 뒤 중단한다. /root/mp/abort.outuploads_before=1 uploads_after=0 을 적는다.
8. 객체를 /root/mp/downloaded.bin 으로 받아 sha256 을 원본과 비교하고 /root/mp/verify.txtsha_match=true 를 적는다. 같은 파일에 max_parts=10000, min_part_bytes=5242880 두 줄도 적는다.

참고

단계 8개

  1. 큰 파일 만들기
  2. 파트 나누기 계산하기
  3. 멀티파트 업로드 시작하기
  4. 파트 올리고 ETag 모으기
  5. 업로드 완료하기
  6. 멀티파트 ETag 를 손으로 재현하기
  7. 시작만 하고 중단하기
  8. 다운로드해 무결성 확인하고 규칙 정리하기