복제본 소유자 변경하기

복제본 소유자 변경하기

복제에서 기본적으로 소스 객체의 소유자가 복제본도 소유해요. 하지만 소스·대상 버킷이 서로 다른 AWS 계정에 속한다면 복제본 소유권을 바꾸고 싶을 수 있어요. 예를 들어 객체 복제본에 대한 액세스를 제한하려고 소유권을 바꿀 수 있죠. 복제 구성에 선택적 구성 설정을 추가해서 복제본 소유권을 대상 버킷을 소유한 AWS 계정으로 바꿀 수 있어요.

복제본 소유자를 바꾸려면 다음을 수행해요.

  • 복제 구성에 소유자 재정의(owner override) 옵션을 추가해서 Amazon S3에 복제본 소유권을 바꾸라고 지시해요.
  • Amazon S3에 s3:ObjectOwnerOverrideToBucketOwner 권한을 부여해서 복제본 소유권을 바꾸게 해요.
  • 대상 버킷 정책에 s3:ObjectOwnerOverrideToBucketOwner 권한을 추가해서 복제본 소유권 변경을 허용해요. 이 권한은 대상 버킷 소유자가 객체 복제본의 소유권을 받아들일 수 있게 해줍니다.

자세한 내용은 소유권 재정의 옵션에 대한 고려 사항과 복제 구성에 소유권 재정의 옵션 추가 문서를 참고하세요. 단계별 지침이 포함된 실제 예시는 복제본 소유자 변경 방법을 참고하세요.

중요: 소유권 재정의 옵션 대신 Object Ownership의 버킷 소유자 강제(bucket owner enforced) 설정을 쓸 수도 있어요. 복제를 사용하고 소스·대상 버킷이 서로 다른 AWS 계정에 속할 때 대상 버킷 소유자는 이 설정을 사용해 복제본 소유권을 대상 버킷을 소유한 AWS 계정으로 바꿀 수 있어요. 이 설정은 객체 액세스 제어 목록(ACL)을 비활성화합니다. 이 설정은 s3:ObjectOwnerOverrideToBucketOwner 권한 없이도 기존 소유권 재정의 동작을 따라 해요. 버킷 소유자 강제 설정으로 대상 버킷에 복제된 모든 객체는 대상 버킷 소유자가 소유하게 되죠. Object Ownership에 대한 자세한 내용은 버킷의 객체 소유권 제어 및 ACL 비활성화 문서를 참고하세요.

출처: 문서

소유권 재정의 옵션에 대한 고려 사항

소유권 재정의 옵션을 구성할 때는 다음 사항이 적용돼요.

  • 기본적으로 소스 객체 소유자가 복제본도 소유해요. Amazon S3는 객체 버전과 관련 ACL을 복제합니다.
  • 복제 구성에 소유권 재정의 옵션을 추가하면 Amazon S3는 객체 버전만 복제하고 ACL은 복제하지 않아요. 게다가 Amazon S3는 소스 객체 ACL에 대한 이후 변경 사항도 복제하지 않죠. Amazon S3는 대상 버킷 소유자에게 전체 제어권을 부여하는 ACL을 복제본에 설정해요.
  • 복제 구성을 갱신해서 소유권 재정의를 활성화하거나 비활성화하면 다음 동작이 발생합니다.
    • 복제 구성에 소유권 재정의 옵션을 추가한 경우: Amazon S3가 객체 버전을 복제할 때 소스 객체와 연결된 ACL을 버립니다. 대신 Amazon S3는 복제본에 대상 버킷 소유자에게 전체 제어권을 주는 ACL을 설정해요. 소스 객체 ACL에 대한 이후 변경은 복제되지 않아요. 다만 이 ACL 변경은 소유권 재정의 옵션을 설정하기 전에 복제된 객체 버전에는 적용되지 않습니다. 소유권 재정의가 설정되기 전에 복제된 소스 객체의 ACL 갱신은 계속 복제돼요(객체와 복제본이 계속 같은 소유자를 갖기 때문이죠).
    • 복제 구성에서 소유권 재정의 옵션을 제거한 경우: Amazon S3는 소스 버킷에 새로 나타난 객체와 관련 ACL을 대상 버킷으로 복제해요. 소유권 재정의를 제거하기 전에 복제된 객체에 대해서는 Amazon S3가 ACL을 복제하지 않아요. 그 객체들에는 Amazon S3가 만든 소유권 변경이 계속 적용되기 때문이죠. 즉 소유권 재정의가 설정된 동안 복제된 객체 버전에 이뤄진 ACL 설정은 계속 복제되지 않습니다.

