멀티파트 업로드를 사용한 객체 업로드 및 복사 - Amazon Simple Storage Service

멀티파트 업로드를 사용한 객체 업로드 및 복사

멀티파트 업로드를 사용하면 단일 객체를 여러 부분의 집합으로 업로드할 수 있습니다. 각 부분은 객체 데이터의 연속적인 부분입니다. 이러한 객체 부분은 독립적으로 그리고 임의의 순서로 업로드할 수 있습니다. 부분의 전송이 실패할 경우 다른 부분에 영향을 주지 않고도 해당 부분을 재전송할 수 있습니다. 객체의 모든 부분이 업로드되면 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가 있습니다. 하지만 멀티파트 업로드가 완료되고 모든 부분이 통합되면 모든 부분은 체크섬의 체크섬으로 하나의 ETag 아래에 있게 됩니다.

참고

멀티파트 업로드를 시작하여 하나 이상의 부분을 업로드한 후 멀티파트 업로드를 완료하거나 중단해야 업로드된 부분의 스토리지 비용이 청구되지 않습니다. 멀티파트 업로드를 완료 또는 중단한 에만 Amazon S3가 부분 스토리지를 비우고 부분 스토리지에 대한 비용 청구를 중단합니다.

멀티파트 업로드를 중단한 후에는 해당 업로드 ID로 다시 부분을 업로드할 수 없습니다. 부분 업로드가 진행 중일 때 멀티파트 업로드를 중단하더라도 진행 중인 부분 업로드는 성공적으로 완료되거나, 혹은 오류로 멈출 수도 있습니다. 따라서 각 부분에서 사용하고 있는 스토리지를 모두 비우려면 모든 부분 업로드가 완료된 후에 멀티파트 업로드를 중단해야 합니다.

멀티파트 업로드 완료

멀티파트 업로드를 완료하면 Amazon S3는 부분 번호를 바탕으로 오름차순으로 각 부분을 결합하여 객체를 완성합니다. 멀티파트 업로드 시작 요청에서 객체 메타데이터가 제공된 경우 Amazon S3는 객체에 해당 메타데이터를 연결합니다. 성공적으로 완료 요청이 수행되면 부분은 더 이상 존재하지 않습니다.

멀티파트 업로드 완료 요청에는 업로드 ID와 각 부분 번호 및 해당 ETag 값의 목록이 포함되어야 합니다. Amazon S3 응답에는 결합된 객체 데이터를 고유하게 식별하는 ETag가 포함됩니다. 이 ETag가 반드시 객체 데이터의 MD5 해시여야 하는 것은 아닙니다.

멀티파트 업로드 호출 샘플

이 예제에서는 100GB 파일에 대해 멀티파트 업로드를 생성한다고 가정합니다. 이 경우 전체 프로세스를 위해 다음과 같은 API 호출이 이루어집니다. 총 1002개의 API 호출이 수행됩니다.

멀티파트 업로드 나열

특정 멀티파트 업로드 또는 진행 중인 모든 멀티파트 업로드에 대해 부분 목록을 확인할 수 있습니다. 부분 목록 조회 작업은 특정 멀티파트 업로드에 대해 업로드한 부분의 정보를 반환합니다. 각 부분 목록 조회 요청에 대해 Amazon S3는 특정 멀티파트 업로드에서 최대 1,000개의 부분에 대해 부분 정보를 반환합니다. 멀티파트 업로드에서 1,000개 이상의 부분이 있을 경우 모든 부분을 검색하려면 부분 목록 조회 요청을 여러 번 반복해야 합니다. 반환된 부분 목록에는 업로드가 완료되지 않은 부분이 포함되지 않습니다. 멀티파트 업로드 나열 작업을 사용하여 진행 중인 멀티파트 업로드의 목록을 확인할 수 있습니다.

진행 중인 멀티파트 업로드는 시작했지만 아직 완료 또는 중단하지 않은 업로드입니다. 각 요청은 최대 1,000개의 멀티파트 업로드를 반환합니다. 진행 중인 멀티파트 업로드가 1,000개 이상일 경우 남은 멀티파트 업로드를 모두 검색하려면 추가 요청을 전송해야 합니다. 반환된 목록은 확인을 위해서만 사용합니다. 멀티파트 업로드 완료 요청을 전송할 때 이 나열 결과를 사용하면 안 됩니다. 그 대신, 부분을 업로드할 때 지정한 부분 번호 및 Amazon S3가 반환한 해당 ETag 값의 목록을 보관해야 합니다.

멀티파트 업로드 작업을 사용한 체크섬

Amazon S3에 객체를 업로드할 때 Amazon S3에서 사용할 체크섬 알고리즘을 지정할 수 있습니다. Amazon S3는 기본적으로 MD5를 사용하여 데이터 무결성을 확인하지만 사용할 추가 체크섬 알고리즘을 지정할 수 있습니다. MD5를 사용할 때 Amazon S3는 업로드가 완료된 후 전체 멀티파트 객체의 체크섬을 계산합니다. 이 체크섬은 전체 객체의 체크섬이 아니라 각 개별 부분에 대한 체크섬의 체크섬입니다.

