동일한 계정이 소유한 원본 및 대상 버킷에 대한 복제 구성 - Amazon Simple Storage Service

동일한 계정이 소유한 원본 및 대상 버킷에 대한 복제 구성

복제는 동일한 리전 또는 서로 다른 AWS 리전의 버킷 간에 객체를 비동기식으로 자동 복사하는 것을 말합니다. 복제는 새로 생성된 객체 및 객체 업데이트를 원본 버킷에서 지정된 대상 버킷으로 복사합니다. 자세한 내용은 객체 복제 단원을 참조하십시오.

복제를 구성할 때는 소스 버킷에 복제 규칙을 추가합니다. 복제 규칙은 복제할 원본 버킷 객체와 복제된 객체가 저장된 대상 버킷을 정의합니다. 특정 키 이름 접두사, 하나 이상의 객체 태그 또는 이 두 가지를 모두 포함하는 버킷 또는 객체 하위 집합에 있는 모든 객체를 복제하는 규칙을 작성할 수 있습니다. 대상 버킷은 소스 버킷과 동일한 AWS 계정에 있거나 다른 계정에 존재할 수 있습니다.

삭제할 객체 버전 ID를 지정하는 경우, Amazon S3가 원본 버킷에서 해당 객체 버전을 삭제합니다. 하지만 대상 버킷에서는 삭제를 복제하지 않습니다. 즉, 대상 버킷에서 동일한 객체 버전을 삭제하지 않습니다. 이는 악의적 삭제로부터 데이터를 보호합니다.

버킷에 복제 규칙을 추가하면 이 규칙이 기본적으로 사용 설정되므로 이 규칙을 저장하면 그 즉시 작업이 시작됩니다.

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

대상 버킷이 소스 버킷과 동일한 AWS 계정에 있는 경우 복제 규칙을 구성하려면 다음 단계를 따릅니다.

