Amazon S3에서 멀티파트 업로드를 사용한 객체 업로드 및 복사
멀티파트 업로드를 사용하면 단일 객체를 여러 파트의 집합으로 Amazon S3에 업로드할 수 있습니다. 각 부분은 객체 데이터의 연속적인 부분입니다. 이러한 객체 파트는 독립적으로 그리고 임의의 순서로 업로드할 수 있습니다. 업로드의 경우 업데이트된 AWS 클라이언트는 객체의 체크섬을 자동으로 계산하여 요청의 일부로 객체 크기와 함께 Amazon S3로 전송합니다. 부분의 전송이 실패할 경우 다른 부분에 영향을 주지 않고도 해당 부분을 재전송할 수 있습니다. 객체의 모든 파트가 업로드되면 Amazon S3가 이 파트를 수집하여 객체를 생성합니다. 100MB 이상의 객체인 경우 단일 작업으로 업로드하는 대신 멀티파트 업로드를 사용하는 것이 좋습니다.
멀티파트 업로드 사용은 다음 이점을 제공합니다.
-
개선된 처리량 개선 - 부분을 병렬적으로 업로드하여 처리량을 개선할 수 있습니다.
-
네트워크 문제로부터 빠른 복구 - 더 작아진 부분 크기는 네트워크 오류로 인해 실패한 업로드 재시작의 영향을 최소화합니다.
-
객체 업로드 일시 중지 및 재개 – 객체 부분을 장시간에 걸쳐 업로드할 수 있습니다. 일단 멀티파트 업로드가 시작되면 제한 시간이 없습니다. 멀티파트 업로드를 명시적으로 완료하거나 중단해야 합니다.
-
최종 객체 크기를 알기 전에 업로드를 시작 – 객체를 생성하면서 업로드할 수 있습니다.
다음 방법으로 멀티파트 업로드를 사용하는 것이 좋습니다.
-
안정적인 높은 대역폭 네트워크를 통해 큰 객체를 업로드하는 경우, 멀티파트 업로드를 사용하여 멀티스레드 성능을 위해 여러 객체 파트를 동시에 업로드함으로써 대역폭 사용을 극대화합니다.
-
불규칙한 네트워크를 통해 업로드하는 경우, 멀티파트 업로드를 사용하여 업로드가 다시 시작되는 것을 방지하여 네트워크 오류에 대한 복원력을 높입니다. 멀티파트 업로드를 사용하는 경우, 업로드 중에 중단된 파트만 다시 업로드를 시도하면 됩니다. 객체 업로드를 처음부터 다시 시작하지 않아도 됩니다.
참고
Amazon S3 Express One Zone 스토리지 클래스를 디렉터리 버킷과 함께 사용하는 방법에 대한 자세한 내용은 S3 Express One Zone 및 디렉터리 버킷 작업 섹션을 참조하세요. S3 Express One Zone 및 디렉터리 버킷에서 멀티파트 업로드를 사용하는 방법에 대한 자세한 내용은 디렉터리 버킷에 멀티파트 업로드 사용 섹션을 참조하세요.
멀티파트 업로드 프로세스
멀티파트 업로드는 3단계 프로세스입니다. 업로드를 시작하고, 객체 파트를 업로드하고, 모두 업로드했으면 멀티파트 업로드를 완료합니다. 멀티파트 업로드 완료 요청이 전송되면 Amazon S3는 업로드된 각 파트를 모아 완전한 객체를 구성합니다. 버킷의 다른 객체와 마찬가지로 이 객체에 액세스할 수 있습니다.
진행 중인 모든 멀티파트 업로드 작업의 목록 또는 특정 멀티파트 업로드에 대해 업로드한 부분의 목록을 확인할 수 있습니다. 다음 섹션에서 이러한 각 작업에 대해 자세히 설명합니다.
멀티파트 업로드 시작
멀티파트 업로드 시작 요청을 보낼 때는 체크섬 유형을 지정해야 합니다. 그런 다음 Amazon S3는 멀티파트 업로드의 고유 식별자인 업로드 ID가 포함된 응답을 반환합니다. 파트를 업로드하거나 파트를 나열하거나 업로드를 완료하거나 업로드를 중지할 때 이 업로드 ID가 필요합니다. 업로드되는 객체를 설명하는 메타데이터를 제공하려는 경우 멀티파트 업로드 시작 요청에서 제공해야 합니다.
파트 업로드
파트를 업로드할 때 업로드 ID와 함께 파트 번호를 지정해야 합니다. 1부터 10,000까지 부분 번호를 지정할 수 있습니다. 부분 번호를 사용하여 업로드하는 객체에서 각 부분과 그 위치를 고유하게 식별합니다. 부분 번호는 굳이 연속 시퀀스로 선택할 필요가 없습니다(예를 들면 1, 5 및 14를 선택해도 됩니다). 이전에 업로드한 파트와 동일한 파트 번호로 새 파트를 업로드할 경우 이전에 업로드한 파트를 덮어쓰게 된다는 것을 유의하세요.
파트를 업로드하면 Amazon S3는 각 파트의 체크섬 값과 함께 체크섬 알고리즘 유형을 응답의 헤더로 반환합니다. 각 부분 업로드에 대해 부분 번호와 ETag 값을 기록해야 합니다. 이후 멀티파트 업로드를 완료하기 위한 요청에 이러한 값을 포함해야 하기 때문입니다. 업로드 시 각 부분에는 고유한 ETag가 있습니다. 하지만 멀티파트 업로드가 완료되고 모든 파트가 통합되면 모든 파트는 체크섬의 체크섬으로 하나의 ETag에 속하게 됩니다.
중요
멀티파트 업로드를 시작하여 하나 이상의 파트를 업로드한 후에는 멀티파트 업로드를 완료하거나 중지해야 업로드된 파트의 스토리지 비용이 청구되지 않습니다. 멀티파트 업로드를 완료 또는 중단한 후에만 Amazon S3가 파트 스토리지를 비우고 파트 스토리지에 대한 비용 청구를 중지합니다.
멀티파트 업로드를 중지한 후에는 해당 업로드 ID로 다시 파트를 업로드할 수 없습니다. 파트 업로드가 진행 중일 때 멀티파트 업로드를 중지하더라도 진행 중인 파트 업로드는 성공하거나 실패할 수 있습니다. 따라서 각 파트에서 사용하고 있는 스토리지를 모두 비우려면 모든 파트 업로드가 완료된 후에 멀티파트 업로드를 중지해야 합니다.
멀티파트 업로드 완료
멀티파트 업로드를 완료하면 Amazon S3는 부분 번호를 바탕으로 오름차순으로 각 부분을 결합하여 객체를 완성합니다. 멀티파트 업로드 시작 요청에서 객체 메타데이터가 제공된 경우 Amazon S3는 객체에 해당 메타데이터를 연결합니다. 성공적으로 완료 요청이 수행되면 부분은 더 이상 존재하지 않습니다.
멀티파트 업로드 완료 요청에는 업로드 ID와 각 파트 번호 및 해당 ETag 값의 목록이 포함되어야 합니다. Amazon S3 응답에는 결합된 객체 데이터를 고유하게 식별하는 ETag가 포함됩니다. 이 ETag가 반드시 객체 데이터의 MD5 해시여야 하는 것은 아닙니다.
멀티파트 업로드 중에 전체 객체 체크섬을 제공하면 AWS SDK는 체크섬을 Amazon S3에 전달하고 S3는 서버 측의 객체 무결성을 검증하여 수신된 값과 비교합니다. 그런 다음 값이 일치하면 S3가 객체를 저장합니다. 두 값이 일치하지 않으면 Amazon S3에서 BadDigest
오류와 함께 요청이 실패합니다. 객체의 체크섬은 나중에 객체의 데이터 무결성을 검증하는 데 사용할 객체 메타데이터에도 저장됩니다.
멀티파트 업로드 호출 샘플
이 예시에서는 100GB 파일에 대해 멀티파트 업로드를 생성한다고 가정합니다. 이 경우 전체 프로세스를 위해 다음과 같은 API 호출이 이루어집니다. 총 1,002개의 API 직접 호출이 수행됩니다.
-
프로세스를 시작하는
CreateMultipartUpload
호출. -
총 100GB 크기에 대해 각각 100MB인 파트를 업로드하는 1,000개의 개별
UploadPart
직접 호출 -
프로세스를 완료하기 위한
CompleteMultipartUpload
직접 호출
멀티파트 업로드 나열
특정 멀티파트 업로드 또는 진행 중인 모든 멀티파트 업로드에 대해 부분 목록을 확인할 수 있습니다. 파트 나열 작업은 특정 멀티파트 업로드에 대해 업로드한 파트의 정보를 반환합니다. 각 부분 목록 조회 요청에 대해 Amazon S3는 특정 멀티파트 업로드에서 최대 1,000개의 부분에 대해 부분 정보를 반환합니다. 멀티파트 업로드에서 1,000개 이상의 파트가 있을 경우 모든 파트를 검색하려면 파트 나열 요청을 여러 번 반복해야 합니다. 반환된 부분 목록에는 업로드가 완료되지 않은 부분이 포함되지 않습니다. 멀티파트 업로드 나열 작업을 사용하여 진행 중인 멀티파트 업로드의 목록을 확인할 수 있습니다.
진행 중인 멀티파트 업로드는 시작했지만 아직 완료 또는 중단하지 않은 업로드입니다. 각 요청은 최대 1,000개의 멀티파트 업로드를 반환합니다. 진행 중인 멀티파트 업로드가 1,000개 이상일 경우 남은 멀티파트 업로드를 모두 검색하려면 추가 요청을 전송해야 합니다. 반환된 목록은 확인을 위해서만 사용합니다.
중요
멀티파트 업로드 완료 요청을 전송할 때 이 나열 결과를 사용하면 안 됩니다. 그 대신, 부분을 업로드할 때 지정한 부분 번호 및 Amazon S3가 반환한 해당 ETag 값의 목록을 보관해야 합니다.
멀티파트 업로드 작업을 사용한 체크섬
Amazon S3에 객체를 업로드할 때 Amazon S3에서 사용할 체크섬 알고리즘을 지정할 수 있습니다. 기본적으로 AWS SDK 및 S3 콘솔은 모든 객체 업로드에 알고리즘을 사용하며, 이를 재정의할 수 있습니다. 이전 SDK를 사용하고 업로드된 객체에 지정된 체크섬이 없는 경우 Amazon S3는 CRC-64/NVME(CRC64NVME
) 체크섬 알고리즘을 자동으로 사용합니다. (효율적인 데이터 무결성 확인을 위한 권장 옵션이기도 합니다.) CRC-64/NVME를 사용할 때 Amazon S3는 멀티파트 또는 단일 파트 업로드가 완료된 후 전체 객체의 체크섬을 계산합니다. CRC-64/NVME 체크섬 알고리즘은 각 개별 파트에 대해 전체 객체의 직접 체크섬 또는 체크섬의 체크섬을 계산하는 데 사용됩니다.
멀티파트 업로드를 사용하여 객체를 S3에 업로드한 후 Amazon S3는 각 파트 또는 전체 객체에 대한 체크섬 값을 계산하고 값을 저장합니다. S3 API 또는 AWS SDK를 사용하여 다음과 같은 방법으로 체크섬 값을 검색할 수 있습니다.
-
개별 파트의 경우
GetObject
또는HeadObject
를 사용할 수 있습니다. 아직 진행 중인 멀티파트 업로드의 개별 파트에 대한 체크섬 값을 검색하려면ListParts
를 사용하면 됩니다. -
전체 객체에 대해
PutObject
를 사용할 수 있습니다. 전체 객체 체크섬으로 멀티파트 업로드를 수행하려면 전체 객체 체크섬 유형을 지정하여CreateMultipartUpload
및CompleteMultipartUpload
를 사용합니다. 전체 객체의 체크섬 값을 검증하거나 멀티파트 업로드에서 사용 중인 체크섬 유형을 확인하려면ListParts
를 사용합니다.
중요
체크섬과 함께 멀티파트 업로드를 사용하는 경우 멀티파트 업로드에서 각 파트 업로드에 대한 파트 번호는 연속 파트 번호를 사용해야 합니다. 체크섬을 사용할 때 연속되지 않는 파트 번호로 멀티파트 업로드 요청을 완료하려고 하면 Amazon S3가 HTTP 500 Internal Server
오류를 생성합니다.
멀티파트 업로드 객체를 통한 체크섬 작업에 대한 자세한 내용은 Amazon S3에서 객체 무결성 확인 섹션을 참조하세요.
추가 체크섬이 포함된 멀티파트 업로드를 사용하여 객체를 업로드하는 전체 절차는 튜토리얼: 멀티파트 업로드를 통한 객체 업로드 및 데이터 무결성 확인 섹션을 참조하세요.
동시 멀티파트 업로드 작업
분산 개발 환경에서는 애플리케이션에서 한 객체에 대해 동시에 여러 업데이트를 시작할 수 있습니다. 애플리케이션은 동일한 객체 키를 사용하여 여러 멀티파트 업로드를 시작할 수 있습니다. 이러한 각 업로드에 대해 애플리케이션은 부분을 업로드한 후 Amazon S3가 객체를 생성하도록 업로드 완료 요청을 전송할 수 있습니다. 버킷에서 S3 버전 관리를 사용할 경우 멀티파트 업로드를 완료하면 항상 새 버전이 생성됩니다. 버전 관리가 활성화된 버킷에서 동일한 객체 키를 사용하는 멀티파트 업로드를 여러 개 시작하는 경우, 가장 최근에 시작된 업로드(createdDate
)에 따라 객체의 현재 버전이 결정됩니다.
예를 들어 오전 10시에 객체에 대한 CreateMultipartUpload
요청을 시작합니다. 그런 다음 오전 11시에 같은 객체에 대한 두 번째 CreateMultipartUpload
요청을 제출합니다. 두 번째 요청이 가장 최근에 제출되었으므로 첫 번째 업로드가 두 번째 업로드 후에 완료되더라도 오전 11시 요청에 의해 업로드된 객체가 현재 버전이 됩니다. 버전 관리가 활성화되지 않은 버킷의 경우 멀티파트 업로드의 시작과 완료 사이에 전송된 다른 요청을 우선 수행할 수 있습니다.
동시 멀티파트 업로드 요청이 우선할 수 있는 또 다른 예는 키를 사용하여 멀티파트 업로드를 시작한 후 다른 작업이 해당 키를 삭제하는 경우입니다. 작업을 완료하기 전에 전체 멀티파트 업로드 응답은 객체를 보지 못한 상태에서도 객체를 성공적으로 생성했다고 나타낼 수 있습니다.
멀티파트 업로드 중에 키 이름이 동일한 객체 업로드 방지
업로드 시 조건부 쓰기 작업을 사용하여 객체를 생성하기 전에 버킷에 객체가 있는지 확인할 수 있습니다. 이렇게 하면 기존 데이터의 덮어쓰기를 방지할 수 있습니다. 조건부 쓰기는 업로드하는 동안 버킷에 이미 같은 키 이름을 가진 기존 객체가 없는지 확인합니다.
PutObject 또는 CompleteMultipartUpload 요청에 조건부 쓰기를 사용할 수 있습니다.
조건부 요청에 대한 자세한 내용은 조건부 요청을 통해 S3 작업에 사전 조건 추가 섹션을 참조하세요.
멀티파트 업로드 및 요금
멀티파트 업로드가 시작되면 Amazon S3는 업로드가 완료되거나 중단될 때까지 모든 부분을 계속 유지합니다. 수명 주기가 끝날 때까지 이 멀티파트 업로드와 관련 부분의 모든 스토리지, 대역폭 및 요청에 대해 비용이 청구됩니다.
이러한 파트는 파트를 업로드할 때 지정한 스토리지 클래스에 따라 요금이 부과됩니다. 그러나 이러한 파트가 S3 Glacier Flexible Retrieval 또는 S3 Glacier Deep Archive에 업로드된 경우 해당 파트에 대한 요금이 부과되지 않습니다. S3 Glacier Flexier Flexible Retrieval 스토리지 클래스로의 PUT 요청에 멀티파트 파트가 진행 중인 경우, 업로드가 완료될 때까지 S3 Glacier Flexible Retrieval 스테이징 스토리지에 대해 S3 Standard 스토리지 요금이 부과됩니다. 또한 CreateMultipartUpload
및 UploadPart
모두 S3 Standard 요금이 부과됩니다. CompleteMultipartUpload
요청만 S3 Glacier Flexible Retrieval 요금이 부과됩니다. 마찬가지로, S3 Glacier Deep Archive 스토리지 클래스로의 PUT에 대한 진행 중인 멀티파트 파트는 업로드가 완료될 때까지 S3 Glacier Flexible Retrieval 스테이징 스토리지에 대해 S3 Standard 스토리지 요금이 부과되며, CompleteMultipartUpload
요청만 S3 Glacier Deep Archive 요금이 부과됩니다.
멀티파트 업로드를 중단하면 Amazon S3가 아티팩트 업로드 및 업로드된 모든 파트를 삭제합니다. 이러한 아티팩트에 대해서는 요금이 부과되지 않습니다. 지정한 스토리지 클래스에 관계없이 불완전한 멀티파트 업로드를 삭제하는 경우 조기 삭제 요금이 부과되지 않습니다. 요금에 대한 자세한 내용은 Amazon S3 요금
참고
스토리지 비용을 최소화하려면 AbortIncompleteMultipartUpload
작업을 사용하여 특정 기간이 지나면 불완전한 멀티파트 업로드를 삭제하는 수명 주기 규칙을 구성하는 것이 좋습니다. 불완전한 멀티파트 업로드를 삭제하기 위한 수명 주기 규칙을 만드는 방법과 관련하여 자세한 내용은 불완전한 멀티파트 업로드를 삭제하도록 버킷 수명 주기 구성 설정을 참조하십시오.
멀티파트 업로드를 위한 API 지원
Amazon Simple Storage Service API 참조의 다음 섹션에서는 멀티파트 업로드를 위한 REST API에 대해 설명합니다.
AWS Lambda 함수를 사용하는 멀티파트 업로드 방법에 대한 자세한 내용은 Uploading large objects to Amazon S3 using multipart upload and transfer acceleration
멀티파트 업로드를 위한 AWS Command Line Interface 지원
AWS Command Line Interface의 다음 주제에서는 멀티파트 업로드를 위한 작업을 설명합니다.
멀티파트 업로드에 대한 AWS SDK 지원
AWS SDK를 사용하여 객체를 여러 부분으로 나누어 업로드할 수 있습니다. API 작업에서 지원하는 AWS SDK 목록은 다음을 참조하십시오.
멀티파트 업로드 API 및 권한
멀티파트 업로드 작업을 수행하려면 필수 권한이 있어야 합니다. ACL(액세스 제어 목록), 버킷 정책 또는 사용자 정책을 사용하여 각 사용자에게 이 작업을 수행할 권한을 부여할 수 있습니다. 다음 표에는 ACL, 버킷 정책 또는 사용자 정책을 사용할 때 여러 멀티파트 업로드 작업에 대한 필수 권한이 나와 있습니다.
작업 | 필수 권한 |
---|---|
멀티파트 업로드 생성 |
멀티파트 업로드를 생성하려면 객체에 대해 버킷 소유자는 다른 주체가 |
멀티파트 업로드 시작 |
멀티파트 업로드를 시작하려면 객체에 대해 버킷 소유자는 다른 주체가 |
시작한 사용자 | 멀티파트 업로드를 시작한 사용자를 식별하는 컨테이너 요소입니다. 시작한 사용자가 AWS 계정일 경우 이 요소는 소유자 요소와 동일한 정보를 제공합니다. 시작한 사용자가 IAM 사용자일 경우 이 요소는 사용자 ARN 및 표시 이름을 제공합니다. |
파트 업로드 | 부분을 업로드하려면 객체에 대해 버킷 소유자는 멀티파트 작업을 시작한 사용자가 객체의 부분을 업로드할 수 있도록 객체에 대해 |
파트 업로드(복사) | 부분을 업로드하려면 객체에 대해 버킷 소유자는 객체의 멀티파트 업로드를 시작하는 사용자에게 |
멀티파트 업로드 완료 | 멀티파트 업로드를 완료하려면 객체에 대해 버킷 소유자는 멀티파트 작업을 시작한 사용자가 해당 객체의 멀티파트 업로드를 완료할 수 있도록 객체에 대해 |
멀티파트 업로드 중지 | 멀티파트 업로드를 중단하려면 객체에 대해 기본적으로 버킷 소유자와 멀티파트 업로드를 시작한 사용자는 이 작업을 IAM 및 S3 버킷 정책의 일환으로 수행하도록 허용됩니다. 시작한 사용자가 IAM 사용자인 경우 해당 사용자의 AWS 계정도 이 멀티파트 업로드를 중단할 수 있어야 합니다. VPC 엔드포인트 정책의 경우 멀티파트 업로드를 시작한 사용자는 버킷 소유자는 이러한 기본 사용자 외 다른 주체가 객체에 대해 |
파트 목록 조회 |
기본적으로 버킷 소유자에게는 버킷에 대한 멀티파트 업로드의 부분을 나열할 권한이 부여됩니다. 멀티파트 업로드를 시작한 사용자는 특정 멀티파트 업로드의 부분을 나열할 권한이 있습니다. 멀티파트 업로드를 시작한 사용자가 IAM 사용자인 경우 이 IAM 사용자를 제어하는 AWS 계정도 해당 업로드의 부분을 나열할 권한이 있습니다. 버킷 소유자는 이러한 기본 사용자 외 다른 주체가 객체에 대해 |
멀티파트 업로드 목록 조회 | 버킷에 대해 버킷 소유자는 이러한 기본 사용자 외, 다른 주체가 버킷에 대해 |
AWS KMS 암호화 및 암호 해독 관련 권한 |
AWS Key Management Service(AWS KMS) KMS 키를 통한 암호화를 사용해 멀티파트 업로드를 수행하려면 요청자에게 다음 권한이 있어야 합니다.
이러한 권한이 필요한 이유는 Amazon S3이 멀티파트 업로드를 완료하기 전에 암호화된 파일 부분에서 데이터를 암호 해독하고 읽어야 하기 때문입니다. 객체의 체크섬 값을 얻으려면 IAM 사용자 또는 역할이 KMS 키와 동일한 AWS 계정에 있는 경우 키 및 IAM 정책 둘 다에 대한 권한이 있는지 확인하세요. IAM 사용자 또는 역할이 KMS 키와 다른 계정에 속한 경우, 키 정책과 IAM 사용자 또는 역할 모두에 대한 권한이 있어야 합니다. |
SSE-C(고객 제공 암호화 키를 사용한 서버 측 암호화) | CompleteMultipartUpload API를 사용하는 경우 SSE-C(고객 제공 암호화 키를 사용한 서버 측 암호화)를 제공해야 합니다. 그렇지 않으면 체크섬 없이 객체가 생성되고 체크섬 값이 반환되지 않습니다. |
ACL 권한 및 액세스 정책의 권한 간 관계에 대한 자세한 내용은 ACL 권한과 액세스 정책 권한의 매핑 단원을 참조하십시오. IAM 사용자, 역할 및 모범 사례에 대한 자세한 내용은 IAM 사용 설명서의 IAM 자격 증명(사용자, 사용자 그룹 및 역할)을 참조하십시오.
멀티파트 업로드 작업을 사용한 체크섬
실제 멀티파트 업로드를 수행하는 데 사용되는 세 가지 Amazon S3 API는 CreateMultipartUpload
, UploadPart
, CompleteMultipartUpload
입니다. 다음 표는 각 API에 제공해야 하는 체크섬 헤더 및 값을 나타냅니다.
체크섬 알고리즘 | 체크섬 유형 | CreateMultipartUpload |
UploadPart |
CompleteMultipartUpoad |
---|---|---|---|---|
CRC-64/NVME( |
전체 객체 | 필수 헤더:
|
선택적 헤더:
|
선택적 헤더:
|
CRC-32( CRC 32-C( |
전체 객체 |
필수 헤더:
|
선택적 헤더:
|
선택적 헤더:
|
CRC-32( CRC-32C( SHA-1( SHA-256( |
복합 |
필수 헤더:
|
필수 헤더:
|
필수 헤더: 모든 파트 수준 체크섬을 선택적 헤더:
|