객체 복사 - Amazon Simple Storage Service

객체 복사

복사 작업은 Amazon S3에 이미 저장되어 있는 객체의 복사본을 만듭니다.

단일 원자성 작업으로 최대 5GB의 객체 복사본을 만들 수 있습니다. 그러나 5GB보다 큰 객체를 복사하려면 멀티파트 업로드 API를 사용해야 합니다.

copy를 사용하여 다음과 같은 작업을 수행할 수 있습니다.

  • 객체의 추가 복사본 생성

  • 객체를 복사하여 이름을 변경한 후 원본 삭제

  • 객체를 다른 Amazon S3 위치로 이동(예: us-west-1에서 유럽으로 이동)

  • 객체 메타데이터 변경

    각 Amazon S3 객체에는 메타데이터가 있습니다. 이름-값 페어의 집합으로 표시됩니다. 객체를 업로드할 때 객체 메타데이터를 설정할 수 있습니다. 객체를 업로드한 후에는 객체 메타데이터를 변경할 수 없습니다. 객체 메타데이터를 수정할 수 있는 유일한 방법은 객체 복사본을 만든 후 메타데이터를 설정하는 것입니다. 이때 복사 작업의 원본과 대상을 동일한 객체로 설정합니다.

각 객체에는 메타데이터가 있으며, 시스템 메타데이터와 사용자 정의 메타데이터의 두 종류 메타데이터가 있습니다. 객체에 대해 사용하도록 구성된 스토리지 클래스, 서버 측 암호화와 같은 일부 시스템 메타데이터는 사용자가 제어할 수 있습니다. 객체를 복사할 때 사용자 제어 시스템 메타데이터와 사용자 정의 메타데이터는 복사되지만, 시스템 제어 메타데이터는 Amazon S3에 의해 재설정됩니다. 예를 들어 객체를 복사할 때 Amazon S3는 복사된 객체의 생성일을 재설정합니다. 복사 요청에서 이러한 값을 설정할 필요가 없습니다.

객체를 복사할 때 일부 메타데이터 값을 업데이트할 수 있습니다. 예를 들어, 원본 객체가 표준 스토리지를 사용하도록 구성된 경우 복사된 객체에 대해서는 RRS(Reduced redundancy storage)를 사용하도록 선택할 수 있습니다. 또한 원본 객체에 설정된 일부 사용자 정의 메타데이터 값을 변경할 수도 있습니다. 복사 과정에서 이처럼 사용자가 구성 가능한 객체 메타데이터(시스템 또는 사용자 정의 메타데이터)를 업데이트하려면 일부 메타데이터 값만 변경하려는 경우에도 요청의 원본 객체에 설정된 사용자가 구성 가능한 모든 메타데이터를 명시적으로 지정해야 합니다.

객체 메타데이터에 대한 자세한 내용은 객체 메타데이터 작업 단원을 참조하세요.

참고

객체를 복사할 때 Amazon S3에서 AWS KMS key, Amazon S3 관리형 암호화 키 또는 고객 제공 암호화 키를 사용하여 암호화한 대상 객체를 저장하도록 요청할 수 있습니다. 그러려면 요청에 암호화 정보를 지정해야 합니다. 복사 원본이 고객 제공 키를 사용한 서버 측 암호화로 Amazon S3에 저장된 객체인 경우 요청에 암호화 정보를 제공해야 Amazon S3가 객체를 해독하여 복사할 수 있습니다. 자세한 내용은 암호화를 사용하여 데이터 보호 섹션을 참조하세요.

단일 요청으로 둘 이상의 Amazon S3 객체를 복사하기 위해 Amazon S3 배치 작업을 사용할 수 있습니다. 작업할 객체 목록을 S3 배치 작업에 제공합니다. S3 배치 작업은 지정된 작업을 수행하기 위해 각 API를 호출합니다. 단일 배치 작업 건으로 엑사바이트 규모의 데이터가 포함된 수십억 개의 객체에서 지정된 작업을 수행할 수 있습니다.

