버킷 간에 복제를 설정해도 Amazon S3 개체가 복제되지 않는 이유는 무엇인가요?

7분 분량
0

Amazon Simple Storage Service(S3) 버킷 간에 크로스 리전 복제(CRR) 또는 동일 리전 복제(SRR)를 설정했습니다. 그런데 개체가 대상 버킷에 복제되지 않습니다.

해결 방법

대상 버킷에 S3 개체가 복제되지 않는 문제를 해결하려면 버킷의 여러 권한 유형을 확인하세요. 또한 공개 액세스 설정과 버킷 소유권 설정도 확인하세요.

팁: 구성을 변경할 때마다 개체를 소스 버킷에 업로드하여 복제를 테스트하세요. 복제 설정 문제를 파악하려면 한 번에 하나의 구성을 변경하는 것이 가장 좋습니다.

복제 실패 원인을 해결한 후에도 소스 버킷에 복제되지 않은 개체가 있을 수 있습니다. 기본적으로 S3 복제에서는 기존 개체나 복제 상태FAILED 또는 REPLICA인 개체를 복제하지 않습니다. 복제되지 않은 객체의 복제 상태를 확인하려면 복제에 실패한 S3 객체 목록 검색을 참조하세요. 이러한 개체를 복제하려면 S3 일괄 복제를 사용하세요.

최소 Amazon S3 권한

복제 규칙에 사용된 AWS Identity and Access Management(AWS IAM) 역할에 올바른 권한이 있는지 확인합니다. 소스 버킷과 대상 버킷이 다른 계정에 있는 경우 대상 계정의 버킷 정책에서 복제 역할에 충분한 권한을 부여하는지 확인합니다.

다음 예시에는 복제에 필요한 최소 권한이 있는 IAM 정책이 나옵니다. 복제 규칙 옵션(예: SSE-KMS를 사용한 암호화)에 따라 추가 권한을 부여해야 할 수 있습니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetReplicationConfiguration",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::SourceBucket"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObjectVersionForReplication",
        "s3:GetObjectVersionAcl",
        "s3:GetObjectVersionTagging"
      ],
      "Resource": [
        "arn:aws:s3:::SourceBucket/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ReplicateObject",
        "s3:ReplicateDelete",
        "s3:ReplicateTags"
      ],
      "Resource": "arn:aws:s3:::DestinationBucket/*"
    }
  ]
}

참고: SourceBucketDestinationBucket은 S3 버킷 이름으로 바꾸세요.

IAM 역할에는 Amazon S3가 개체를 복제하는 역할을 맡을 수 있도록 허용하는 신뢰 정책이 있어야 합니다.

예시:

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

대상 버킷이 다른 계정에 있는 경우 대상 버킷 정책에서 다음 권한을 부여해야 합니다.

{
  "Version": "2012-10-17",
  "Id": "PolicyForDestinationBucket",
  "Statement": [
    {
      "Sid": "Permissions on objects",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role"
      },
      "Action": [
        "s3:ReplicateTags",
        "s3:ReplicateDelete",
        "s3:ReplicateObject"
      ],
      "Resource": "arn:aws:s3:::DestinationBucket/*"
    }
  ]
}

참고: arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role은 복제 역할의 ARN으로 바꾸세요.

추가 Amazon S3 권한

복제 규칙이 대상 버킷 소유자로 개체 소유권 변경으로 설정되어 있는 경우, IAM 역할에 s3:ObjectOwnerOverrideToBucketOwner 권한이 있어야 합니다. 이 권한은 S3 개체 리소스에 부여됩니다.

예시:

{
    "Effect":"Allow",
         "Action":[
       "s3:ObjectOwnerOverrideToBucketOwner"
    ],
    "Resource":"arn:aws:s3:::DestinationBucket/*"
}

또한 대상 계정은 버킷 정책을 통해 s3:ObjectOwnerOverrideToBucketOwner 권한을 부여해야 합니다.

{
    "Sid":"1",
    "Effect":"Allow",
    "Principal":{"AWS":"arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role"},
    "Action":["s3:ObjectOwnerOverrideToBucketOwner"],
    "Resource":"arn:aws:s3:::DestinationBucket/*"
}

참고: 대상 버킷의 개체 소유권 설정버킷 소유자 적용이 포함된 경우, 복제 규칙에서 개체 소유권을 대상 버킷 소유자로 변경할 필요가 없습니다. 이 변경은 기본적으로 적용됩니다.

