객체 복사 - Amazon Simple Storage Service

객체 복사

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

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

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

  • 객체의 추가 복사본 생성

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

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

  • 객체 메타데이터 변경

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

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

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

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

참고
  • 서로 다른 위치로 객체를 복사할 경우 대역폭 비용이 청구됩니다.

  • 소스 객체가 S3 Glacier Flexible Retrieval 또는 S3 Glacier Deep Archive에 아카이브되어 있는 경우 객체를 다른 버킷에 복사하기 전에 먼저 임시 복사본을 복원해야 합니다. 객체 보관에 대한 자세한 내용은 S3 Glacier Flexible Retrieval 및 S3 Glacier Deep Archive 스토리지 클래스로 전환(객체 아카이브) 단원을 참조하십시오.

  • 복원된 객체에 대한 복사 작업은 Amazon S3 콘솔에서 S3 Glacier 유연한 검색 또는 S3 Glacier Deep Archive 스토리지 클래스에 있는 객체에 대해 지원되지 않습니다. 이러한 유형의 복사 작업에는 AWS Command Line Interface(AWS CLI), AWS SDK 또는 REST API를 사용하십시오.

Amazon S3는 S3 버킷에 복사되는 모든 새 객체를 자동으로 암호화합니다. 복사 요청에서 암호화 정보를 지정하지 않은 경우 대상 객체의 암호화 설정이 대상 버킷의 기본 암호화 구성으로 설정됩니다. 기본적으로 모든 버킷은 Amazon S3 관리형 키(SSE-S3)를 통한 서버 측 암호화를 사용하는 기본 수준의 암호화 구성을 가지고 있습니다. 대상 버킷에 AWS Key Management Service(AWS KMS) 키(SSE-KMS) 또는 고객 제공 암호화 키(SSE-C)를 통한 서버 측 암호화를 사용하는 기본 암호화 구성이 있는 경우, Amazon S3는 해당 KMS 키 또는 고객이 제공한 키를 사용하여 대상 객체 사본을 암호화합니다. 객체를 복사할 때 대상 객체에 다른 유형의 암호화 설정을 사용하려면 Amazon S3가 KMS 키, Amazon S3 관리형 키 또는 고객 제공 키를 사용하여 대상 객체를 암호화하도록 요청할 수 있습니다. 요청의 암호화 설정이 대상 버킷의 기본 암호화 구성과 다른 경우 요청의 암호화 설정이 우선합니다. 사본의 소스 객체가 SSE-C를 사용하는 Amazon S3에 저장된 경우, Amazon s3가 복사를 위해 객체를 해독할 수 있도록 필요한 암호화 정보를 요청에 제공해야 합니다. 자세한 내용은 암호화로 데이터 보호 단원을 참조하십시오.

객체를 복사할 때 객체에 대해 다른 체크섬 알고리즘을 사용하도록 선택할 수 있습니다. 동일한 알고리즘을 사용하든 새 알고리즘을 사용하든 Amazon S3는 객체를 복사한 후 새 체크섬 값을 계산합니다. Amazon S3에서는 체크섬 값을 직접 복사하지 않습니다. 멀티파트 업로드를 사용하여 로드된 객체의 체크섬 값이 변경될 수 있습니다. 체크섬 계산에 대한 자세한 내용은 멀티파트 업로드에 부분 수준의 체크섬 사용 단원을 참조하십시오.

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

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

참고

Amazon S3 Express One Zone 스토리지 클래스를 디렉터리 버킷과 함께 사용하는 방법에 대한 자세한 내용은 S3 Express One Zone이란?디렉터리 버킷 섹션을 참조하세요. 객체를 디렉터리 버킷으로 복사하는 방법에 대한 자세한 내용은 디렉터리 버킷에 객체 복사 섹션을 참조하세요.

객체 복사