복제 구성에 소유권 재정의 옵션 추가

경고: 소유권 재정의 옵션은 소스·대상 버킷이 서로 다른 AWS 계정에 속할 때만 추가하세요. Amazon S3는 버킷이 같은 계정인지 다른 계정인지 확인하지 않아요. 두 버킷이 같은 AWS 계정에 속해 있는데 소유권 재정의를 추가하면 Amazon S3는 그 옵션을 적용합니다. 이 옵션은 대상 버킷 소유자에게 전체 권한을 부여하고 소스 객체의 ACL에 대한 이후 갱신은 복제하지 않아요. 복제본 소유자는 PutObjectAcl 요청으로 복제본과 연결된 ACL을 직접 바꿀 수 있지만, 복제를 통해서는 불가능합니다.

소유권 재정의 옵션을 지정하려면 각 Destination 요소에 다음을 추가해요.

  • AccessControlTranslation 요소 — Amazon S3에 복제본 소유권을 바꾸라고 알려줍니다.
  • Account 요소 — 대상 버킷 소유자의 AWS 계정을 지정합니다.
<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    ...
    <Destination>
      ...
        <AccessControlTranslation>
            <Owner>Destination</Owner>
        </AccessControlTranslation>
      <Account>destination-bucket-owner-account-id</Account>
    </Destination>
  </Rule>
</ReplicationConfiguration>

다음 예시 복제 구성은 Tax 키 접두사를 가진 객체를 amzn-s3-demo-destination-bucket 대상 버킷으로 복제하면서 복제본 소유권을 바꾸라고 Amazon S3에 지시해요. 이 예시를 쓰려면 user input placeholders를 자신의 정보로 바꾸세요.

<?xml version="1.0" encoding="UTF-8"?>
<ReplicationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
   <Role>arn:aws:iam::account-id:role/role-name</Role>
   <Rule>
      <ID>Rule-1</ID>
      <Priority>1</Priority>
      <Status>Enabled</Status>
      <DeleteMarkerReplication>
         <Status>Disabled</Status>
      </DeleteMarkerReplication>
      <Filter>
         <Prefix>Tax</Prefix>
      </Filter>
      <Destination>
         <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
         <Account>destination-bucket-owner-account-id</Account>
         <AccessControlTranslation>
            <Owner>Destination</Owner>
         </AccessControlTranslation>
      </Destination>
   </Rule>
</ReplicationConfiguration>

Amazon S3에 복제본 소유권 변경 권한 부여

복제 구성에서 Amazon S3가 가정해 사용자를 대신해 객체를 복제하도록 지정한 IAM 역할에 연결된 권한 정책에서 s3:ObjectOwnerOverrideToBucketOwner 작업에 대한 권한을 추가해서 복제본 소유권을 바꾸는 권한을 부여해요. 다음 예시를 쓰려면 amzn-s3-demo-destination-bucket을 대상 버킷 이름으로 바꾸세요.

"Effect":"Allow",
 "Action":[
    "s3:ObjectOwnerOverrideToBucketOwner"
 ],
 "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"

대상 버킷 정책에 복제본 소유권 변경 허용 권한 추가

대상 버킷 소유자는 소스 버킷 소유자에게 복제본 소유권을 바꿀 권한을 부여해야 해요. 대상 버킷 소유자는 s3:ObjectOwnerOverrideToBucketOwner 작업에 대한 권한을 소스 버킷 소유자에게 부여합니다. 이 권한 덕분에 대상 버킷 소유자가 객체 복제본의 소유권을 받아들일 수 있어요. 다음 예시 버킷 정책 문장은 이 방법을 보여줘요. 이 예시를 쓰려면 user input placeholders를 자신의 정보로 바꾸세요.

{
   "Sid":"1",
   "Effect":"Allow",
   "Principal":{
      "AWS":"source-bucket-account-id"},
   "Action":["s3:ObjectOwnerOverrideToBucketOwner"],
   "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
}

복제본 소유자 변경 방법

복제 구성의 소스·대상 버킷이 서로 다른 AWS 계정에 속할 때는 복제본 소유권을 대상 버킷을 소유한 AWS 계정으로 바꾸라고 Amazon S3에 지시할 수 있어요. 다음 예시는 Amazon S3 콘솔, AWS CLI, AWS SDK로 복제본 소유권을 바꾸는 방법을 보여줍니다.