복제 규칙에 마커 복제 삭제가 활성화된 경우, IAM 역할에 s3:ReplicateDelete 권한이 있어야 합니다. 대상 버킷이 다른 계정에 있는 경우 대상 버킷 소유자도 버킷 정책을 통해 이 권한을 부여해야 합니다. 예를 들면 다음과 같습니다.

{
    "Effect":"Allow",
    "Action":["s3:ReplicateDelete"],
    "Resource":"arn:aws:s3:::DestinationBucket/*"
}

참고: DestinationBucket은 S3 버킷 이름으로 바꾸세요.

IAM 역할에 추가 S3 권한을 추가한 후에는 대상 버킷의 버킷 정책을 통해 같은 권한을 부여해야 합니다.

{
  "Version": "2012-10-17",
  "Id": "PolicyForDestinationBucket",
  "Statement": [
    {
      "Sid": "Stmt1644945277847",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role"
      },
      "Action": [
        "s3:ReplicateObject",
        "s3:ReplicateTags",
        "s3:ObjectOwnerOverrideToBucketOwner",
        "s3:ReplicateDelete"
      ],
      "Resource": "arn:aws:s3:::DestinationBucket/*"
    }
  ]
}

AWS KMS 권한

버킷의 소스 개체가 AWS KMS 키로 암호화된 경우, AWS KMS 암호화 개체를 포함하도록 복제 규칙을 구성해야 합니다.

AWS KMS로 암호화된 개체를 포함하려면 다음을 수행하세요.

1.    Amazon S3 콘솔을 엽니다.

2.    소스 개체가 포함된 S3 버킷을 선택합니다.

3.    관리 탭에서 복제 규칙을 선택합니다.

5.    편집을 선택합니다.

6.    암호화에서 AWS KMS로 암호화된 개체 복제를 선택합니다.

7.    대상 개체 암호화를 위한 AWS KMS 키에서 AWS KMS 키를 선택합니다. 기본 옵션은 AWS KMS 키(aws/S3)를 사용하는 것입니다.

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

중요: 대상 버킷이 다른 AWS 계정에 있는 경우, 대상 계정이 소유한 AWS KMS 고객 관리형 키를 지정하세요. 기본 aws/S3 키를 사용하지 마세요. 기본 aws/S3 키를 선택하면 소스 계정이 소유한 AWS 관리형 키로 개체가 암호화되며 다른 계정과 공유할 수 없게 됩니다. 따라서 대상 계정에서 대상 버킷의 개체에 액세스할 수 없습니다.

크로스 계정 시나리오를 위한 AWS KMS 추가 권한

대상 계정에 속한 AWS KMS 키를 사용하여 대상 개체를 암호화하려면 대상 계정이 KMS 키 정책에서 복제 역할을 부여해야 합니다.

{
    "Sid": "AllowS3ReplicationSourceRoleToUseTheKey",
    "Effect": "Allow",
    "Principal": {"AWS": "arn:aws:iam::SourceBucket-account-ID:role/service-role/source-account-IAM-role"},
    "Action": ["kms:GenerateDataKey", "kms:Encrypt"],
    "Resource": "*"
}

참고: AWS KMS 키 정책에서 리소스에 별표(*)를 사용한다고 가정해보겠습니다. 이 경우 정책은 복제 역할에만 AWS KMS 키에 대한 권한을 부여합니다. 정책에 따라 복제 역할의 권한을 높일 수는 없습니다.

또한 소스 계정은 복제 역할의 IAM 정책에 다음과 같은 최소 권한을 추가해야 합니다.

{
    "Effect": "Allow",
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
    ],
    "Resource": [
        "SourceKmsKeyArn"
    ]
},
{
    "Effect": "Allow",
    "Action": [
        "kms:GenerateDataKey",
        "kms:Encrypt"
    ],
    "Resource": [
        "DestinationKmsKeyArn"
    ]
}

AWS KMS 키 정책에 따르면, 기본적으로 루트 사용자는 키에 대한 모든 권한이 있습니다. 이러한 권한을 같은 계정의 다른 사용자에게 위임할 수 있습니다. IAM 정책을 사용하여 소스 KMS 키에 복제 역할 권한을 부여할 수 있습니다. 소스 KMS 키 정책에 거부 문이 없는 한 이것으로 충분합니다.

명시적 거부 및 조건부 허용 문

