암호화된 객체 복제하기(SSE-S3, SSE-KMS, DSSE-KMS, SSE-C)

암호화된 객체 복제하기(SSE-S3, SSE-KMS, DSSE-KMS, SSE-C)

중요: Amazon S3는 이제 모든 버킷의 기본 암호화 수준으로 Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)를 적용해요. 2023년 1월 5일부터 Amazon S3에 새로 업로드하는 모든 객체는 추가 비용 없이 성능 영향도 없이 자동으로 암호화됩니다. S3 버킷 기본 암호화 구성과 새 객체 업로드의 자동 암호화 상태는 CloudTrail 로그, S3 Inventory, S3 Storage Lens, Amazon S3 콘솔, 그리고 AWS CLI와 AWS SDK의 추가 Amazon S3 API 응답 헤더에서 확인할 수 있어요. 자세한 내용은 기본 암호화 FAQ를 참고하세요.

서버 측 암호화로 암호화된 객체를 복제할 때는 몇 가지 특별한 고려 사항이 있어요. Amazon S3는 다음 유형의 서버 측 암호화를 지원합니다.

  • Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3)
  • AWS Key Management Service(AWS KMS) 키를 사용한 서버 측 암호화(SSE-KMS)
  • AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)
  • 고객 제공 키를 사용한 서버 측 암호화(SSE-C)

서버 측 암호화에 대한 자세한 내용은 서버 측 암호화로 데이터 보호 문서를 참고하세요.

이 문서는 서버 측 암호화로 암호화된 객체를 Amazon S3가 복제하도록 지시할 때 필요한 권한을 설명합니다. 또한 추가할 수 있는 추가 구성 요소와, 암호화된 객체를 복제하는 데 필요한 권한을 부여하는 예시 AWS Identity and Access Management(IAM) 정책을 제공해요.

단계별 지침이 있는 예시는 암호화된 객체에 대한 복제 활성화 문서를 참고하세요. 복제 구성 생성에 대한 정보는 리전 내·리전 간 객체 복제 문서를 참고하세요.

참고: Amazon S3에서 다중 리전 AWS KMS 키를 사용할 수 있어요. 다만 Amazon S3는 현재 다중 리전 키를 단일 리전 키처럼 취급하며 키의 다중 리전 기능을 사용하지 않아요. 자세한 내용은 AWS Key Management Service 개발자 안내서의 다중 리전 키 사용을 참고하세요.

출처: 문서

기본 버킷 암호화가 복제에 미치는 영향

복제 대상 버킷에 기본 암호화를 활성화하면 다음 암호화 동작이 적용돼요.

  • 소스 버킷의 객체가 암호화되어 있지 않으면 대상 버킷의 복제본 객체는 대상 버킷의 기본 암호화 설정을 사용해 암호화됩니다. 그 결과 소스 객체의 엔티티 태그(ETag)가 복제본 객체의 ETag와 달라져요. ETag를 사용하는 애플리케이션이 있다면 이 차이를 반영하도록 해당 애플리케이션을 업데이트해야 해요.
  • 소스 버킷의 객체가 Amazon S3 관리형 키를 사용한 서버 측 암호화(SSE-S3), AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS), 또는 AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)로 암호화되어 있다면 대상 버킷의 복제본 객체는 소스 객체와 같은 유형의 암호화를 사용해요. 대상 버킷의 기본 암호화 설정은 사용되지 않습니다.

SSE-C로 암호화된 객체 복제

고객 제공 키를 사용한 서버 측 암호화(SSE-C)를 쓰면 자체 전용 암호화 키를 관리할 수 있어요. SSE-C에서는 사용자가 키를 관리하고 Amazon S3가 암호화·복호화 과정을 관리합니다. 요청의 일부로 암호화 키를 제공해야 하지만, 객체 암호화나 복호화를 수행할 코드를 작성할 필요는 없어요. 객체를 업로드하면 Amazon S3는 사용자가 제공한 키로 객체를 암호화한 뒤 메모리에서 키를 제거합니다. 객체를 검색할 때는 요청의 일부로 같은 암호화 키를 제공해야 해요. 자세한 내용은 고객 제공 키를 사용한 서버 측 암호화(SSE-C) 문서를 참고하세요.

