Amazon S3의 객체에 bucket-owner-full-control ACL을 추가하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2021년 12월 10일

Amazon Simple Storage Service(Amazon S3)의 기존 객체에 bucket-owner-full-control 액세스 제어 목록(ACL)을 추가하려고 합니다. 어떻게 해야 하나요?

간략한 설명

기본적으로 다른 AWS 계정이 Amazon S3 버킷에 객체를 업로드하는 교차 계정 시나리오에서 객체는 업로드하는 계정의 소유로 유지됩니다. bucket-owner-full-control ACL이 추가되면 버킷 소유자는 다른 계정에서 작성한 모든 새 객체를 완전히 제어할 수 있습니다.

객체 작성자가 객체 ACL 수준에서 대상 계정에 대한 권한을 지정하지 않으면 대상 계정은 객체만 삭제할 수 있습니다.

bucket-owner-full-control ACL이 추가되면 버킷 소유자는 다른 AWS 계정에서 작성한 새 객체를 모두 완전히 제어할 수 있습니다. 이 ACL은 대상 버킷이 S3 객체 소유권을 사용 설정한 경우에도 필요합니다. S3 객체 소유권이 사용 설정되면 새 객체의 소유자가 대상 계정으로 업데이트됩니다.

중요: 버킷 및 객체 ACL을 통해 교차 계정 액세스 권한을 부여하는 작업은 S3 객체 소유권(S3 Object Ownership)이 버킷 소유자 적용(Bucket Owner Enforced)으로 설정된 버킷에서는 작동하지 않습니다. 대부분의 경우 객체와 버킷에 권한을 부여하는 데 ACL은 필요하지 않습니다. 대신 AWS Identity and Access Management(IAM) 정책과 S3 버킷 정책을 사용하여 객체 및 버킷에 권한을 부여하세요.

기존 객체의 경우 객체 소유자는 객체의 ACL을 업데이트하여 버킷 소유자에게 해당 객체의 모든 권한을 부여할 수 있습니다. 새 객체를 작성할 때 PUT 또는 COPY 작업 중 bucket-owner-full-control ACL을 지정할 수 있습니다.

계정 A의 사용자가 계정 B의 객체에 미리 제공된 bucket-owner-full-control ACL을 부여하려면 다음 권한이 부여되어야 합니다.

  • 계정 A의 IAM 역할 또는 사용자가 계정 B의 버킷에 대한 액세스 권한을 부여해야 합니다.
  • 계정 B의 버킷 정책은 계정 A의 IAM 역할 또는 사용자에게 액세스 권한을 부여해야 합니다.

다음과 같은 방법으로 객체에 대한 bucket-owner-full-control 액세스 권한을 부여할 수 있습니다.

  • 미리 제공된 ACL
  • S3 배치 작업(대규모 배치 작업용)

참고: 미리 제공된 bucket-owner-full-control ACL을 S3 객체에 추가할 때 VPC 엔드포인트 정책을 검토해야 합니다.

해결 방법

계정 A의 IAM 역할 또는 사용자가 계정 B의 버킷에 대한 액세스 권한을 부여해야 합니다.

참고: IAM 사용자 또는 역할이 업로드 중 객체의 ACL을 업데이트해야 하는 경우 해당 사용자에게 IAM 정책의 s3:PutObjectAcl에 대한 권한이 필요합니다.

계정 A에서 IAM 역할을 생성합니다. 역할/사용자에게 계정 B의 객체에 대해 PutObjectAcl을 수행할 수 있는 권한을 부여합니다.