S3 Batch Operations 기능은 진행 상황을 추적하고 알림을 보내며 모든 작업에 대한 자세한 완료 보고서를 저장하여 감사 가능한 완전관리형 서버리스 환경을 제공합니다. AWS Management Console, AWS CLI, AWS SDK 또는 REST API를 통해 S3 Batch Operations를 사용할 수 있습니다. 자세한 내용은 S3 배치 작업 기본 사항 섹션을 참조하세요.

객체를 복사하려면

객체를 복사하려면 아래 예제를 사용합니다.

S3 콘솔에서 객체를 복사하거나 이동할 수 있습니다. 자세한 내용은 아래 절차를 참조하세요.

객체를 복사하려면

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 복사할 객체가 포함된 Amazon S3 버킷 또는 폴더로 이동합니다.

  3. 복사할 객체 이름 왼쪽에 있는 확인란을 선택합니다.

  4. 작업(Actions)을 선택한 후 표시되는 옵션 목록에서 복사(Copy)를 선택합니다.

    또는 오른쪽 위에 있는 옵션에서 복사를 선택합니다.

  5. 대상 유형과 대상 계정을 선택합니다. 대상 경로를 지정하려면 S3 찾아보기를 선택하고 대상으로 이동한 후 대상 왼쪽에 있는 확인란을 선택합니다. 오른쪽 하단에서 대상 선택(Choose destination)을 선택합니다.

    또는 대상 경로를 입력합니다.

  6. 버킷 버전 관리를 활성화하지 않은 경우 이름이 같은 기존 객체를 덮어쓴다는 메시지가 표시될 수 있습니다. 괜찮으면 확인란을 선택하고 계속 진행합니다. 객체의 모든 버전을 이 버킷에 보관하려면 버킷 버전 관리 활성화(Enable Bucket Versioning)를 선택합니다. 기본 암호화 및 객체 잠금 속성을 업데이트할 수도 있습니다.

  7. 오른쪽 하단에서 복사를 선택하면 Amazon S3가 객체를 대상으로 이동합니다.

객체를 이동하려면

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 이동할 객체가 포함된 Amazon S3 버킷 또는 폴더로 이동합니다.

  3. 이동할 객체의 이름 왼쪽에 있는 확인란을 선택합니다.

  4. 작업(Actions)을 선택한 후 표시되는 옵션 목록에서 삭제(Delete)를 선택합니다.

    또는 오른쪽 상단의 옵션에서 이동(Move)을 선택합니다.

  5. 대상 경로를 지정하려면 S3 찾아보기를 선택하고 대상으로 이동한 후 대상 왼쪽에 있는 확인란을 선택합니다. 오른쪽 하단에서 대상 선택(Choose destination)을 선택합니다.

    또는 대상 경로를 입력합니다.

  6. 버킷 버전 관리를 활성화하지 않은 경우 이름이 같은 기존 객체를 덮어쓴다는 메시지가 표시될 수 있습니다. 괜찮으면 확인란을 선택하고 계속 진행합니다. 객체의 모든 버전을 이 버킷에 보관하려면 버킷 버전 관리 활성화(Enable Bucket Versioning)를 선택합니다. 기본 암호화 및 객체 잠금 속성을 업데이트할 수도 있습니다.

  7. 오른쪽 하단에서 이동(Move)을 선택하면 Amazon S3가 객체를 대상으로 이동합니다.

참고
  • 이 작업은 업데이트된 설정으로 지정된 모든 객체의 복사본을 만들고, 지정된 위치에서 마지막으로 수정한 날짜를 업데이트하며, 원본 객체에 삭제 마커를 추가합니다.

  • 폴더를 이동할 때 폴더를 추가로 변경하기 전에 이동 작업이 완료될 때까지 기다립니다.

  • 고객 제공 암호화 키(SSE-C)로 암호화된 객체는 S3 콘솔을 사용하여 복사할 수 없습니다. SSE-C로 암호화된 객체를 복사하려면 AWS CLI, AWS SDK 또는 Amazon S3 REST API를 사용합니다.

  • 이 작업은 버킷 버전 관리, 암호화, 객체 잠금 기능 및 보관된 객체에 대한 메타데이터를 업데이트합니다.

이 단원의 예제에서는 단일 작업으로 최대 5GB의 객체를 복사하는 방법을 보여줍니다. 5GB보다 큰 객체를 복사하려면 멀티파트 업로드 API를 사용해야 합니다. 자세한 내용은 멀티파트 업로드를 사용한 객체 복사 섹션을 참조하세요.