S3 Replication은 SSE-C로 암호화된 객체를 지원해요. Amazon S3 콘솔이나 AWS SDK에서 암호화되지 않은 객체의 복제를 구성하는 것과 같은 방식으로 SSE-C 객체 복제를 구성할 수 있어요. 복제에 현재 요구되는 것 외에 추가 SSE-C 권한은 없습니다.

S3 Replication은 S3 Replication 구성에 지정된 대로 자격이 되면 새로 업로드된 SSE-C 암호화 객체를 자동으로 복제해요. 버킷의 기존 객체를 복제하려면 S3 Batch Replication을 사용하세요. 객체 복제에 대한 자세한 내용은 라이브 복제 설정 개요와 Batch Replication으로 기존 객체 복제 문서를 참고하세요.

SSE-C 객체 복제에는 추가 요금이 없어요. 복제 요금에 대한 자세한 내용은 Amazon S3 요금을 참고하세요.

SSE-S3, SSE-KMS, DSSE-KMS로 암호화된 객체 복제

기본적으로 Amazon S3는 SSE-KMS 또는 DSSE-KMS로 암호화된 객체를 복제하지 않아요. 이 섹션은 이런 객체를 복제하도록 Amazon S3에 지시하기 위해 추가할 수 있는 추가 구성 요소를 설명합니다.

단계별 지침이 있는 예시는 암호화된 객체에 대한 복제 활성화 문서를 참고하세요. 복제 구성 생성에 대한 정보는 리전 내·리전 간 객체 복제 문서를 참고하세요.

복제 구성에서 추가 정보 지정

복제 구성에서 다음을 수행해요.

  • 복제 구성의 Destination 요소에 객체 복제본을 암호화할 때 Amazon S3가 사용할 대칭 AWS KMS 고객 관리형 키의 ID를 추가해요. 다음 예시 복제 구성을 참고하세요.
  • KMS 키(SSE-KMS 또는 DSSE-KMS)로 암호화된 객체의 복제를 명시적으로 선택해 활성화해요. 선택하려면 다음 예시 복제 구성처럼 SourceSelectionCriteria 요소를 추가해요.
<ReplicationConfiguration>
   <Rule>
      ...
      <SourceSelectionCriteria>
         <SseKmsEncryptedObjects>
           <Status>Enabled</Status>
         </SseKmsEncryptedObjects>
      </SourceSelectionCriteria>

      <Destination>
          ...
          <EncryptionConfiguration>
             <ReplicaKmsKeyID>AWS KMS key ARN or Key Alias ARN that's in the same AWS Region as the destination bucket.</ReplicaKmsKeyID>
          </EncryptionConfiguration>
       </Destination>
      ...
   </Rule>
</ReplicationConfiguration>

중요: KMS 키는 대상 버킷과 같은 AWS 리전에서 만들어져야 해요. KMS 키는 반드시 유효해야 해요. PutBucketReplication API 작업은 KMS 키의 유효성을 확인하지 않아요. 유효하지 않은 KMS 키를 사용하면 응답으로 HTTP 200 OK 상태 코드를 받을 수 있지만 복제는 실패합니다.

다음 예시는 선택적 구성 요소를 포함하는 복제 구성을 보여줘요. 이 복제 구성에는 규칙이 하나 있습니다. 이 규칙은 Tax 키 접두사를 가진 객체에 적용되며, Amazon S3는 지정된 AWS KMS 키 ID를 사용해 이 객체 복제본을 암호화합니다.

<?xml version="1.0" encoding="UTF-8"?>
<ReplicationConfiguration>
   <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>
         <EncryptionConfiguration>
            <ReplicaKmsKeyID>AWS KMS key ARN or Key Alias ARN that's in the same AWS Region as the destination bucket.</ReplicaKmsKeyID>
         </EncryptionConfiguration>
      </Destination>
      <SourceSelectionCriteria>
         <SseKmsEncryptedObjects>
            <Status>Enabled</Status>
         </SseKmsEncryptedObjects>
      </SourceSelectionCriteria>
   </Rule>
</ReplicationConfiguration>

IAM 역할에 추가 권한 부여