Amazon S3에게 추가 체크섬을 사용하도록 하면 Amazon S3가 각 부분에 대한 체크섬 값을 계산하고 저장합니다. API 또는 SDK를 사용하여 GetObject 또는 HeadObject를 통해 개별 부분의 체크섬 값을 검색할 수 있습니다. 아직 진행 중인 멀티파트 업로드의 개별 부분에 대한 체크섬 값을 검색하려면 ListParts를 사용하면 됩니다.

중요

추가 체크섬과 함께 멀티파트 업로드를 사용하는 경우 멀티파트 부분 번호는 연속 부분 번호를 사용해야 합니다. 추가 체크섬을 사용할 때 연속되지 않는 부분 번호로 멀티파트 업로드 요청을 완료하려고 하면 Amazon S3가 HTTP 500 Internal Server Error 오류를 생성합니다.

멀티파트 객체를 통한 체크섬 작업에 대한 자세한 내용은 객체 무결성 확인 단원을 참조하십시오.

동시 멀티파트 업로드 작업

분산 개발 환경에서는 애플리케이션에서 한 객체에 대해 동시에 여러 업데이트를 시작할 수 있습니다. 애플리케이션은 동일한 객체 키를 사용하여 여러 멀티파트 업로드를 시작할 수 있습니다. 이러한 각 업로드에 대해 애플리케이션은 부분을 업로드한 후 Amazon S3가 객체를 생성하도록 업로드 완료 요청을 전송할 수 있습니다. 버킷에서 S3 버전 관리를 사용할 경우 멀티파트 업로드를 완료하면 항상 새 버전이 생성됩니다. 버전 관리가 활성화된 버킷에서 동일한 객체 키를 사용하는 멀티파트 업로드를 여러 개 시작하는 경우, 가장 최근에 시작된 업로드(createdDate)에 따라 객체의 현재 버전이 결정됩니다. 예를 들어 객체에 대한 CreateMultipartUpload 요청을 오전 10시에 시작한다고 가정해 보겠습니다. 그런 다음 오전 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 Staging Storage로 S3 Standard 스토리지 요금이 청구됩니다. 또한 CreateMultipartUpload 및 UploadPart 모두 S3 Standard 요금이 청구됩니다. CompleteMultipartUpload 요청만 S3 Glacier Flexible Retrieval 요금으로 청구됩니다. 마찬가지로, S3 Glacier Deep Archive 스토리지 클래스에 대한 PUT에 대한 진행 중인 멀티파트 파츠는 업로드가 완료될 때까지 S3 Standard 스토리지 요금으로 S3 Glacier Flexible Retrieval Staging Storage로 청구되며, CompleteMultipartUpload 요청만 S3 Glacier Deep Archive 요금으로 청구됩니다.

멀티파트 업로드를 중단하면 Amazon S3가 아티팩트 업로드 및 업로드된 모든 부분을 삭제하므로 더 이상 비용이 청구되지 않습니다. 지정한 스토리지 클래스에 관계없이 불완전한 멀티파트 업로드를 삭제하는 경우 조기 삭제 요금이 부과되지 않습니다. 요금에 대한 자세한 내용은 Amazon S3 요금을 참조하십시오.

참고

스토리지 비용을 최소화하려면 AbortIncompleteMultipartUpload 작업을 사용하여 특정 기간이 지나면 불완전한 멀티파트 업로드를 삭제하는 수명 주기 규칙을 구성하는 것이 좋습니다. 불완전한 멀티파트 업로드를 삭제하기 위한 수명 주기 규칙을 만드는 방법과 관련하여 자세한 내용은 불완전한 멀티파트 업로드를 삭제하도록 버킷 수명 주기 구성 설정을 참조하십시오.

멀티파트 업로드를 위한 API 지원

이들 라이브러리는 높은 수준의 추상화를 제공하여 간편하게 객체의 멀티파트 업로드를 수행할 수 있습니다. 그러나 필요할 경우 애플리케이션에서 바로 REST 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, 버킷 정책 또는 사용자 정책을 사용할 때 여러 멀티파트 업로드 작업에 대한 필수 권한이 나와 있습니다.

작업 필수 권한

멀티파트 업로드 생성

멀티파트 업로드를 생성하려면 객체에 대해 s3:PutObject 작업을 수행할 수 있어야 합니다.

버킷 소유자는 다른 주체가 s3:PutObject 작업을 수행하도록 허가할 수 있습니다.

멀티파트 업로드 시작

멀티파트 업로드를 시작하려면 객체에 대해 s3:PutObject 작업을 수행할 수 있어야 합니다.

버킷 소유자는 다른 주체가 s3:PutObject 작업을 수행하도록 허가할 수 있습니다.

시작한 사용자

멀티파트 업로드를 시작한 사용자를 식별하는 컨테이너 요소입니다. 시작한 사용자가 AWS 계정일 경우 이 요소는 소유자 요소와 동일한 정보를 제공합니다. 시작한 사용자가 IAM 사용자일 경우 이 요소는 사용자 ARN 및 표시 이름을 제공합니다.

파트 업로드