다음 정책 예에서는 계정 B의 객체에 대해 GetObject, PutObjectPutObjectAcl 작업을 수행할 수 있는 액세스 권한을 계정 A의 IAM 역할에 부여합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountB-Bucket/*"
        }
    ]
}

계정 B의 버킷 정책은 계정 A의 IAM 사용자 또는 역할에 액세스 권한을 부여해야 합니다.

버킷 정책은 객체 업로드 중 미리 제공된 ACL 요구 사항에 따라 달라질 수 있습니다. 예를 들어 다음 두 버킷 정책은 서로 다른 방식으로 계정 A의 IAM 사용자 또는 역할에 액세스 권한을 부여합니다.

  • 정책 1: 미리 제공된 bucket-owner-full-control ACL을 포함하도록 Amazon S3 PUT 작업에 요구하지 않고 계정 A의 IAM 사용자 또는 역할에 액세스를 허용합니다.
  • 정책 2: 미리 제공된 bucket-owner-full-control ACL을 포함하도록 모든 Amazon S3 PUT 작업을 시행합니다.

정책 1: 미리 제공된 ACL을 포함하기 위해 Amazon S3 PUT 작업을 요구하지 않고 계정 A의 IAM 사용자 또는 역할에 대한 액세스를 허용합니다.

ACL을 요구하지 않고 계정 A의 IAM 역할에 대한 액세스를 허용하려면 계정 B(객체가 업로드되는 위치)에서 버킷 정책을 생성합니다. 이 버킷 정책은 계정 A의 IAM 역할 또는 사용자에게 액세스 권한을 부여해야 합니다. 다음 버킷 정책은 계정 A의 역할이 계정 B의 객체에 대해 GetObject, PutObjectPutObjectAcl 작업을 수행하도록 허용합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AccountA:role/AccountARole"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::AccountB-Bucket/*"
            ]
        }
    ]
}

정책 2: 미리 제공된 bucket-owner-full-control ACL을 포함하도록 모든 Amazon S3 PUT 작업을 적용합니다.

다음 버킷 정책은 계정 A의 사용자 또는 역할이 계정 B의 버킷(객체를 업로드할 위치)에 객체를 업로드할 수 있도록 지정합니다. 객체의 ACL이 “bucket-owner-full-control”로 설정된 경우에만 업로드를 수행할 수 있습니다. 예를 들면 다음과 같습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Only allow writes to my bucket with bucket owner full control",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::AccountA:role/AccountARole"
                ]
            },
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::AccountB-Bucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}

참고: 이전 버킷 정책이 적용될 때 사용자는 PutObject 작업 중 미리 제공된 bucket-owner-full-control ACL을 포함해야 합니다. 그렇지 않으면 작업이 실패하여 액세스 거부(Access Denied) 오류가 발생합니다. Amazon S3가 다른 AWS 계정의 객체 소유권을 사용하는 방법에 대한 자세한 내용은 S3 객체 소유권을 사용하여 업로드된 객체의 소유권 제어를 참조하세요.

bucket-owner-full-control 액세스 제공

미리 제공된 ACL

객체 업로드 중 미리 제공된 bucket-owner-full-control ACL을 부여하려면 계정 A(객체 소유자의 계정)에서 put-object 명령을 실행합니다.

aws s3api put-object --bucket accountB-bucket --key example.txt --acl bucket-owner-full-control

복사 작업 중 미리 제공된 bucket-owner-full-control ACL을 부여하려면 계정 A(객체 소유자의 계정)에서 copy-object 명령을 실행합니다.

aws s3api copy-object --copy-source accountA-bucket/example.txt --key example.txt --bucket accountB-bucket --acl bucket-owner-full-control

또는 계정 A에서 cp 명령을 실행하여 미리 제공된 bucket-owner-full-control ACL을 부여할 수도 있습니다.

aws s3 cp s3://accountA-bucket/test.txt s3://accountB-bucket/test2.txt --acl bucket-owner-full-control

여러 객체의 복사 작업을 위해 객체 소유자(계정 A)는 다음 명령을 실행할 수 있습니다.

aws s3 cp s3://accountA-bucket/ s3://accountB-bucket/ --acl bucket-owner-full-control --recursive

객체가 다른 계정(계정 B)의 버킷에 존재하는 경우 객체 소유자는 이 명령을 사용하여 버킷 소유자에게 액세스 권한을 부여할 수 있습니다.

aws s3api put-object-acl --bucket accountB-bucket --key example.txt --acl bucket-owner-full-control

S3 배치 작업

많은 수의 Amazon S3 객체에 대한 미리 제공된 bucket-owner-full-control ACL을 추가하려면 S3 배치 작업을 사용합니다. S3 배치 작업은 지정한 객체 목록에 대해 단일 작업을 수행할 수 있습니다. S3 배치 작업을 사용하여 많은 수의 객체에 ACL을 설정할 수도 있습니다. S3 배치 작업은 Amazon S3가 사전 정의된 액세스 권한 집합과 함께 제공하는 사용자 정의 ACL과 미리 제공된 ACL을 지원합니다.

참고: 액세스 제어 목록(ACL) 바꾸기 작업은 매니페스트에 나열된 모든 객체의 Amazon S3 ACL을 대체합니다.

추가 고려 사항

VPC 엔드포인트 정책을 통해 액세스 허용

IAM 역할이 Virtual Private Cloud(VPC) 엔드포인트를 통해 라우팅되는 인스턴스를 사용하여 S3에 객체를 업로드하는 경우 VPC 엔드포인트 정책을 확인하세요. 예를 들어 VPC의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스를 사용하여 객체를 S3에 업로드하는 경우 해당 VPC 엔드포인트 정책을 검토해야 합니다. 엔드포인트 정책이 다음과 같이 PutObjectAcl 작업에 대한 액세스 권한을 부여하는지 확인합니다.

{
    "Statement": [
        {
            "Sid": "Access-to-specific-bucket-only",
            "Principal": "*",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::AccountB-Bucket/*"
        }
    ]
}

이 문서가 도움이 되었나요?


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