SSE-S3, SSE-KMS, 또는 DSSE-KMS를 사용해 저장 시 암호화된 객체를 복제하려면 복제 구성에서 지정한 AWS Identity and Access Management(IAM) 역할에 다음 추가 권한을 부여해요. IAM 역할에 연결된 권한 정책을 갱신해서 이 권한을 부여합니다.

  • s3:GetObjectVersionForReplication 작업(소스 객체용) – 이 작업을 사용하면 Amazon S3가 암호화되지 않은 객체와 SSE-S3, SSE-KMS, 또는 DSSE-KMS를 사용한 서버 측 암호화로 만든 객체를 모두 복제할 수 있어요.
    • 참고: s3:GetObjectVersionForReplication 작업이 복제에 필요한 최소 권한만 Amazon S3에 제공하므로 s3:GetObjectVersion 작업 대신 이 작업을 사용하는 걸 권장해요. 게다가 s3:GetObjectVersion 작업은 암호화되지 않은 객체와 SSE-S3로 암호화된 객체는 복제할 수 있지만 KMS 키(SSE-KMS 또는 DSSE-KMS)로 암호화된 객체는 복제할 수 없습니다.
  • KMS 키에 대한 kms:Decrypt 및 kms:Encrypt AWS KMS 작업
    • 소스 객체를 보호하는 AWS KMS 키에 kms:Decrypt 권한을 부여해야 해요.
    • 객체 복제본을 보호할 AWS KMS 키에 kms:Encrypt 권한을 부여해야 해요.
  • 일반 텍스트 객체 복제를 위한 kms:GenerateDataKey 작업 – 일반 텍스트 객체를 기본적으로 SSE-KMS 또는 DSSE-KMS 암호화가 활성화된 버킷으로 복제한다면 IAM 정책에 대상 암호화 컨텍스트와 KMS 키에 대한 kms:GenerateDataKey 권한을 포함해야 해요.
    • 중요: S3 Batch Replication으로 데이터 세트를 리전 간에 복제하는데 객체의 서버 측 암호화 유형이 이전에 SSE-S3에서 SSE-KMS로 변경된 적이 있다면 추가 권한이 필요할 수 있어요. 소스 리전 버킷에는 kms:decrypt 권한이 있어야 해요. 그리고 대상 리전의 버킷에는 kms:decrypt와 kms:encrypt 권한이 필요합니다.

AWS KMS 조건 키를 사용해 이 권한을 대상 버킷과 객체로만 제한하는 것을 권장해요. IAM 역할을 소유한 AWS 계정은 정책에 나열된 KMS 키에 대한 kms:Encrypt 및 kms:Decrypt 작업 권한이 있어야 해요. KMS 키를 다른 AWS 계정이 소유한다면 KMS 키 소유자가 IAM 역할을 소유한 AWS 계정에 이 권한을 부여해야 합니다. 이 KMS 키에 대한 액세스 관리에 대한 자세한 내용은 AWS Key Management Service 개발자 안내서의 AWS KMS와 함께 IAM 정책 사용을 참고하세요.

S3 Bucket Key와 복제

S3 Bucket Key와 함께 복제를 사용하려면 객체 복제본을 암호화하는 데 사용되는 KMS 키의 AWS KMS 키 정책에 호출 보안 주체에 대한 kms:Decrypt 권한이 포함되어야 해요. kms:Decrypt 호출은 S3 Bucket Key를 사용하기 전에 그 무결성을 확인합니다. 자세한 내용은 복제와 함께 S3 Bucket Key 사용 문서를 참고하세요.

소스 버킷이나 대상 버킷에 S3 Bucket Key가 활성화되어 있으면 암호화 컨텍스트는 객체의 ARN이 아니라 버킷의 Amazon 리소스 이름(ARN)이 돼요(예: arn:aws:s3:::bucket_ARN). 암호화 컨텍스트에 버킷 ARN을 사용하도록 IAM 정책을 갱신해야 합니다.

"kms:EncryptionContext:aws:s3:arn": [
   "arn:aws:s3:::bucket_ARN"
]

자세한 내용은 암호화 컨텍스트(x-amz-server-side-encryption-context)("REST API 사용" 섹션)와 S3 Bucket Key를 활성화하기 전에 주의할 변경 사항 문서를 참고하세요.

예시 정책: 복제와 함께 SSE-S3 및 SSE-KMS 사용

다음 예시 IAM 정책은 복제와 함께 SSE-S3와 SSE-KMS를 사용하는 문장을 보여줍니다.

예시 – 별도의 대상 버킷과 함께 SSE-KMS 사용

다음 예시 정책은 별도의 대상 버킷과 함께 SSE-KMS를 사용하는 문장을 보여줘요.

예시 – SSE-S3와 SSE-KMS로 만든 객체 복제