단계별 지침은 같은 계정의 버킷 복제 구성하기 문서를 참고하세요. 이 문서에는 소스·대상 버킷이 같거나 다른 AWS 계정에 속할 때 복제 구성을 설정하는 지침이 있어요.

다음 절차는 AWS CLI로 복제본 소유권을 바꾸는 방법을 보여줘요. 이 절차에서는 다음을 수행합니다.

  1. 소스·대상 버킷을 만들고 버킷에서 버전 관리를 활성화해요.
  2. Amazon S3에 객체 복제 권한을 주는 IAM 역할을 만들어요.
  3. 소스 버킷에 복제 구성을 추가해요.
  4. 복제 구성에서 Amazon S3에 복제본 소유권을 바꾸라고 지시해요.
  5. 복제 구성을 테스트해요.

이 절차의 예시 AWS CLI 명령을 쓰려면 user input placeholders를 자신의 정보로 바꾸세요.

이 예시에서는 두 개의 서로 다른 AWS 계정에 소스 버킷과 대상 버킷을 만들어요. 두 계정을 사용하려면 AWS CLI에 명명된 프로필 두 개를 구성해요. 이 예시에서는 각각 acctA와 acctB라는 프로필을 사용합니다. 자격 증명 프로필 설정과 명명된 프로필 사용에 대한 자세한 내용은 AWS Command Line Interface 사용자 안내서의 구성 및 자격 증명 파일 설정을 참고하세요.

중요: 이 절차에 쓰는 프로필은 필요한 권한을 갖고 있어야 해요. 예를 들어 복제 구성에서 Amazon S3가 가정할 IAM 역할을 지정하는데, 이는 사용하는 프로필에 iam:PassRole 권한이 있을 때만 가능해요. 관리자 사용자 자격 증명으로 명명된 프로필을 만들면 이 절차의 모든 작업을 수행할 수 있어요. 자세한 내용은 IAM 사용자 안내서의 사용자에게 역할을 AWS 서비스에 전달할 권한 부여를 참고하세요.

  1. 소스 버킷을 만들고 버전 관리를 활성화해요. 이 예시는 US East(N. Virginia)(us-east-1) 리전에 amzn-s3-demo-source-bucket라는 소스 버킷을 만들어요.
aws s3api create-bucket \
--bucket amzn-s3-demo-source-bucket \
--region us-east-1 \
--profile acctA

aws s3api put-bucket-versioning \
--bucket amzn-s3-demo-source-bucket \
--versioning-configuration Status=Enabled \
--profile acctA
  1. 대상 버킷을 만들고 버전 관리를 활성화해요. 이 예시는 US West(Oregon)(us-west-2) 리전에 amzn-s3-demo-destination-bucket라는 대상 버킷을 만들어요. 소스 버킷에 쓴 것과 다른 AWS 계정 프로필을 사용하세요.
aws s3api create-bucket \
--bucket amzn-s3-demo-destination-bucket \
--region us-west-2 \
--create-bucket-configuration LocationConstraint=us-west-2 \
--profile acctB

aws s3api put-bucket-versioning \
--bucket amzn-s3-demo-destination-bucket \
--versioning-configuration Status=Enabled \
--profile acctB
  1. 복제본 소유권 변경을 허용하려면 대상 버킷 정책에 권한을 추가해야 해요. 다음 정책을 destination-bucket-policy.json라는 파일에 저장해요. user input placeholders를 자신의 정보로 꼭 바꾸세요.
{
   "Version":"2012-10-17",
   "Statement": [
      {
         "Sid": "destination_bucket_policy_sid",
         "Principal":{
            "AWS": "source-bucket-owner-123456789012"
         },
         "Action": [
            "s3:ReplicateObject",
            "s3:ReplicateDelete",
            "s3:ObjectOwnerOverrideToBucketOwner",
            "s3:ReplicateTags",
            "s3:GetObjectVersionTagging"
         ],
         "Effect": "Allow",
         "Resource": [
            "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
         ]
      }
   ]
}

다음 put-bucket-policy 명령으로 앞의 정책을 대상 버킷에 추가해요.

