버킷 간에 복제를 설정했지만 새 객체가 복제되지 않습니다. 이 문제를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 3월 30일

Amazon Simple Storage Service(Amazon S3) 버킷 간에 CRR(교차 리전 복제) 또는 SRR(동일 리전 복제)을 설정했습니다. 하지만 객체는 대상 버킷으로 복제되지 않습니다. 해결하려면 어떻게 해야 하나요?

해결 방법

대상 버킷으로 복제되지 않는 객체 문제를 해결하려면 버킷에 대한 다양한 유형의 권한을 확인합니다. 또한 퍼블릭 액세스 설정 및 버킷 소유권 설정도 확인합니다.

팁: 각 구성 변경 후 소스 버킷에 객체를 업로드하여 복제를 테스트해야 합니다. 복제 설정 문제를 식별하기 위해 구성을 한 번에 하나씩 변경하는 것이 가장 좋습니다.

복제 실패의 원인이 되는 문제를 해결한 후 소스 버킷에 복제되지 않은 객체가 있을 수 있습니다. 기본적으로 S3 복제는 기존 객체나 복제 상태가 FAILED 또는 REPLICA인 객체를 복제하지 않습니다. S3 배치 복제를 사용하여 이러한 객체를 복제합니다.

Amazon S3 최소 권한

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

다음 예에서는 복제에 필요한 최소 권한이 있는 IAM 정책을 보여 줍니다.    복제 규칙 옵션에 따라 추가 권한을 부여해야 할 수 있습니다.

{
    "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: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": "Policy1644945280205",
    "Statement": [
        {
            "Sid": "Stmt1644945277847",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789101:role/s3-replication-role"
            },
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateTags"
            ],
            "Resource": "arn:aws:s3:::DestinationBucket/*"
        }
    ]
}

참고: arn:aws:iam::123456789101:role/s3-replication-rol을 복제 역할의 ARN으로 바꿉니다.    

Amazon S3 추가 권한

복제 규칙이 객체 소유권을 대상 버킷 소유자로 변경으로 설정된 경우 IAM 역할에는 s3:ObjectOwnerOverrideToBucketOwner 권한이 있어야 합니다. 이 권한은 S3 객체 리소스에 배치됩니다. 예:

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

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

{
  "Version": "2012-10-17",
  "Id": "Policy1644945280205",
  "Statement": [
    {
      "Sid": "Stmt1644945277847",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789101:role/s3-replication-role"
      },
      "Action": [
        "s3:ReplicateObject",
        "s3:ReplicateTags",
        "s3:ObjectOwnerOverrideToBucketOwner"
      ],
      "Resource": "arn:aws:s3:::DestinationBucket/*"
    }
  ]
}

참고: 대상 버킷의 객체 소유권 설정에 버킷 소유자 적용이 포함되어 있으면 복제 규칙에서 객체 소유권을 대상 버킷 소유자로 변경할 필요가 없습니다. 이 변경은 기본적으로 발생합니다.

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

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

}

참고: DestinationBucket을 S3 버킷 이름으로 바꿉니다.

대상 버킷의 버킷 정책을 통해서도 동일한 권한을 부여해야 합니다.

{
  "Version": "2012-10-17",
  "Id": "Policy1644945280205",
  "Statement": [
    {
      "Sid": "Stmt1644945277847",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789101:role/s3-replication-role"
      },
      "Action": [
        "s3:ReplicateObject",
        "s3:ReplicateTags",
        "s3:ObjectOwnerOverrideToBucketOwner",
        "s3:ReplicateDelete"
      ],
      "Resource": "arn:aws:s3:::DestinationBucket/*"
    }
  ]
}

AWS KMS 권한

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

AWS KMS로 암호화된 객체를 포함하려면 다음을 수행합니다.

1.    Amazon S3 콘솔을 엽니다.

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

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

5.    편집(Edit)을 선택합니다.

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

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

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

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

{
    "Sid": "AllowS3ReplicationSourceRoleToUseTheKey",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::123456789101:role/s3-replication-role"
    },
    "Action": ["kms:GenerateDataKey", "kms:Encrypt"],
    "Resource": "*"
}

참고: AWS KMS 키 정책의 리소스에 별표(*)를 사용하면 정책에서 복제 역할에만 KMS 키에 대한 권한을 부여합니다. 이 정책은 복제 역할이 권한을 상향하는 것을 허용하지 않습니다.

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

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

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

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

권한을 검증한 후에도 객체가 여전히 복제되지 않는 경우 명시적 deny 문이 있는지 확인합니다.

  • 대상 버킷 정책의 deny 문 또는 특정 CIDR 범위, VPC 엔드포인트 또는 S3 액세스 포인트에 대한 액세스를 제한하는 KMS 키 정책으로 인해 복제가 실패할 수 있습니다.
  • IAM 역할에 연결된 deny 문 또는 권한 경계로 인해 복제가 실패할 수 있습니다.
  • 소스 또는 대상 계정에 연결된 AWS Organizations 서비스 제어 정책의 deny 문으로 인해 복제가 실패할 수 있습니다.

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

소스 또는 대상 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이 비활성화되어 있지 않으면 객체 소유권이 객체 소유자 우선 또는 버킷 소유자 우선으로 설정되어 있는지 확인합니다. 버킷이 버킷 소유자 우선으로 설정된 경우 소스 버킷 객체에 버킷 소유자가 객체 소유자가 되려면 bucket-owner-full-control ACL이 필요합니다.

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


이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요하세요?