다음은 암호화되지 않은 객체, SSE-S3로 만든 객체, SSE-KMS로 만든 객체를 복제하는 데 필요한 권한을 부여하는 전체 IAM 정책이에요.

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetReplicationConfiguration",
            "s3:ListBucket"
         ],
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetObjectVersionForReplication",
            "s3:GetObjectVersionAcl"
         ],
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket/key-prefix1*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:ReplicateObject",
            "s3:ReplicateDelete"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/key-prefix1*"
      },
      {
         "Action":[
            "kms:Decrypt"
         ],
         "Effect":"Allow",
         "Condition":{
            "StringLike":{
               "kms:ViaService":"s3.us-east-1.amazonaws.com",
               "kms:EncryptionContext:aws:s3:arn":[
                  "arn:aws:s3:::amzn-s3-demo-source-bucket/key-prefix1*"
               ]
            }
         },
         "Resource":[
           "arn:aws:kms:us-east-1:111122223333:key/key-id"
         ]
      },
      {
         "Action":[
            "kms:Encrypt"
         ],
         "Effect":"Allow",
         "Condition":{
            "StringLike":{
               "kms:ViaService":"s3.us-east-1.amazonaws.com",
               "kms:EncryptionContext:aws:s3:arn":[
                  "arn:aws:s3:::amzn-s3-demo-destination-bucket/prefix1*"
               ]
            }
         },
         "Resource":[
            "arn:aws:kms:us-east-1:111122223333:key/key-id"
         ]
      }
   ]
}

예시 – S3 Bucket Key로 객체 복제

다음은 S3 Bucket Key로 객체를 복제하는 데 필요한 권한을 부여하는 전체 IAM 정책이에요.

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetReplicationConfiguration",
            "s3:ListBucket"
         ],
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:GetObjectVersionForReplication",
            "s3:GetObjectVersionAcl"
         ],
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket/key-prefix1*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "s3:ReplicateObject",
            "s3:ReplicateDelete"
         ],
         "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/key-prefix1*"
      },
      {
         "Action":[
            "kms:Decrypt"
         ],
         "Effect":"Allow",
         "Condition":{
            "StringLike":{
               "kms:ViaService":"s3.us-east-1.amazonaws.com",
               "kms:EncryptionContext:aws:s3:arn":[
                  "arn:aws:s3:::amzn-s3-demo-source-bucket"
               ]
            }
         },
         "Resource":[
           "arn:aws:kms:us-east-1:111122223333:key/key-id"
         ]
      },
      {
         "Action":[
            "kms:Encrypt"
         ],
         "Effect":"Allow",
         "Condition":{
            "StringLike":{
               "kms:ViaService":"s3.us-east-1.amazonaws.com",
               "kms:EncryptionContext:aws:s3:arn":[
                  "arn:aws:s3:::amzn-s3-demo-destination-bucket"
               ]
            }
         },
         "Resource":[
            "arn:aws:kms:us-east-1:111122223333:key/key-id"
         ]
      }
   ]
}

계정 간 시나리오에 대한 추가 권한 부여

계정 간 시나리오, 즉 소스·대상 버킷이 서로 다른 AWS 계정에 속할 때는 KMS 키를 사용해 객체 복제본을 암호화할 수 있어요. 다만 KMS 키 소유자가 소스 버킷 소유자에게 KMS 키를 사용할 권한을 부여해야 합니다.

참고: SSE-KMS 데이터를 계정 간에 복제해야 한다면 복제 규칙이 대상 계정의 AWS KMS에서 고객 관리형 키를 지정해야 해요. AWS 관리형 키는 계정 간 사용을 허용하지 않으므로 계정 간 복제에는 사용할 수 없어요.