aws s3api put-bucket-policy --region ${destination-region} --bucket ${amzn-s3-demo-destination-bucket} --policy file://destination_bucket_policy.json
  1. IAM 역할을 만들어요. 나중에 소스 버킷에 추가하는 복제 구성에 이 역할을 지정해요. Amazon S3는 이 역할을 가정해서 사용자를 대신해 객체를 복제합니다. IAM 역할은 역할 만들기 → 역할에 권한 정책 연결, 두 단계로 만들어요.

    IAM 역할 만들기

    다음 신뢰 정책을 복사해서 로컬 컴퓨터의 현재 디렉터리에 s3-role-trust-policy.json라는 파일로 저장해요. 이 정책은 Amazon S3에 역할을 가정할 권한을 부여합니다.

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "Service":"s3.amazonaws.com"
         },
         "Action":"sts:AssumeRole"
      }
   ]
}

다음 AWS CLI create-role 명령으로 IAM 역할을 만들어요.

aws iam create-role \
--role-name replicationRole \
--assume-role-policy-document file://s3-role-trust-policy.json  \
--profile acctA

만든 IAM 역할의 Amazon 리소스 이름(ARN)을 기록해 두세요. 이후 단계에서 이 ARN이 필요합니다.

역할에 권한 정책 연결

다음 권한 정책을 복사해서 로컬 컴퓨터의 현재 디렉터리에 s3-role-perm-pol-changeowner.json라는 파일로 저장해요. 이 정책은 다양한 Amazon S3 버킷·객체 작업에 대한 권한을 부여합니다. 다음 단계에서 이 정책을 아까 만든 IAM 역할에 연결해요.

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetObjectVersionForReplication",
            "s3:GetObjectVersionAcl"
         ],
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListBucket",
            "s3:GetReplicationConfiguration"
         ],
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:ReplicateObject",
            "s3:ReplicateDelete",
            "s3:ObjectOwnerOverrideToBucketOwner",
            "s3:ReplicateTags",
            "s3:GetObjectVersionTagging"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
      }
   ]
}

다음 put-role-policy 명령으로 앞의 권한 정책을 역할에 연결해요.

aws iam put-role-policy \
--role-name replicationRole \
--policy-document file://s3-role-perm-pol-changeowner.json \
--policy-name replicationRolechangeownerPolicy \
--profile acctA
  1. 소스 버킷에 복제 구성을 추가해요. AWS CLI는 복제 구성을 JSON으로 지정해야 해요. 다음 JSON을 로컬 컴퓨터의 현재 디렉터리에 replication.json라는 파일로 저장해요. 구성에서 AccessControlTranslation은 복제본 소유권이 소스 버킷 소유자에서 대상 버킷 소유자로 바뀌는 것을 지정합니다.
{
   "Role":"IAM-role-ARN",
   "Rules":[
      {
         "Status":"Enabled",
         "Priority":1,
         "DeleteMarkerReplication":{
            "Status":"Disabled"
         },
         "Filter":{
         },
         "Status":"Enabled",
         "Destination":{
            "Bucket":"arn:aws:s3:::amzn-s3-demo-destination-bucket",
            "Account":"destination-bucket-owner-account-id",
            "AccessControlTranslation":{
               "Owner":"Destination"
            }
         }
      }
   ]
}

대상 버킷 이름, 대상 버킷 소유자 계정 ID, IAM-role-ARN 값을 입력해서 JSON을 편집해요. IAM-role-ARN을 아까 만든 IAM 역할의 ARN으로 바꾸세요. 변경 사항을 저장합니다.

다음 명령으로 소스 버킷에 복제 구성을 추가해요.

aws s3api put-bucket-replication \
--replication-configuration file://replication.json \
--bucket amzn-s3-demo-source-bucket \
--profile acctA
  1. Amazon S3 콘솔에서 복제본 소유권을 확인해 복제 구성을 테스트해요.
    1. AWS Management Console에 로그인하고 Amazon S3 콘솔을 엽니다. (https://console.aws.amazon.com/s3/)
    2. 소스 버킷에 객체를 추가해요. 대상 버킷에 객체 복제본이 들어 있고 복제본 소유권이 대상 버킷을 소유한 AWS 계정으로 바뀌었는지 확인합니다.

복제 구성을 추가하는 코드 예시는 AWS SDK 사용 문서를 참고하세요. 복제 구성을 적절히 수정해야 해요. 개념적 정보는 복제본 소유자 변경 문서를 참고하세요.

더 알아보기