부분을 업로드하려면 객체에 대해 s3:PutObject 작업을 수행할 수 있어야 합니다.

버킷 소유자는 멀티파트 작업을 시작한 사용자가 객체의 부분을 업로드할 수 있도록 객체에 대해 s3:PutObject 작업을 수행할 수 있는 권한을 부여해야 합니다.

파트 업로드(복사)

부분을 업로드하려면 객체에 대해 s3:PutObject 작업을 수행할 수 있어야 합니다. 기존 객체의 부분을 업로드하므로 원본 객체에 대해 s3:GetObject 작업을 수행할 수 있어야 합니다.

버킷 소유자는 객체의 멀티파트 업로드를 시작하는 사용자에게 s3:PutObject 작업을 수행할 수 있는 권한을 부여해야 합니다.

멀티파트 업로드 완료

멀티파트 업로드를 완료하려면 객체에 대해 s3:PutObject 작업을 수행할 수 있어야 합니다.

버킷 소유자는 멀티파트 작업을 시작한 사용자가 해당 객체의 멀티파트 업로드를 완료할 수 있도록 객체에 대해 s3:PutObject 작업을 수행할 수 있는 권한을 부여해야 합니다.

멀티파트 업로드 중지

멀티파트 업로드를 중단하려면 객체에 대해 s3:AbortMultipartUpload 작업을 수행할 수 있어야 합니다.

기본적으로 버킷 소유자와 멀티파트 업로드를 시작한 사용자는 이 작업을 IAM 및 버킷 정책의 일환으로 수행할 수 있어야 합니다. 시작한 사용자가 IAM 사용자인 경우 해당 사용자의 AWS 계정도 이 멀티파트 업로드를 중단할 수 있어야 합니다. VPC 엔드포인트 정책의 경우 멀티파트 업로드를 시작한 사용자는 s3:AbortMultipartUpload 작업을 자동으로 수행할 권한을 얻지 못합니다.

버킷 소유자는 이러한 기본 사용자 외 다른 주체가 객체에 대해 s3:AbortMultipartUpload 작업을 수행하도록 허가할 수 있습니다. 버킷 소유자는 다른 주체의 s3:AbortMultipartUpload 작업 수행을 거부할 수 있습니다.

파트 목록 조회

s3:ListMultipartUploadParts 작업을 수행하여 멀티파트 업로드의 각 부분을 나열할 수 있어야 합니다.

기본적으로 버킷 소유자에게는 버킷에 대한 멀티파트 업로드의 부분을 나열할 권한이 부여됩니다. 멀티파트 업로드를 시작한 사용자는 특정 멀티파트 업로드의 부분을 나열할 권한이 있습니다. 멀티파트 업로드를 시작한 사용자가 IAM 사용자인 경우 이 IAM 사용자를 제어하는 AWS 계정도 해당 업로드의 부분을 나열할 권한이 있습니다.

버킷 소유자는 이러한 기본 사용자 외 다른 주체가 객체에 대해 s3:ListMultipartUploadParts 작업을 수행하도록 허가할 수 있습니다. 버킷 소유자는 또한 다른 주체의 s3:ListMultipartUploadParts 작업 수행을 거부할 수 있습니다.

멀티파트 업로드 목록 조회

버킷에 대해 s3:ListBucketMultipartUploads 작업을 수행하여 해당 버킷에 대해 진행 중인 멀티파트 업로드를 나열할 수 있어야 합니다.

버킷 소유자는 이러한 기본 사용자 외, 다른 주체가 버킷에 대해 s3:ListBucketMultipartUploads 작업을 수행하도록 허가할 수 있습니다.

AWS KMS 암호화 및 암호 해독 관련 권한

AWS Key Management Service(AWS KMS) KMS 키를 사용하는 암호화로 멀티파트 업로드를 수행하려면 요청자에게 키에 대한 kms:Decryptkms:GenerateDataKey 작업에 대한 권한이 있어야 합니다. 요청자는 CreateMultipartUpload API 관련 kms:GenerateDataKey 작업에 대한 권한도 가지고 있어야 합니다. 또한 요청자는 UploadPartUploadPartCopy API 관련 kms:Decrypt 작업에 대한 권한이 필요합니다. 이러한 권한이 필요한 이유는 Amazon S3이 멀티파트 업로드를 완료하기 전에 암호화된 파일 부분에서 데이터를 암호 해독하고 읽어야 하기 때문입니다.

IAM 사용자 또는 역할이 KMS 키와 동일한 AWS 계정에 있는 경우 키 정책에 대한 이러한 권한이 있어야 합니다. IAM 사용자 또는 역할이 KMS 키와 다른 계정에 속한 경우, 키 정책과 IAM 사용자 또는 역할 모두에 대한 권한이 있어야 합니다.

ACL 권한 및 액세스 정책의 권한 간 관계에 대한 자세한 내용은 ACL 권한과 액세스 정책 권한의 매핑 단원을 참조하십시오. IAM 사용자, 역할 및 모범 사례에 대한 자세한 내용은 IAM 사용 설명서의 IAM 자격 증명(사용자, 사용자 그룹 및 역할)을 참조하십시오.