소스 버킷 소유자에게 KMS 키 사용 권한 부여(AWS KMS 콘솔)

  1. AWS Management Console에 로그인하고 AWS KMS 콘솔을 엽니다. (https://console.aws.amazon.com/kms)
  2. AWS 리전을 바꾸려면 페이지 오른쪽 위의 리전 선택기를 사용해요.
  3. 계정에서 만들고 관리하는 키를 보려면 탐색 창에서 **고객 관리형 키(Customer managed keys)**를 선택해요.
  4. KMS 키를 선택해요.
  5. 일반 구성(General configuration) 섹션 아래에서 키 정책(Key policy) 탭을 선택해요.
  6. **기타 AWS 계정(Other AWS accounts)**까지 아래로 스크롤한 뒤 **기타 AWS 계정 추가(Add other AWS accounts)**를 선택해요. 기타 AWS 계정 대화 상자가 나타납니다.
  7. 대화 상자에서 **다른 AWS 계정 추가(Add another AWS account)**를 선택해요. arn:aws:iam::에 소스 버킷 계정 ID를 입력해요.
  8. **변경 사항 저장(Save changes)**을 선택해요.

소스 버킷 소유자에게 KMS 키 사용 권한 부여(AWS CLI)

put-key-policy AWS Command Line Interface(AWS CLI) 명령에 대한 자세한 내용은 AWS CLI 명령 참조의 put-key-policy를, 기본 PutKeyPolicy API 작업에 대해서는 AWS Key Management Service API Reference의 PutKeyPolicy를 참고하세요.

AWS KMS 트랜잭션 할당량 고려 사항

Cross-Region Replication(CRR)을 활성화한 뒤 AWS KMS 암호화로 새 객체를 많이 추가하면 스로틀링(HTTP 503 Service Unavailable 오류)이 발생할 수 있어요. 스로틀링은 초당 AWS KMS 트랜잭션 수가 현재 할당량을 초과할 때 발생합니다. 자세한 내용은 AWS Key Management Service 개발자 안내서의 할당량을 참고하세요.

할당량 증가를 요청하려면 Service Quotas를 사용해요. 자세한 내용은 할당량 증가 요청을 참고하세요. Service Quotas가 리전에서 지원되지 않으면 AWS Support 케이스를 엽니다.

암호화된 객체에 대한 복제 활성화

기본적으로 Amazon S3는 AWS KMS 키를 사용한 서버 측 암호화(SSE-KMS) 또는 AWS KMS 키를 사용한 이중 계층 서버 측 암호화(DSSE-KMS)로 암호화된 객체를 복제하지 않아요. SSE-KMS 또는 DSS-KMS로 암호화된 객체를 복제하려면 버킷 복제 구성을 수정해서 Amazon S3에 이 객체들을 복제하라고 지시해야 합니다. 이 예시는 Amazon S3 콘솔과 AWS CLI를 사용해 버킷 복제 구성을 변경해 암호화된 객체 복제를 활성화하는 방법을 설명합니다.

참고: 소스 버킷이나 대상 버킷에 S3 Bucket Key가 활성화되어 있으면 암호화 컨텍스트는 객체의 ARN이 아니라 버킷의 Amazon 리소스 이름(ARN)이 돼요. 암호화 컨텍스트에 버킷 ARN을 사용하도록 IAM 정책을 갱신해야 해요. 자세한 내용은 S3 Bucket Key와 복제를 참고하세요. 참고: Amazon S3에서 다중 리전 AWS KMS 키를 사용할 수 있어요. 다만 Amazon S3는 현재 다중 리전 키를 단일 리전 키처럼 취급하며 키의 다중 리전 기능을 사용하지 않아요. 자세한 내용은 AWS Key Management Service 개발자 안내서의 다중 리전 키 사용을 참고하세요.

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

AWS CLI로 암호화된 객체를 복제하려면 다음을 수행해요.

  1. 소스·대상 버킷을 만들고 이 버킷들에서 버전 관리를 활성화해요.
  2. Amazon S3에 객체 복제 권한을 주는 AWS Identity and Access Management(IAM) 서비스 역할을 만들어요. IAM 역할의 권한에는 암호화된 객체를 복제하는 데 필요한 권한이 포함됩니다.
  3. 소스 버킷에 복제 구성을 추가해요. 복제 구성은 KMS 키로 암호화된 객체를 복제하는 데 관련된 정보를 제공합니다.
  4. 소스 버킷에 암호화된 객체를 추가해요.
  5. 암호화된 객체가 대상 버킷으로 복제되고 있는지 확인하기 위해 설정을 테스트해요.

다음 절차는 이 과정을 안내해요.

암호화된 객체 복제하기(AWS CLI)

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

이 예시에서는 소스(amzn-s3-demo-source-bucket)와 대상(amzn-s3-demo-destination-bucket) 버킷을 모두 같은 AWS 계정에 만들어요. AWS CLI의 자격 증명 프로필도 설정해요. 이 예시에서는 프로필 이름 acctA를 사용합니다. 자격 증명 프로필 설정과 명명된 프로필 사용에 대한 자세한 내용은 AWS Command Line Interface 사용자 안내서의 구성 및 자격 증명 파일 설정을 참고하세요.

다음 명령으로 amzn-s3-demo-source-bucket 버킷을 만들고 버전 관리를 활성화해요. 다음 예시 명령은 US East(N. Virginia)(us-east-1) 리전에 버킷을 만들어요.

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

다음 명령으로 amzn-s3-demo-destination-bucket 버킷을 만들고 버전 관리를 활성화해요. 다음 예시 명령은 US West(Oregon)(us-west-2) 리전에 버킷을 만들어요.

참고: amzn-s3-demo-source-bucket과 amzn-s3-demo-destination-bucket 버킷이 모두 같은 AWS 계정에 있을 때 복제 구성을 설정하려면 같은 프로필을 사용해요. 이 예시에서는 acctA를 사용합니다. 버킷이 서로 다른 AWS 계정에 속할 때 복제를 구성하려면 각 계정에 다른 프로필을 지정해요.

aws s3api create-bucket \
--bucket amzn-s3-demo-destination-bucket \
--region us-west-2 \
--create-bucket-configuration LocationConstraint=us-west-2 \
--profile acctA

aws s3api put-bucket-versioning \
--bucket amzn-s3-demo-destination-bucket \
--versioning-configuration Status=Enabled \
--profile acctA

다음으로 IAM 서비스 역할을 만들어요. 이 역할은 나중에 amzn-s3-demo-source-bucket 버킷에 추가하는 복제 구성에서 지정할 거예요. Amazon S3는 이 역할을 가정해서 사용자를 대신해 객체를 복제합니다. IAM 역할은 서비스 역할 만들기 → 역할에 권한 정책 연결, 두 단계로 만들어요.

IAM 서비스 역할 만들기

다음 신뢰 정책을 복사해서 로컬 컴퓨터의 현재 디렉터리에 s3-role-trust-policy-kmsobj.json라는 파일로 저장해요. 이 정책은 Amazon S3가 사용자를 대신해 작업을 수행할 수 있도록 Amazon S3 서비스 보안 주체에 역할을 가정할 권한을 부여합니다.

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

다음 명령으로 역할을 만들어요.

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

다음으로 역할에 권한 정책을 연결해요. 이 정책은 다양한 Amazon S3 버킷·객체 작업에 대한 권한을 부여합니다. 다음 권한 정책을 복사해서 로컬 컴퓨터의 현재 디렉터리에 s3-role-permissions-policykmsobj.json라는 파일로 저장해요. 나중에 IAM 역할을 만들고 정책을 연결할 거예요.

중요: 권한 정책에서 amzn-s3-demo-source-bucket과 amzn-s3-demo-destination-bucket 버킷 암호화에 사용할 AWS KMS 키 ID를 지정해요. 두 버킷에 대해 별도의 두 KMS 키를 만들어야 합니다. AWS KMS 키는 만들어진 AWS 리전 밖에서는 공유되지 않아요.

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Action":[
            "s3:ListBucket",
            "s3:GetReplicationConfiguration",
            "s3:GetObjectVersionForReplication",
            "s3:GetObjectVersionAcl",
            "s3:GetObjectVersionTagging"
         ],
         "Effect":"Allow",
         "Resource":[
            "arn:aws:s3:::amzn-s3-demo-source-bucket",
            "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
         ]
      },
      {
         "Action":[
            "s3:ReplicateObject",
            "s3:ReplicateDelete",
            "s3:ReplicateTags"
         ],
         "Effect":"Allow",
         "Condition":{
            "StringLikeIfExists":{
               "s3:x-amz-server-side-encryption":[
                  "aws:kms",
                  "AES256",
                  "aws:kms:dsse"
               ],
               "s3:x-amz-server-side-encryption-aws-kms-key-id":[
                  "AWS KMS key IDs(in ARN format) to use for encrypting object replicas"
               ]
            }
         },
         "Resource":"arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
      },
      {
         "Action":[
            "kms:Decrypt"
         ],
         "Effect":"Allow",
         "Condition":{
            "StringLike":{
               "kms:ViaService":"s3.us-east-1.amazonaws.com",
               "kms:EncryptionContext:aws:s3:arn":[
                  "arn:aws:s3:::amzn-s3-demo-source-bucket/*"
               ]
            }
         },
         "Resource":[
            "arn:aws:kms:us-east-1:111122223333:key/key-id"
         ]
      },
      {
         "Action":[
            "kms:Encrypt"
         ],
         "Effect":"Allow",
         "Condition":{
            "StringLike":{
               "kms:ViaService":"s3.us-west-2.amazonaws.com",
               "kms:EncryptionContext:aws:s3:arn":[
                  "arn:aws:s3:::amzn-s3-demo-destination-bucket/*"
               ]
            }
         },
         "Resource":[
            "arn:aws:kms:us-west-2:111122223333:key/key-id"
         ]
      }
   ]
}