사용 권한의 유효성을 검사한 후에도 개체가 복제되지 않는 경우 명시적 거부 문이 있는지 확인하세요.

  • 대상 버킷 정책 또는 AWS KMS 키 정책에 다음에 대한 액세스를 제한하는 거부 문이 있으면 복제가 실패할 수 있습니다.
    • 특정 CIDR 범위
    • VPC(Virtual Private Cloud) 엔드포인트
    • S3 액세스 포인트
  • IAM 역할에 연결된 거부 문 또는 권한 경계로 인해 복제가 실패할 수 있습니다.
  • 소스 또는 대상 계정에 연결된 AWS 조직 서비스 제어 정책(SCP)의 거부 문으로 인해 복제가 실패할 수 있습니다.

팁: 명시적 거부 문을 제거하기 전에 거부를 사용하는 이유를 확인하고 거부 문이 데이터 보안에 영향을 미치는지 확인하세요.

Amazon S3 버킷 키 및 복제 고려 사항

소스 또는 대상 KMS 키가 암호화 컨텍스트에 따라 권한을 부여하는 경우 버킷에 대해 S3 버킷 키가 켜져 있는지 확인하세요. 버킷에 버킷 키가 켜져 있는 경우 암호화 컨텍스트는 버킷 수준 리소스에 대한 것이어야 합니다.

"kms:EncryptionContext:aws:s3:arn": [
     "arn:aws:s3:::SOURCE_BUCKET_NAME"
     ]
"kms:EncryptionContext:aws:s3:arn": [
     "arn:aws:s3:::DESTINATION_BUCKET_NAME"
     ]

참고: SOURCE_BUCKET_NAMEDESTINATION_BUCKET_NAME은 소스 및 대상 버킷 이름으로 바꾸세요.

소스 또는 대상 버킷에 버킷 키가 켜져 있지 않은 경우, 암호화 컨텍스트는 개체 수준 리소스여야 합니다.

"kms:EncryptionContext:aws:s3:arn": [
     "arn:aws:s3:::SOURCE_BUCKET_NAME/*"
     ]
"kms:EncryptionContext:aws:s3:arn": [
     "arn:aws:s3:::DESTINATION_BUCKET_NAME/*"
     ]

참고: SOURCE_BUCKET_NAMEDESTINATION_BUCKET_NAME은 소스 및 대상 버킷 이름으로 바꾸세요.

개체 ACL 및 공개 액세스 차단

소스 및 대상 버킷이 액세스 제어 목록(ACL)을 사용하고 있는지 확인합니다. 개체에 공용 액세스를 허용하는 ACL이 포함되어 있어도 대상 버킷이 공용 액세스 차단을 사용하면 복제에 실패합니다.

소스 개체 소유권

소스 버킷 개체를 다른 AWS 계정에서 업로드한 경우, 소스 계정에 해당 개체에 대한 권한이 없을 수 있습니다. 소스 버킷에서 ACL이 비활성화되어 있는지 확인하세요. 소스 버킷에 ACL이 비활성화되어 있으면 버킷에 있는 모든 개체의 소유자는 소스 계정입니다. 소스 버킷에 ACL이 비활성화되어 있지 않으면 개체 소유권이 개체 소유자 선호 또는 버킷 소유자 선호로 설정되어 있는지 확인합니다. 버킷이 버킷 소유자 선호로 설정된 경우, 버킷 소유자가 개체 소유자가 되려면 소스 버킷 개체에 버킷 소유자 전체 제어 ACL이 필요합니다.

ACL을 비활성화하면 소스 계정에서 버킷에 있는 모든 개체의 소유권을 가질 수 있습니다. 대부분의 사용 사례에서는 ACL을 사용하여 액세스를 관리할 필요가 없습니다. IAM 및 버킷 정책을 사용하여 S3 리소스에 대한 액세스를 관리하는 것이 가장 좋은 방법입니다. S3 버킷에서 ACL을 비활성화하려면 개체 소유권 제어 및 버킷 ACL 비활성화를 참조하세요. 버킷과 개체에 대해 현재 ACL 사용량을 평가하는 것을 잊지 마세요. 현재 버킷과 IAM 정책에서 충분한 권한을 부여해야 Amazon S3 액세스에 영향을 주지 않고 ACL을 비활성화할 수 있습니다.

복제 규칙 필터

복제 규칙 필터를 올바르게 지정했는지 확인하세요.

키 접두사와 개체 태그의 조합으로 규칙 필터를 지정하는 경우, S3는 논리적 AND 연산을 수행하여 이러한 필터를 결합합니다. 즉, 이 규칙은 특정 키 접두사와 특정 태그를 가진 개체의 하위 집합에 적용됩니다.

관련 정보

연습: 복제 구성 예시

AWS 공식
AWS 공식업데이트됨 일 년 전