오브젝트 스토리지와 S3 · S3 API 핵심(버킷·키·ETag·멀티파트) · 실습
멀티파트 업로드와 ETag 계산
목표
멀티파트 업로드를 저수준 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.txt 에 part_size=5242880, parts=5, last_part=4194304 세 줄을 적는다. 5MiB 파트 4개에 마지막 4MiB 파트가 붙는다.
3. /root/mp/mp.py 로 lab-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.txt 에 calculated=<값> 과 server=<값> 두 줄을 적는다. 두 값이 같아야 한다.
7. lab-media/big/orphan.bin 에 대해 업로드를 시작만 한 뒤 중단한다. /root/mp/abort.out 에 uploads_before=1 uploads_after=0 을 적는다.
8. 객체를 /root/mp/downloaded.bin 으로 받아 sha256 을 원본과 비교하고 /root/mp/verify.txt 에 sha_match=true 를 적는다. 같은 파일에 max_parts=10000, min_part_bytes=5242880 두 줄도 적는다.
참고
- 파트 규칙: 최대 10,000개, 마지막을 제외한 각 파트 최소 5MiB, 파트 최대 5GiB
- ETag 계산: 각 파트 md5 를
bytes.fromhex()로 이진화해 이어 붙이고 그 전체를 md5 한 뒤-<파트수>를 붙인다 - 미완료 업로드 조회는
list_multipart_uploads또는mc ls --incomplete로 합니다. - 흔한 실수 1: 파트 md5 를 16진 문자열 그대로 이어 붙이는 것 — 이진값이어야 합니다.
- 흔한 실수 2: 실패한 업로드를 중단하지 않아 파트가 조용히 쌓이는 것.
단계 8개
- 큰 파일 만들기
- 파트 나누기 계산하기
- 멀티파트 업로드 시작하기
- 파트 올리고 ETag 모으기
- 업로드 완료하기
- 멀티파트 ETag 를 손으로 재현하기
- 시작만 하고 중단하기
- 다운로드해 무결성 확인하고 규칙 정리하기