Java

다음 예제에서는 AWS SDK for Java를 사용하여 Amazon S3에서 객체를 복사합니다. 실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 Amazon S3 Java 코드 예제 테스트 섹션을 참조하세요.

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.CopyObjectRequest; import java.io.IOException; public class CopyObjectSingleOperation { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; String sourceKey = "*** Source object key *** "; String destinationKey = "*** Destination object key ***"; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Copy the object into a new object in the same bucket. CopyObjectRequest copyObjRequest = new CopyObjectRequest(bucketName, sourceKey, bucketName, destinationKey); s3Client.copyObject(copyObjRequest); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } } }
.NET

다음 C# 예제에서는 상위 수준의 AWS SDK for .NET을 사용하여 단일 작업으로 최대 5GB의 객체를 복사합니다. 5GB보다 큰 객체의 경우 멀티파트 업로드를 사용한 객체 복사에 설명된 멀티파트 업로드 복사 예제를 참조하세요.

이 예제에서는 최대 5GB의 객체 복사본을 만듭니다. 특정 버전의 AWS SDK for .NET에서의 예제 호환성 및 실제 예제를 작성하여 테스트하는 방법에 대한 자세한 내용은 Amazon S3 .NET 코드 예제 실행 섹션을 참조하세요.

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class CopyObjectTest { private const string sourceBucket = "*** provide the name of the bucket with source object ***"; private const string destinationBucket = "*** provide the name of the bucket to copy the object to ***"; private const string objectKey = "*** provide the name of object to copy ***"; private const string destObjectKey = "*** provide the destination object key name ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 s3Client; public static void Main() { s3Client = new AmazonS3Client(bucketRegion); Console.WriteLine("Copying an object"); CopyingObjectAsync().Wait(); } private static async Task CopyingObjectAsync() { try { CopyObjectRequest request = new CopyObjectRequest { SourceBucket = sourceBucket, SourceKey = objectKey, DestinationBucket = destinationBucket, DestinationKey = destObjectKey }; CopyObjectResponse response = await s3Client.CopyObjectAsync(request); } catch (AmazonS3Exception e) { Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message); } } } }
PHP

이 주제에서는 AWS SDK for PHP 버전 3의 클래스를 사용하여 Amazon S3 내 단일 객체 및 여러 객체를 한 버킷에서 다른 버킷으로 또는 동일한 버킷 내에서 복사하는 방법을 보여줍니다.

이 주제에서는 이미 AWS SDK for PHP 사용 및 PHP 예제 실행의 지침에 따라 AWS SDK for PHP가 올바르게 설치되어 있다고 가정합니다.

다음 PHP 예제는 copyObject() 메서드를 사용하여 Amazon S3 내에서 단일 객체를 복사하고 CopyObject 메서드를 사용한 getcommand() 일괄 호출을 통해 객체의 여러 복사본을 만드는 과정을 보여줍니다.

1

Aws\S3\S3Client 클래스 생성자를 사용하여 Amazon S3 클라이언트의 인스턴스를 만듭니다.

2

객체에 대해 여러 복사본을 만들려면 Aws\CommandInterface 클래스에서 상속되는 Amazon S3 클라이언트의 getCommand() 메서드에 대한 일괄 호출을 실행합니다. 첫 번째 인수로 CopyObject 명령을, 두 번째 인수로 원본 버킷, 원본 키 이름, 대상 버킷, 대상 키 이름이 포함된 배열을 제공합니다.

require 'vendor/autoload.php'; use Aws\S3\S3Client; $sourceBucket = '*** Your Source Bucket Name ***'; $sourceKeyname = '*** Your Source Object Key ***'; $targetBucket = '*** Your Target Bucket Name ***'; $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1' ]); // Copy an object. $s3->copyObject([ 'Bucket' => $targetBucket, 'Key' => "{$sourceKeyname}-copy", 'CopySource' => "{$sourceBucket}/{$sourceKeyname}", ]); // Perform a batch of CopyObject operations. $batch = array(); for ($i = 1; $i <= 3; $i++) { $batch[] = $s3->getCommand('CopyObject', [ 'Bucket' => $targetBucket, 'Key' => "{targetKeyname}-{$i}", 'CopySource' => "{$sourceBucket}/{$sourceKeyname}", ]); } try { $results = CommandPool::batch($s3, $batch); foreach($results as $result) { if ($result instanceof ResultInterface) { // Result handling here } if ($result instanceof AwsException) { // AwsException handling here } } } catch (\Exception $e) { // General error handling here }
Ruby

다음 작업은 Ruby 클래스를 사용하여 한 버킷에서 다른 버킷 또는 동일한 버킷으로 Amazon S3의 객체를 복사하는 방법을 보여줍니다.

1

AWS SDK for Ruby 버전 3에 대해 모듈화된 Amazon S3 gem을 사용하고 'aws-sdk-s3'를 요구하고 AWS 자격 증명을 제공합니다. 자격 증명을 제공하는 방법에 관한 자세한 내용은 AWS 계정 또는 IAM 사용자 자격 증명을 사용하여 요청 단원을 참조하세요.

2

원본 버킷 이름, 원본 키 이름, 대상 버킷 이름, 대상 키 등의 요청 정보를 제공합니다.

다음 Ruby 코드 예제는 #copy_object 메서드를 사용하여 앞서 설명한, 한 버킷에서 다른 버킷으로 객체를 복사하는 작업을 수행하는 방법을 보여줍니다.

require 'aws-sdk-s3' # Copies an object from one Amazon S3 bucket to another. # # Prerequisites: # # - Two S3 buckets (a source bucket and a target bucket). # - An object in the source bucket to be copied. # # @param s3_client [Aws::S3::Client] An initialized Amazon S3 client. # @param source_bucket_name [String] The source bucket's name. # @param source_key [String] The name of the object # in the source bucket to be copied. # @param target_bucket_name [String] The target bucket's name. # @param target_key [String] The name of the copied object. # @return [Boolean] true if the object was copied; otherwise, false. # @example # s3_client = Aws::S3::Client.new(region: 'us-east-1') # exit 1 unless object_copied?( # s3_client, # 'doc-example-bucket1', # 'my-source-file.txt', # 'doc-example-bucket2', # 'my-target-file.txt' # ) def object_copied?( s3_client, source_bucket_name, source_key, target_bucket_name, target_key) return true if s3_client.copy_object( bucket: target_bucket_name, copy_source: source_bucket_name + '/' + source_key, key: target_key ) rescue StandardError => e puts "Error while copying object: #{e.message}" end

이 예제에서는 REST를 사용하여 객체를 복사하는 방법을 보여줍니다. REST API에 대한 자세한 내용은 PUT Object(Copy) 단원을 참조하세요.

이 예제는 메타데이터를 유지하면서 flotsam 버킷의 pacific 객체를 jetsam 버킷의 atlantic 객체로 복사합니다.

PUT /jetsam HTTP/1.1 Host: atlantic.s3.amazonaws.com x-amz-copy-source: /pacific/flotsam Authorization: AWS AKIAIOSFODNN7EXAMPLE:ENoSbxYByFA0UGLZUqJN5EUnLDg= Date: Wed, 20 Feb 2008 22:12:21 +0000

다음 정보에 따라 서명이 생성됩니다.

PUT\r\n \r\n \r\n Wed, 20 Feb 2008 22:12:21 +0000\r\n x-amz-copy-source:/pacific/flotsam\r\n /atlantic/jetsam

Amazon S3는 객체의 ETag와 최종 수정 일시를 지정하는 다음 응답을 반환합니다.

HTTP/1.1 200 OK x-amz-id-2: Vyaxt7qEbzv34BnSu5hctyyNSlHTYZFMWK4FtzO+iX8JQNyaLdTshL0KxatbaOZt x-amz-request-id: 6B13C3C5B34AF333 Date: Wed, 20 Feb 2008 22:13:01 +0000 Content-Type: application/xml Transfer-Encoding: chunked Connection: close Server: AmazonS3 <?xml version="1.0" encoding="UTF-8"?> <CopyObjectResult> <LastModified>2008-02-20T22:13:01</LastModified> <ETag>"7e9c608af58950deeb370c98608ed097"</ETag> </CopyObjectResult>