대상 버킷이 원본 버킷과 다른 계정에 있는 경우, 원본 버킷 계정의 소유자에게 대상 버킷의 객체를 복제할 수 있는 권한을 부여하려면 대상 버킷에 하나의 버킷 정책을 추가해야 합니다. 자세한 내용은 소스 버킷과 대상 버킷을 서로 다른 AWS 계정에서 소유할 경우 권한 부여 단원을 참조하십시오.

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

  2. 왼쪽 탐색 창에서 버킷(Buckets)을 선택합니다.

  3. 버킷 목록에서 원하는 버킷의 이름을 선택합니다.

  4. 관리 탭을 선택하고 복제 규칙까지 아래로 스크롤한 다음 복제 규칙 생성을 선택합니다.

  5. 복제 규칙 구성 섹션의 복제 규칙 이름에 나중에 규칙을 쉽게 식별할 수 있는 규칙 이름을 입력합니다. 이름은 필수 항목이며 버킷 내에서 고유해야 합니다.

  6. 상태 아래의 활성이 기본적으로 선택됩니다. 사용 설정된 규칙은 저장하는 즉시 적용되기 시작합니다. 나중에 규칙을 활성화하고 싶다면 비활성화됨을 선택하세요.

  7. 버킷에 기존 복제 규칙이 있는 경우 규칙에 우선 순위를 설정하라는 메시지가 표시됩니다. 여러 규칙의 범위에 포함된 객체로 인해 발생하는 충돌을 방지하기 위해 규칙의 우선 순위를 설정해야 합니다. 중첩 규칙의 경우, Amazon S3은 규칙 우선 순위를 사용하여 어느 규칙을 적용할지 결정합니다. 숫자가 클수록 우선 순위가 높아집니다. 규칙 우선 순위에 대한 자세한 내용은 복제 구성 단원을 참조하세요.

  8. 소스 버킷에는 복제 소스를 설정하기 위한 다음과 같은 옵션이 있습니다.

    • 전체 버킷을 복제하려면 Apply to all objects in the bucket(버킷의 모든 객체에 적용)를 선택합니다.

    • 접두사가 같은 모든 객체를 복제하려면 하나 이상의 필터를 사용하여 이 규칙의 범위 제한(Limit the scope of this rule using one or more filters)을 선택합니다. 이렇게 하면 이름이 지정한 접두사(예: pictures)로 시작하는 모든 객체에 대한 복제가 제한됩니다. 접두사 상자에 접두사를 입력합니다.

      참고

      어떤 폴더의 이름에 해당하는 접두사를 입력할 경우, /(슬래시)를 마지막 문자(예: pictures/)로 사용해야 합니다.

    • 하나 이상의 객체 태그가 있는 모든 객체를 복제하려면 태그 추가를 선택하고 상자에 키 값 페어를 입력합니다. 절차를 반복하여 다른 태그를 추가합니다. 접두사와 태그를 결합할 수도 있습니다. 객체 태그에 대한 자세한 내용은 태그를 사용하여 스토리지 분류 섹션을 참조하십시오.

    새로운 복제 구성 XML 스키마는 접두사 및 태그 필터링과 규칙 우선 순위 지정을 지원합니다. 새 스키마에 대한 자세한 내용은 이전 버전과의 호환성 단원을 참조하세요. 사용자 인터페이스 뒤에서 작동하는 Amazon S3 API와 함께 사용되는 XML에 대한 자세한 내용은 복제 구성 섹션을 참조하세요. 새 스키마는 복제 구성 XML V2로 기술됩니다.

  9. 대상에서 Amazon S3이 객체를 복제하게 할 버킷을 선택합니다.

    참고

    대상 버킷의 수는 지정된 파티션의 AWS 리전 수로 제한됩니다. 파티션은 리전 그룹입니다. AWS에는 aws(표준 리전), aws-cn(중국 리전) 및 aws-us-gov(AWS GovCloud (US) 리전), 이렇게 세 가지 파티션이 있습니다. 대상 버킷 할당량 증대를 요청하려면 서비스 할당량을 사용합니다.

    • 계정의 버킷으로 복제하려면 이 계정의 버킷 선택을 선택하고 대상 버킷 이름을 입력하거나 찾아봅니다.

    • 다른 AWS 계정의 버킷으로 복제하려면 다른 계정의 버킷 지정을 선택하고 대상 버킷 계정 ID와 버킷 이름을 입력합니다.

      대상이 원본 버킷과 다른 계정에 있는 경우, 원본 버킷 계정의 소유자에게 객체를 복제할 수 있는 권한을 부여하려면 대상 버킷에 하나의 버킷 정책을 추가해야 합니다. 자세한 내용은 소스 버킷과 대상 버킷을 서로 다른 AWS 계정에서 소유할 경우 권한 부여 단원을 참조하십시오.

      선택적으로, 대상 버킷에서 새 객체의 소유권을 표준화하고 싶다면 객체 소유권을 대상 버킷 소유자로 변경을 선택합니다. 이 옵션에 대한 자세한 내용은 객체 소유권 제어 및 버킷에 대해 ACL 사용 중지을 참조하세요.

    참고

    대상 버킷에서 버전 관리가 사용 설정되어 있지 않을 경우, 버전 관리 사용 설정(Enable versioning) 버튼이 포함된 경고가 나타납니다. 이 버튼을 선택하면 버킷의 버전 관리가 사용 설정됩니다.

  10. Amazon S3가 사용자 대신 객체를 복제하기 위해 수임할 수 있는 AWS Identity and Access Management(IAM) 역할을 설정합니다.

    IAM 역할을 설정하려면 IAM 역할 섹션의 IAM 역할 드롭다운 목록에서 다음 중 하나를 선택합니다.

    • 새 역할 생성(Create new role)을 선택하여 Amazon S3에서 자동으로 새 IAM 역할을 생성하도록 하는 것이 좋습니다. 규칙을 저장하면 선택한 원본 및 대상 버킷과 일치하는 IAM 역할에 대해 새 정책이 생성됩니다.

    • 기존 IAM 역할을 사용하도록 선택할 수 있습니다. 이 경우 복제에 필요한 권한을 Amazon S3에 부여하는 역할을 선택해야 합니다. 이 역할이 복제 규칙을 따를 수 있는 충분한 권한을 Amazon S3에 부여하지 않으면 복제가 실패합니다.

    중요

    버킷에 복제 규칙을 추가하려면 Amazon S3에 복제 권한을 부여하는 IAM 역할을 전달할 수 있는 iam:PassRole 권한이 있어야 합니다. 자세한 내용은 IAM 사용 설명서에서 AWS 서비스에 역할을 전달하도록 사용자 권한 부여를 참조하세요.

  11. AWS Key Management Service(AWS KMS) 키(SSE-KMS)를 통한 서버 측 암호화로 암호화된 소스 버킷의 객체를 복제하려면 암호화에서 AWS KMS로 암호화된 객체 복제를 선택합니다. 대상 객체를 암호화하기 위한 AWS KMS 키에는 복제에 사용할 수 있는 소스 키가 있습니다. 기본값으로 모든 소스 KMS 키가 포함됩니다. KMS 키 선택 범위를 좁히려면 별칭이나 키 ID를 선택하면 됩니다.

    선택하지 않은 AWS KMS keys로 암호화된 객체는 복제되지 않습니다. KMS 키 또는 KMS 키 그룹이 자동으로 선택되지만, 원한다면 KMS 키를 선택할 수 있습니다. 복제와 함께 AWS KMS을(를) 사용하는 방법에 대한 자세한 내용은 서버 측 암호화(SSE-C, SSE-S3, SSE-KMS, DSSE-KMS)를 사용하여 생성된 객체 복제 단원을 참조하세요.

    중요

    AWS KMS을(를) 사용하여 암호화된 객체를 복제하는 경우 AWS KMS 요청 빈도는 소스 리전에서 두 배가 되고 대상 리전에서는 같은 양만큼 늘어납니다. AWS KMS에 대해 늘어난 호출 빈도는 복제 대상 리전에 대해 정의한 KMS 키를 사용하여 데이터가 다시 암호화되는 방식 때문입니다. AWS KMS에는 리전당 호출 계정에 따른 요청 속도 할당량이 있습니다. 할당량 기본값에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 AWS KMS 할당량 - 초당 요청: 달라짐을 참조하세요.

    복제 중 현재 Amazon S3 PUT 객체 요청 속도가 계정에 대한 기본 AWS KMS 속도 할당량의 절반보다 큰 경우 AWS KMS 요청 속도 제한 증가를 요청하는 것이 좋습니다. 증가를 요청하려면 문의처의 AWS Support Center에서 사례를 생성합니다. 예를 들어 현재 PUT 객체 요청 빈도가 초당 1,000개이고 AWS KMS를 사용하여 객체를 암호화한다고 가정합니다. 이 경우 AWS KMS에서 제한이 발생하지 않도록 AWS Support에 소스 리전과 대상 리전 둘 다에서 AWS KMS 속도 제한을 초당 2,500개 요청으로 올려달라고 요청하는 것이 좋습니다.

    소스 버킷에서 PUT 객체 요청 빈도를 확인하려면 Amazon S3에 대한 Amazon CloudWatch 요청 지표에서 PutRequests를 확인합니다. CloudWatch 지표를 확인하는 방법에 대한 자세한 내용은 S3 콘솔 사용 단원을 참조하세요.

    AWS KMS로 암호화된 객체를 복제하도록 선택한 경우 다음을 수행합니다.

    1. 대상 객체를 암호화하기 위한 AWS KMS key에서 다음 방법 중 하나로 KMS 키를 지정합니다.

      • 사용 가능한 KMS 키 목록에서 AWS KMS keys 중에서 선택을 선택하고 사용 가능한 키 목록에서 KMS 키를 선택합니다.

        AWS 관리형 키(aws/s3)와 고객 관리형 키가 모두 목록에 표시됩니다. 고객 관리형 키에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 고객 키 및 AWS 키를 참조하세요.

      • KMS 키 Amazon 리소스 이름(ARN)을 입력하려면 AWS KMS key ARN 입력을 선택하고 나타나는 필드에 KMS 키 ARN을 입력합니다. 이렇게 하면 대상 버킷의 복제본이 암호화됩니다. IAM 콘솔암호화 키 아래에서 KMS 키에 대한 ARN을 찾을 수 있습니다.

      • AWS KMS 콘솔에서 고객 관리형 키를 생성하려면 KMS 키 생성을 선택합니다.

        AWS KMS key 생성에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드키 생성을 참조하십시오.

      중요

      버킷과 동일한 AWS 리전에서 사용되는 KMS 키만 사용할 수 있습니다. KMS 키에서 선택을 선택하면 S3 콘솔에는 KMS 키를 리전당 100개씩만 나열합니다. 동일한 리전에 100개 이상의 KMS 키가 있는 경우, S3 콘솔에서 처음 100개의 KMS 키만 볼 수 있습니다. 콘솔에 나열되지 않은 KMS 키를 사용하려면 AWS KMS key ARN 입력을 선택하고 KMS 키 ARN을 입력합니다.

      Amazon S3에서 서버 측 암호화에 AWS KMS key을 사용하는 경우 대칭 암호화 KMS 키를 선택해야 합니다. Amazon S3는 대칭 암호화 KMS 키만 지원하며 비대칭 KMS 키는 지원하지 않습니다. 자세한 내용은 AWS Key Management Service 개발자 안내서에서 대칭 및 비대칭 KMS 키 식별을 참조하십시오.

      AWS KMS key 생성에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드키 생성을 참조하십시오. Amazon S3에서 AWS KMS을(를) 사용하는 방법에 대한 자세한 내용은 AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 사용 단원을 참조하십시오.

  12. 대상의 특정 스토리지 클래스로 데이터를 복제하려면 대상 스토리지 클래스에서 복제된 객체의 스토리지 클래스 변경을 선택합니다. 그런 다음, 대상의 복제된 객체에 사용할 스토리지 클래스를 선택합니다. 이 옵션을 선택하지 않을 경우, 복제된 객체의 스토리지 클래스는 원본 객체와 동일한 클래스에 해당됩니다.

  13. 추가 복제 옵션을 설정할 때 다음과 같은 추가 옵션이 있습니다.

    참고

    S3 RTC 또는 S3 복제 지표를 사용하면 추가 요금이 적용됩니다.

  14. 완료하려면 저장(Save)을 선택합니다.

  15. 규칙을 저장한 후 규칙을 선택하고 규칙 편집(Edit rule)을 선택하여 규칙을 편집, 사용 설정, 사용 중지 또는 삭제할 수 있습니다.