정책을 만들고 역할에 연결해요.

aws iam put-role-policy \
--role-name replicationRolekmsobj \
--policy-document file://s3-role-permissions-policykmsobj.json \
--policy-name replicationRolechangeownerPolicy \
--profile acctA

다음으로 amzn-s3-demo-source-bucket 버킷에 다음 복제 구성을 추가해요. 이 구성은 Tax/ 접두사를 가진 객체를 amzn-s3-demo-destination-bucket 버킷으로 복제하라고 Amazon S3에 지시합니다.

중요: 복제 구성에서 Amazon S3가 가정할 수 있는 IAM 역할을 지정해요. 이는 iam:PassRole 권한이 있을 때만 가능합니다. CLI 명령에서 지정하는 프로필에 이 권한이 있어야 해요. 자세한 내용은 IAM 사용자 안내서의 사용자에게 역할을 AWS 서비스에 전달할 권한 부여를 참고하세요.

<ReplicationConfiguration>
  <Role>IAM-Role-ARN</Role>
  <Rule>
    <Priority>1</Priority>
    <DeleteMarkerReplication>
       <Status>Disabled</Status>
    </DeleteMarkerReplication>
    <Filter>
       <Prefix>Tax</Prefix>
    </Filter>
    <Status>Enabled</Status>
    <SourceSelectionCriteria>
      <SseKmsEncryptedObjects>
        <Status>Enabled</Status>
      </SseKmsEncryptedObjects>
    </SourceSelectionCriteria>
    <Destination>
      <Bucket>arn:aws:s3:::amzn-s3-demo-destination-bucket</Bucket>
      <EncryptionConfiguration>
        <ReplicaKmsKeyID>AWS KMS key IDs to use for encrypting object replicas</ReplicaKmsKeyID>
      </EncryptionConfiguration>
    </Destination>
  </Rule>