객체를 복사하려면 다음 메서드를 사용합니다.

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

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

  • Amazon S3 콘솔을 사용하여 객체를 복사할 때는 s3:ListAllMyBuckets 권한을 부여해야 합니다. 콘솔에서 복사 작업을 검증하려면 이 권한이 필요합니다.

  • Amazon S3 콘솔에서는 AWS KMS 암호화된 객체의 교차 지역 복사가 지원되지 않습니다.

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

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

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

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

    또는 오른쪽 상단 모서리에 있는 옵션에서 복사(Copy)를 선택합니다.

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

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

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

  7. 추가 체크섬(Additional checksums)에서 기존 체크섬 함수를 사용하여 객체를 복사할지 아니면 기존 체크섬 함수를 새 체크섬 함수로 교체할지를 선택합니다. 객체를 업로드할 때 데이터 무결성을 확인하는 데 사용된 체크섬 알고리즘을 지정하는 옵션이 있었습니다. 객체를 복사할 때는 새 함수를 선택할 수 있는 옵션이 있습니다. 원래 추가 체크섬을 지정하지 않은 경우 복사 옵션의 이 섹션을 사용하여 체크섬을 추가할 수 있습니다.

    참고

    동일한 체크섬 함수를 사용하도록 선택하더라도 객체를 복사하고 객체 크기가 16MB를 초과하면 체크섬 값이 변경될 수 있습니다. 멀티파트 업로드에 대해 체크섬이 계산되는 방식 때문에 체크섬 값이 변경될 수 있습니다. 객체를 복사할 때 어떻게 하면 체크섬이 변경될 수 있는지에 대한 자세한 내용은 멀티파트 업로드에 부분 수준의 체크섬 사용 단원을 참조하십시오.

    체크섬 함수를 변경하려면 새 체크섬 함수로 교체(Replace with a new checksum function)를 선택합니다. 상자에서 새 체크섬 함수를 선택합니다. 객체를 복사하면 지정된 알고리즘을 사용하여 새 체크섬이 계산되고 저장됩니다.

  8. 오른쪽 하단 모서리에서 복사(Copy)를 선택합니다. 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가 객체를 대상으로 이동합니다.

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

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

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

이 섹션의 예제에서는 단일 작업으로 최대 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 내에서 단일 객체를 복사하고 getcommand() 메서드를 사용한 CopyObject 일괄 호출을 통해 객체의 여러 복사본을 만드는 과정을 보여줍니다.

1

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

2

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

require 'vendor/autoload.php'; use Aws\CommandPool; use Aws\Exception\AwsException; use Aws\ResultInterface; 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 }
Python
class ObjectWrapper: """Encapsulates S3 object actions.""" def __init__(self, s3_object): """ :param s3_object: A Boto3 Object resource. This is a high-level resource in Boto3 that wraps object actions in a class-like structure. """ self.object = s3_object self.key = self.object.key
def copy(self, dest_object): """ Copies the object to another bucket. :param dest_object: The destination object initialized with a bucket and key. This is a Boto3 Object resource. """ try: dest_object.copy_from( CopySource={"Bucket": self.object.bucket_name, "Key": self.object.key} ) dest_object.wait_until_exists() logger.info( "Copied object from %s:%s to %s:%s.", self.object.bucket_name, self.object.key, dest_object.bucket_name, dest_object.key, ) except ClientError: logger.exception( "Couldn't copy object from %s/%s to %s/%s.", self.object.bucket_name, self.object.key, dest_object.bucket_name, dest_object.key, ) raise
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" # Wraps Amazon S3 object actions. class ObjectCopyWrapper attr_reader :source_object # @param source_object [Aws::S3::Object] An existing Amazon S3 object. This is used as the source object for # copy actions. def initialize(source_object) @source_object = source_object end # Copy the source object to the specified target bucket and rename it with the target key. # # @param target_bucket [Aws::S3::Bucket] An existing Amazon S3 bucket where the object is copied. # @param target_object_key [String] The key to give the copy of the object. # @return [Aws::S3::Object, nil] The copied object when successful; otherwise, nil. def copy_object(target_bucket, target_object_key) @source_object.copy_to(bucket: target_bucket.name, key: target_object_key) target_bucket.object(target_object_key) rescue Aws::Errors::ServiceError => e puts "Couldn't copy #{@source_object.key} to #{target_object_key}. Here's why: #{e.message}" end end # Example usage: def run_demo source_bucket_name = "doc-example-bucket1" source_key = "my-source-file.txt" target_bucket_name = "doc-example-bucket2" target_key = "my-target-file.txt" source_bucket = Aws::S3::Bucket.new(source_bucket_name) wrapper = ObjectCopyWrapper.new(source_bucket.object(source_key)) target_bucket = Aws::S3::Bucket.new(target_bucket_name) target_object = wrapper.copy_object(target_bucket, target_key) return unless target_object puts "Copied #{source_key} from #{source_bucket_name} to #{target_object.bucket_name}:#{target_object.key}." end run_demo if $PROGRAM_NAME == __FILE__

이 예제에서는 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>

또한, AWS Command Line Interface(AWS CLI)를 사용하여 S3 객체를 생성할 수도 있습니다. 자세한 내용은 AWS CLI 명령 레퍼런스의 copy-object를 참조하세요.

AWS CLI에 대한 자세한 내용은 AWS Command Line Interface 사용 설명서AWS Command Line Interface란 무엇입니까?를 참조하세요.