소스 버킷과 대상 버킷을 동일한 AWS 계정에서 소유한 경우 AWS CLI를 사용하여 복제를 설정하려면 다음을 수행합니다.

  • 소스 및 대상 버킷 생성

  • 버킷의 버전 관리 사용

  • Amazon S3에 객체 복제 권한을 제공하는 IAM 역할 생성

  • 소스 버킷에 복제 구성 추가

설정을 확인하려면 테스트합니다.

소스 버킷과 대상 버킷을 동일한 AWS 계정에서 소유한 경우 복제를 설정하려면
  1. AWS CLI의 자격 증명 프로필을 설정합니다. 이 예제에서는 프로필 이름 acctA를 사용합니다. 자격 증명 프로파일 설정에 대한 자세한 내용은 AWS Command Line Interface 사용 설명서명명된 프로파일을 참조하세요.

    중요

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

  2. source 버킷을 생성하고 버킷에서 버전 관리를 사용 설정합니다. 다음 코드는 미국 동부(버지니아 북부)(us-east-1) 리전에 source 버킷을 생성합니다.

    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. destination 버킷을 생성하고 버킷에서 버전 관리를 사용 설정합니다. 다음 코드는 미국 서부(오레곤)(us-west-2) 리전에 destination 버킷을 생성합니다.

    참고

    소스 버킷과 대상 버킷이 모두 동일한 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 replicationRole \ --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", "s3:GetObjectVersionTagging" ], "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" ], "Resource":"arn:aws:s3:::destination-bucket/*" } ] }
      2. 다음 명령을 실행하여 정책을 생성하고 이를 역할에 연결합니다.

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

    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 버킷 이름을 제공해야 합니다.

      $ 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. source 버킷에서 이름이 Tax인 폴더를 생성합니다.

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

      참고

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

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

      • Amazon S3가 객체를 복제함.

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

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

        
                                            복제 상태 및 권한을 보여 주는 객체 속성의 스크린샷

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

Java

다음 예에서는 버킷에 복제 구성을 추가한 후 해당 구성을 검색 및 확인합니다. 실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 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.identitymanagement.AmazonIdentityManagement; import com.amazonaws.services.identitymanagement.AmazonIdentityManagementClientBuilder; import com.amazonaws.services.identitymanagement.model.CreateRoleRequest; import com.amazonaws.services.identitymanagement.model.PutRolePolicyRequest; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.BucketReplicationConfiguration; import com.amazonaws.services.s3.model.BucketVersioningConfiguration; import com.amazonaws.services.s3.model.CreateBucketRequest; import com.amazonaws.services.s3.model.DeleteMarkerReplication; import com.amazonaws.services.s3.model.DeleteMarkerReplicationStatus; 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.SetBucketVersioningConfigurationRequest; import com.amazonaws.services.s3.model.StorageClass; import com.amazonaws.services.s3.model.replication.ReplicationFilter; import com.amazonaws.services.s3.model.replication.ReplicationFilterPredicate; import com.amazonaws.services.s3.model.replication.ReplicationPrefixPredicate; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class CrossRegionReplication { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_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:%s", accountId, roleName); String destinationBucketARN = "arn:aws:s3:::" + destBucketName; AmazonS3 s3Client = AmazonS3Client.builder() .withCredentials(new ProfileCredentialsProvider()) .withRegion(clientRegion) .build(); createBucket(s3Client, clientRegion, sourceBucketName); createBucket(s3Client, clientRegion, destBucketName); assignRole(roleName, clientRegion, sourceBucketName, destBucketName); try { // 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 ReplicationPrefixPredicate(prefix))) .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 priority: " + rule.getPriority()); 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(); } } private static void createBucket(AmazonS3 s3Client, Regions region, String bucketName) { CreateBucketRequest request = new CreateBucketRequest(bucketName, region.getName()); s3Client.createBucket(request); BucketVersioningConfiguration configuration = new BucketVersioningConfiguration() .withStatus(BucketVersioningConfiguration.ENABLED); SetBucketVersioningConfigurationRequest enableVersioningRequest = new SetBucketVersioningConfigurationRequest( bucketName, configuration); s3Client.setBucketVersioningConfiguration(enableVersioningRequest); } private static void assignRole(String roleName, Regions region, String sourceBucket, String destinationBucket) { AmazonIdentityManagement iamClient = AmazonIdentityManagementClientBuilder.standard() .withRegion(region) .withCredentials(new ProfileCredentialsProvider()) .build(); StringBuilder trustPolicy = new StringBuilder(); trustPolicy.append("{\\r\\n "); trustPolicy.append("\\\"Version\\\":\\\"2012-10-17\\\",\\r\\n "); trustPolicy.append("\\\"Statement\\\":[\\r\\n {\\r\\n "); trustPolicy.append("\\\"Effect\\\":\\\"Allow\\\",\\r\\n \\\"Principal\\\":{\\r\\n "); trustPolicy.append("\\\"Service\\\":\\\"s3.amazonaws.com\\\"\\r\\n },\\r\\n "); trustPolicy.append("\\\"Action\\\":\\\"sts:AssumeRole\\\"\\r\\n }\\r\\n ]\\r\\n}"); CreateRoleRequest createRoleRequest = new CreateRoleRequest() .withRoleName(roleName) .withAssumeRolePolicyDocument(trustPolicy.toString()); iamClient.createRole(createRoleRequest); StringBuilder permissionPolicy = new StringBuilder(); permissionPolicy.append( "{\\r\\n \\\"Version\\\":\\\"2012-10-17\\\",\\r\\n \\\"Statement\\\":[\\r\\n {\\r\\n "); permissionPolicy.append( "\\\"Effect\\\":\\\"Allow\\\",\\r\\n \\\"Action\\\":[\\r\\n "); permissionPolicy.append("\\\"s3:GetObjectVersionForReplication\\\",\\r\\n "); permissionPolicy.append( "\\\"s3:GetObjectVersionAcl\\\"\\r\\n ],\\r\\n \\\"Resource\\\":[\\r\\n "); permissionPolicy.append("\\\"arn:aws:s3:::"); permissionPolicy.append(sourceBucket); permissionPolicy.append("/*\\\"\\r\\n ]\\r\\n },\\r\\n {\\r\\n "); permissionPolicy.append( "\\\"Effect\\\":\\\"Allow\\\",\\r\\n \\\"Action\\\":[\\r\\n "); permissionPolicy.append( "\\\"s3:ListBucket\\\",\\r\\n \\\"s3:GetReplicationConfiguration\\\"\\r\\n "); permissionPolicy.append("],\\r\\n \\\"Resource\\\":[\\r\\n \\\"arn:aws:s3:::"); permissionPolicy.append(sourceBucket); permissionPolicy.append("\\r\\n "); permissionPolicy .append("]\\r\\n },\\r\\n {\\r\\n \\\"Effect\\\":\\\"Allow\\\",\\r\\n "); permissionPolicy.append( "\\\"Action\\\":[\\r\\n \\\"s3:ReplicateObject\\\",\\r\\n "); permissionPolicy .append("\\\"s3:ReplicateDelete\\\",\\r\\n \\\"s3:ReplicateTags\\\",\\r\\n "); permissionPolicy.append("\\\"s3:GetObjectVersionTagging\\\"\\r\\n\\r\\n ],\\r\\n "); permissionPolicy.append("\\\"Resource\\\":\\\"arn:aws:s3:::"); permissionPolicy.append(destinationBucket); permissionPolicy.append("/*\\\"\\r\\n }\\r\\n ]\\r\\n}"); PutRolePolicyRequest putRolePolicyRequest = new PutRolePolicyRequest() .withRoleName(roleName) .withPolicyDocument(permissionPolicy.toString()) .withPolicyName("crrRolePolicy"); iamClient.putRolePolicy(putRolePolicyRequest); } }
C#

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

using Amazon; 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); } } } }