分片上传与 ETag 的计算
한국어 원문으로 표시합니다.
목표
멀티파트 업로드를 저수준 API 로 직접 수행하고, 멀티파트 ETag 를 손으로 계산해 서버 값과 일치시킨 뒤, 중단된 업로드를 정리하는 것까지 익힌다.
왜 중요한가
멀티파트는 SDK 가 알아서 해 주는 경우가 많아 내부를 모르고 지나치기 쉽습니다. 그런데 두 가지 지점에서 반드시 알아야 합니다. 첫째, ETag 입니다. 멀티파트로 올라간 객체의 ETag 는 내용의 md5 가 아니라 각 파트 md5 의 이진값을 이어 붙여 다시 md5 한 값이고 뒤에 파트 수가 붙습니다. 이걸 모르면 "ETag 로 검증했는데 안 맞는다"에서 몇 시간을 씁니다. 둘째, 중단된 업로드입니다. 완료되지 않은 멀티파트의 파트들은 저장 공간을 차지하지만 객체 목록에는 보이지 않습니다. 클라이언트가 죽거나 배포 중에 끊긴 업로드가 몇 달 쌓이면 청구서에 이유 없는 수백 GB 가 나타납니다. AWS 비용 누수의 단골 항목이고, 이 실습의 7번 스텝이 그 대응입니다.
단계
/root/mp/big.bin을 정확히 25165824 바이트(24MiB)로 만든다. 내용은 재현 가능해야 한다(예: 0x00~0xFF 반복)./root/mp/parts.txt에part_size=5242880,parts=5,last_part=4194304세 줄을 적는다. 5MiB 파트 4개에 마지막 4MiB 파트가 붙는다./root/mp/mp.py로lab-media/big/big.bin에 대한 멀티파트 업로드를 시작하고 UploadId 를/root/mp/upload_id.txt에 저장한다. 32자 이상이어야 한다.- 5개 파트를 올리고 각 응답의 ETag 를
/root/mp/part_etags.txt에<파트번호> <etag>형식으로 5줄 적는다. - 업로드를 완료한다.
mc stat local/lab-media/big/big.bin의 크기가 25165824 여야 하고 ETag 가-5로 끝나야 한다. /root/mp/etag_calc.py로 멀티파트 ETag 를 손으로 계산해/root/mp/etag_calc.txt에calculated=<값>과server=<값>두 줄을 적는다. 두 값이 같아야 한다.lab-media/big/orphan.bin에 대해 업로드를 시작만 한 뒤 중단한다./root/mp/abort.out에uploads_before=1 uploads_after=0을 적는다.- 객체를
/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: 실패한 업로드를 중단하지 않아 파트가 조용히 쌓이는 것.
큰 파일 만들기
/root/mp/big.bin 을 정확히 25165824 바이트(24MiB)로 만든다. 내용은 재현 가능해야 한다(예: 0x00~0xFF 반복).
내용이 매번 같아야 나중에 해시를 비교할 수 있습니다. 고정된 패턴으로 채우세요.
파트 나누기 계산하기
/root/mp/parts.txt 에 part_size=5242880, parts=5, last_part=4194304 세 줄을 적는다. 5MiB 파트 4개에 마지막 4MiB 파트가 붙는다.
마지막 파트를 제외한 각 파트는 최소 크기가 정해져 있습니다. 나머지가 마지막 파트입니다.
멀티파트 업로드 시작하기
/root/mp/mp.py 로 lab-media/big/big.bin 에 대한 멀티파트 업로드를 시작하고 UploadId 를 /root/mp/upload_id.txt 에 저장한다. 32자 이상이어야 한다.
시작하면 식별자를 받습니다. 이 식별자가 있어야 파트를 올릴 수 있습니다.
파트 올리고 ETag 모으기
5개 파트를 올리고 각 응답의 ETag 를 /root/mp/part_etags.txt 에 <파트번호> <etag> 형식으로 5줄 적는다.
파트 번호는 1부터 시작합니다. 각 응답의 ETag 를 순서대로 모아 두어야 완료할 수 있습니다.
업로드 완료하기
업로드를 완료한다. mc stat local/lab-media/big/big.bin 의 크기가 25165824 여야 하고 ETag 가 -5 로 끝나야 한다.
파트 번호와 ETag 목록을 함께 넘깁니다. 완료 후 객체 크기가 원본과 같아야 합니다.
멀티파트 ETag 를 손으로 재현하기
/root/mp/etag_calc.py 로 멀티파트 ETag 를 손으로 계산해 /root/mp/etag_calc.txt 에 calculated=<값> 과 server=<값> 두 줄을 적는다. 두 값이 같아야 한다.
각 파트 md5 의 이진값을 이어 붙여 다시 md5 하고 파트 수를 붙입니다. 16진 문자열이 아니라 이진값입니다.
시작만 하고 중단하기
lab-media/big/orphan.bin 에 대해 업로드를 시작만 한 뒤 중단한다. /root/mp/abort.out 에 uploads_before=1 uploads_after=0 을 적는다.
중단하지 않으면 파트가 저장 공간을 계속 차지합니다. 중단 후 미완료 목록이 비어야 합니다.
다운로드해 무결성 확인하고 규칙 정리하기
객체를 /root/mp/downloaded.bin 으로 받아 sha256 을 원본과 비교하고 /root/mp/verify.txt 에 sha_match=true 를 적는다. 같은 파일에 max_parts=10000, min_part_bytes=5242880 두 줄도 적는다.
sha256 으로 원본과 비교합니다. 그리고 파트 규칙 세 가지를 숫자로 적으세요.