</ReplicationConfiguration>

amzn-s3-demo-source-bucket 버킷에 복제 구성을 추가하려면 다음을 수행해요.

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:::amzn-s3-demo-destination-bucket",
            "EncryptionConfiguration":{
               "ReplicaKmsKeyID":"AWS KMS key IDs (in ARN format) to use for encrypting object replicas"
            }
         },
         "SourceSelectionCriteria":{
            "SseKmsEncryptedObjects":{
               "Status":"Enabled"
            }
         }
      }
   ]
}

amzn-s3-demo-destination-bucket 버킷, AWS KMS key IDs (in ARN format), IAM-role-ARN 값에 대한 값을 입력하도록 JSON을 편집해요. 변경 사항을 저장합니다.

다음 명령으로 amzn-s3-demo-source-bucket 버킷에 복제 구성을 추가해요. amzn-s3-demo-source-bucket 버킷 이름을 꼭 제공하세요.

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

암호화된 객체가 복제되는지 확인하려면 Amazon S3 콘솔에서 다음을 수행해 테스트해요.

  1. AWS Management Console에 로그인하고 Amazon S3 콘솔을 엽니다. (https://console.aws.amazon.com/s3/)
  2. amzn-s3-demo-source-bucket 버킷에 Tax라는 폴더를 만들어요.
  3. 폴더에 샘플 객체를 추가해요. 객체를 암호화하려면 암호화 옵션을 선택하고 KMS 키를 꼭 지정해야 해요.
  4. amzn-s3-demo-destination-bucket 버킷에 객체 복제본이 들어 있고, 구성에서 지정한 KMS 키로 암호화되어 있는지 확인해요. 자세한 내용은 복제 상태 정보 가져오기 문서를 참고하세요.

복제 구성을 추가하는 방법을 보여주는 코드 예시는 AWS SDK 사용 문서를 참고하세요. 복제 구성을 적절히 수정해야 해요.

더 알아보기