Amazon Simple Storage Service
개발자 안내서 (API 버전 2006-03-01)

예제 1: 원본 버킷과 대상 버킷을 동일한 AWS 계정에서 소유한 경우 CRR 구성

이 예제에서는 원본 버킷과 대상 버킷을 동일한 AWS 계정에서 소유한 교차 리전 복제(CRR)를 설정합니다. Amazon S3 콘솔, AWS Command Line Interface(AWS CLI) 및 AWS SDK for Java/.NET용 AWS SDK를 사용한 예제가 제공됩니다.

항목

    원본 버킷과 대상 버킷을 동일한 AWS 계정에서 소유한 경우 CRR 구성(콘솔)

    단계별 지침은 Amazon Simple Storage Service 콘솔 사용 설명서S3 버킷에 교차 리전 복제(CRR) 규칙을 추가하려면? 단원을 참조하십시오. 이 주제에서는 버킷을 동일한 AWS 계정이 소유한 경우와 서로 다른 AWS 계정이 소유한 경우에 복제 구성을 설정하는 지침을 제공합니다.

    원본 버킷과 대상 버킷을 동일한 AWS 계정에서 소유한 경우 CRR 구성(AWS CLI)

    원본 버킷과 대상 버킷을 동일한 AWS 계정이 소유한 경우 AWS CLI를 사용하여 CRR을 설정하려면 원본 및 대상 버킷을 생성하고, 이들 버킷에서 버전 관리를 활성화하고, Amazon S3에 객체를 복제할 권한을 부여하는 IAM 역할을 생성하고, 복제 구성을 원본 버킷에 추가합니다. 설정을 확인하려면 테스트합니다.

    원본 버킷과 대상 버킷을 동일한 AWS 계정에서 소유한 경우 CRR 복제를 설정하려면

    1. AWS CLI 자격 증명 프로필을 설정합니다. 이 예제에서는 프로필 이름 acctA를 사용합니다. 자격 증명 프로필 설정에 대한 자세한 내용은 AWS Command Line Interface 사용 설명서명명된 프로필 단원을 참조하십시오.

      중요

      이 연습에 사용하는 프로필에 필요한 권한이 있어야 합니다. 예를 들어 복제 구성에서 Amazon S3가 맡을 수 있는 IAM 역할을 지정합니다. 사용하는 프로필에 iam:PassRole 권한이 있을 경우 이 권한만 사용할 수 있습니다. 자세한 내용은 IAM 사용 설명서사용자에게 AWS 서비스에 역할을 전달할 수 있는 권한 부여 단원을 참조하십시오. 관리자 사용자 자격 증명을 사용하여 명명된 프로필을 생성할 경우 모든 작업을 수행할 수 있습니다.

    2. 원본 버킷을 생성하고 버킷에서 버전 관리를 활성화합니다. 다음 코드는 미국 동부(버지니아 북부)(us-east-1) 리전에 원본 버킷을 생성합니다.

      aws s3api create-bucket \ --bucket source \ --region us-east-1 \ --profile acctA
      aws s3api put-bucket-versioning \ --bucket source \ --versioning-configuration Status=Enabled \ --profile acctA
    3. 대상 버킷을 생성하고 버킷에서 버전 관리를 활성화합니다. 다음 코드는 미국 서부(오레곤)(us-west-2) 리전에 대상 버킷을 생성합니다.

      참고

      원본 버킷과 대상 버킷이 모두 동일한 AWS 계정에 있을 때 복제 구성을 설정하려면 동일한 프로필을 사용합니다. 이 예제에서는 [acctA]을 사용합니다. 두 버킷을 서로 다른 AWS 계정에서 소유한 경우의 복제 구성을 테스트하려면 각각 다른 프로필을 지정합니다. 이 예제에서는 대상 버킷에 대한 acctB 프로필을 사용합니다.

      aws s3api create-bucket \ --bucket destination \ --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2 \ --profile acctA
      aws s3api put-bucket-versioning \ --bucket destination \ --versioning-configuration Status=Enabled \ --profile acctA
    4. IAM 역할을 생성합니다. 나중에 원본 버킷에 추가하는 복제 구성에서 이 역할을 지정합니다. Amazon S3가 사용자 대신 객체를 복제하기 위해 이 역할을 맡습니다. IAM 역할을 두 단계로 생성합니다.

      • 역할 생성

      • 역할에 권한 정책을 연결합니다.

      1. IAM 역할을 생성합니다.

        1. 다음 신뢰 정책을 복사하여 로컬 컴퓨터의 현재 디렉터리에 S3-role-trust-policy.json 파일로 저장합니다. 이 정책은 Amazon S3 서비스 보안 주체에 역할을 맡을 권한을 부여합니다.

          { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "Service":"s3.amazonaws.com" }, "Action":"sts:AssumeRole" } ] }
        2. 다음 명령을 실행해 역할을 생성합니다.

          $ aws iam create-role \ --role-name crrRole \ --assume-role-policy-document file://s3-role-trust-policy.json \ --profile acctA
      2. 역할에 권한 정책을 연결합니다.

        1. 다음 권한 정책을 복사하여 로컬 컴퓨터의 현재 디렉터리에 S3-role-permissions-policy.json 파일로 저장합니다. 이 정책은 다양한 Amazon S3 버킷 및 객체 작업에 대한 권한을 부여합니다.

          { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "s3:GetObjectVersionForReplication", "s3:GetObjectVersionAcl" ], "Resource":[ "arn:aws:s3:::source-bucket/*" ] }, { "Effect":"Allow", "Action":[ "s3:ListBucket", "s3:GetReplicationConfiguration" ], "Resource":[ "arn:aws:s3:::source-bucket" ] }, { "Effect":"Allow", "Action":[ "s3:ReplicateObject", "s3:ReplicateDelete", "s3:ReplicateTags", "s3:GetObjectVersionTagging" ], "Resource":"arn:aws:s3:::destination-bucket/*" } ] }
        2. 다음 명령을 실행하여 정책을 생성하고 역할에 연결합니다.

          $ aws iam put-role-policy \ --role-name crrRole \ --policy-document file://s3-role-permissions-policy.json \ --policy-name crrRolePolicy \ --profile acctA
    5. 원본 버킷에 복제 구성을 추가합니다.

      1. Amazon S3 API는 XML 형식의 복제 구성을 요구하지만, AWS CLI는 JSON으로 지정된 복제 구성을 요구합니다. 다음 JSON을 로컬 컴퓨터의 현재 디렉터리에 replication.json 파일로 저장합니다.

        { "Role": "IAM-role-ARN", "Rules": [ { "Status": "Enabled", "Priority": "1", "DeleteMarkerReplication": { "Status": "Disabled" }, "Filter" : { "Prefix": "Tax"}, "Destination": { "Bucket": "arn:aws:s3:::destination-bucket" } } ] }
      2. destination-bucketIAM-role-ARN에 값을 제공하여 JSON을 업데이트합니다. 변경 사항을 저장합니다.

      3. 다음 명령을 실행하여 원본 버킷에 복제 구성을 추가합니다. 반드시 source-bucket 이름을 제공해야 합니다.

        $ aws s3api put-bucket-replication \ --replication-configuration file://replication.json \ --bucket source \ --profile acctA

      복제 구성을 검색하려면 get-bucket-replication 명령을 사용합니다.

      $ aws s3api get-bucket-replication \ --bucket source \ --profile acctA
    6. Amazon S3 콘솔에서 설정을 테스트합니다.

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

      2. 원본 버킷에서 Tax 폴더를 생성합니다.

      3. 원본 버킷의 Tax 폴더에 샘플 객체를 추가합니다.

        참고

        Amazon S3가 객체를 복제하는 데 걸리는 시간은 객체 크기에 따라 다릅니다. 복제 상태를 확인하는 자세한 내용은 교차 리전 복제 상태 정보 단원을 참조하십시오.

        대상 버킷에서 다음을 확인합니다.

        • Amazon S3가 객체를 복제함.

        • 객체 속성에서, 복제 상태Replica로 설정됨(이 객체를 복제본 객체로 식별).

        • 객체 속성에서, 권한 섹션에 아무 권한이 없음. 이는 복제본이 여전히 원본 버킷 소유자의 소유이고 대상 버킷 소유자는 객체 복제본에 대한 권한이 없음을 의미합니다. Amazon S3에 복제본 소유권을 변경하도록 지시하는 선택적 구성을 추가할 수 있습니다. 문제 해결 예는 예제 3: 원본 버킷과 대상 버킷을 서로 다른 AWS 계정에서 소유한 경우 복제본 소유자 변경 단원을 참조하십시오.

          
                                            복제 상태 및 권한을 보여 주는 객체 속성의 스크린샷
      4. 원본 버킷의 객체 ACL을 업데이트하고, 대상 버킷에 변경 내용이 나타나는지 확인합니다.

        지침은 Amazon Simple Storage Service 콘솔 사용 설명서객체에 대한 권한은 어떻게 설정하나요? 단원을 참조하십시오.

    원본 버킷과 대상 버킷을 동일한 AWS 계정에서 소유한 경우 CRR 구성(AWS SDK)

    다음 코드 예제를 사용하여 AWS SDK for Java 및 .NET용 AWS SDK를 각각 사용하여 버킷에 복제 구성을 추가합니다.

    JavaC#
    Java

    다음 예에서는 버킷에 복제 구성을 추가한 후 해당 구성을 검색 및 확인합니다. 실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 Amazon S3 Java 코드 예제 테스트 단원을 참조하십시오.

    // Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-s3-developer-guide/blob/master/LICENSE-SAMPLECODE.) import java.io.IOException; import java.util.HashMap; import java.util.Map; import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.BucketReplicationConfiguration; import com.amazonaws.services.s3.model.ReplicationDestinationConfig; import com.amazonaws.services.s3.model.ReplicationRule; import com.amazonaws.services.s3.model.ReplicationRuleStatus; import com.amazonaws.services.s3.model.StorageClass; public class CrossRegionReplication { public static void main(String[] args) throws IOException { String clientRegion = "*** Client region ***"; String accountId = "*** Account ID ***"; String roleName = "*** Role name ***"; String sourceBucketName = "*** Source bucket name ***"; String destBucketName = "*** Destination bucket name ***"; String prefix = "Tax/"; String roleARN = String.format("arn:aws:iam::%s:role/%s", accountId, roleName); String destinationBucketARN = "arn:aws:s3:::" + destBucketName; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); // Create the replication rule. List<ReplicationFilterPredicate> andOperands = new ArrayList<ReplicationFilterPredicate>(); andOperands.add(new ReplicationPrefixPredicate("prefix")); Map<String, ReplicationRule> replicationRules = new HashMap<String, ReplicationRule>(); replicationRules.put("ReplicationRule1", new ReplicationRule() .withPriority(0) .withStatus(ReplicationRuleStatus.Enabled) .withDeleteMarkerReplication(new DeleteMarkerReplication().withStatus(DeleteMarkerReplicationStatus.DISABLED)) .withFilter(new ReplicationFilter().withPredicate(new ReplicationAndOperator(andOperands))) .withDestinationConfig(new ReplicationDestinationConfig() .withBucketARN(destinationBucketARN) .withStorageClass(StorageClass.Standard))); // Save the replication rule to the source bucket. s3Client.setBucketReplicationConfiguration(sourceBucketName, new BucketReplicationConfiguration() .withRoleARN(roleARN) .withRules(replicationRules)); // Retrieve the replication configuration and verify that the configuration // matches the rule we just set. BucketReplicationConfiguration replicationConfig = s3Client.getBucketReplicationConfiguration(sourceBucketName); ReplicationRule rule = replicationConfig.getRule("ReplicationRule1"); System.out.println("Retrieved destination bucket ARN: " + rule.getDestinationConfig().getBucketARN()); System.out.println("Retrieved source-bucket replication rule prefix: " + rule.getPrefix()); System.out.println("Retrieved source-bucket replication rule status: " + rule.getStatus()); } 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(); } } }
    C#

    다음은 버킷에 복제 구성을 추가한 다음 해당 구성을 검색하는 .NET용 AWS SDK 코드의 예입니다. 이 코드를 사용하려면 버킷 이름과 IAM 역할의 Amazon 리소스 이름(ARN)을 제공합니다. 실제 예제를 작성하여 테스트하는 방법에 대한 자세한 내용은 Amazon S3 .NET 코드 예시 실행 단원을 참조하십시오.

    // Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: MIT-0 (For details, see https://github.com/awsdocs/amazon-s3-developer-guide/blob/master/LICENSE-SAMPLECODE.) using Amazon.S3; using Amazon.S3.Model; using System; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class CrossRegionReplicationTest { private const string sourceBucket = "*** source bucket ***"; // Bucket ARN example - arn:aws:s3:::destinationbucket private const string destinationBucketArn = "*** destination bucket ARN ***"; private const string roleArn = "*** IAM Role ARN ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint sourceBucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 s3Client; public static void Main() { s3Client = new AmazonS3Client(sourceBucketRegion); EnableReplicationAsync().Wait(); } static async Task EnableReplicationAsync() { try { ReplicationConfiguration replConfig = new ReplicationConfiguration { Role = roleArn, Rules = { new ReplicationRule { Prefix = "Tax", Status = ReplicationRuleStatus.Enabled, Destination = new ReplicationDestination { BucketArn = destinationBucketArn } } } }; PutBucketReplicationRequest putRequest = new PutBucketReplicationRequest { BucketName = sourceBucket, Configuration = replConfig }; PutBucketReplicationResponse putResponse = await s3Client.PutBucketReplicationAsync(putRequest); // Verify configuration by retrieving it. await RetrieveReplicationConfigurationAsync(s3Client); } 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); } } private static async Task RetrieveReplicationConfigurationAsync(IAmazonS3 client) { // Retrieve the configuration. GetBucketReplicationRequest getRequest = new GetBucketReplicationRequest { BucketName = sourceBucket }; GetBucketReplicationResponse getResponse = await client.GetBucketReplicationAsync(getRequest); // Print. Console.WriteLine("Printing replication configuration information..."); Console.WriteLine("Role ARN: {0}", getResponse.Configuration.Role); foreach (var rule in getResponse.Configuration.Rules) { Console.WriteLine("ID: {0}", rule.Id); Console.WriteLine("Prefix: {0}", rule.Prefix); Console.WriteLine("Status: {0}", rule.Status); } } } }