Amazon Simple Storage Service(Amazon S3) 버킷을 사용하여 내 웹 사이트의 콘텐츠를 저장하고 있습니다. 그리고 다른 AWS 계정의 사용자가 내 버킷에 웹 사이트 객체를 업로드했습니다. 내 버킷 정책은 올바르지만, 웹 사이트에 객체가 로드되지 않습니다. 이 문제를 어떻게 해결해야 합니까?

다른 AWS 계정이 사용자 버킷에 객체를 업로드하는 경우, 사용자는 기본적으로 해당 객체를 소유하지 않으며, 객체를 읽을 수도 없습니다. 업로드 계정이 버킷 소유자인 사용자에게 객체에 대한 권한을 명시적으로 부여해야 합니다.

또한 버킷 정책은 다른 계정이 소유한 버킷의 객체에 적용되지 않습니다. 따라서 웹 사이트의 사용자에게 읽기 액세스 권한을 부여하는 버킷 정책이 다른 계정이 업로드한 객체에 자동으로 적용되지 않는 것입니다.

로드 문제를 해결하려면 다음 방법 중 하나로 객체 ACL(액세스 제어 목록)을 변경합니다.

  • 객체 소유자가 객체에 퍼블릭 읽기 액세스를 부여합니다.
  • 객체 소유자가 버킷 소유자에게 객체의 전체 제어 권한을 부여합니다. 그런 다음, 버킷 소유자는 객체 자체를 복사하여 객체의 소유권을 상속합니다.

다른 계정에 버킷 액세스 권한을 부여할 때 다음에 유의하십시오.

  • 다른 계정에 의해 버킷에 업로드된 객체는 기본적으로 해당 버킷의 계정으로 읽을 수 없습니다. 객체를 업로드한 계정에서 명시적으로 ACL을 업데이트하여 읽기 권한을 부여해야 합니다.
  • 다른 계정에 의해 버킷에 업로드된 객체는 버킷 정책에 정의된 권한을 자동으로 상속하지 않습니다. 버킷 정책을 적용하려면 버킷 소유자가 해당 객체의 소유권을 갖고 있어야 합니다.
  • 다른 계정에서 버킷에 액세스하도록 허용하려면, 권한을 관리하는 포괄적이고 중앙화된 방법으로 버킷 정책을 사용하는 것이 좋습니다.
  • 다른 계정이 사용자 버킷에 객체를 업로드하도록 허용하려면, 사용자 계정에서 AWS Identity and Access Management(IAM) 역할을 생성하는 것이 좋습니다. 그러면 다른 계정이 이 역할을 수임할 수 있습니다. 다른 계정이 IAM 역할을 사용하여 객체를 업로드하면, 해당 역할이 사용자 계정에 속해 있으므로 사용자 계정이 해당 객체를 소유하게 됩니다. IAM 역할을 사용하는 교차 계정 구성의 예는 버킷 소유자가 자신의 소유가 아닌 객체에 교차-계정 권한 부여를 참조하십시오.

객체 소유자가 객체에 퍼블릭 읽기 액세스 부여

객체를 업로드한 계정은 이 AWS CLI(AWS 명령줄 인터페이스) 명령을 실행하여 객체에 퍼블릭 읽기 액세스를 부여할 수 있습니다.

참고: --bucket의 값으로 웹 사이트 콘텐츠를 저장하는 버킷 이름을 입력합니다.

aws s3api put-object-acl --bucket awsexamplebucket --key example.jpg --acl public read

그런 다음, 객체에 대한 트랙픽을 제한해야 하면 버킷 소유자는 버킷 정책을 사용하여 특정 IP 주소나 특정 Amazon Virtual Private Cloud(VPC)의 요청인 경우에만 액세스를 허용할 수 있습니다.

예를 들어, "aws:SourceIp"로 나열된 IP 주소나 "aws:sourceVpc"로 지정된 VPC의 요청이 아니면 이 버킷 정책은 awsexamplebucket의 객체에 대한 액세스를 거부합니다.

{
    "Version": "2012-10-17",
    "Id": "Policy1415115909152",
    "Statement": [
        {
            "Sid": "Deny-Access-Except-For-Trusted-IPs-and-VPC",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::awsexamplebucket/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "1.1.1.1/32",
                        "2.2.2.2/32",
                        "3.3.3.3/32"
                    ]
                },
                "StringNotEquals": {
                    "aws:sourceVpc": "vpc-12345abc"
                }
            }
        }
    ]
}

객체 소유자가 버킷 소유자에게 객체의 전체 제어 권한 부여

객체를 업로드한 계정은 이 AWS CLI 명령을 실행하여 버킷 소유자에게 객체의 전체 제어 권한을 부여할 수 있습니다.

aws s3api put-object-acl --bucket awsexamplebucket --key example.jpg --acl bucket-owner-full-control

그런 다음, 버킷 소유자는 객체 자체를 복사하여 객체의 소유권을 상속해야 합니다. 버킷 소유자는 다음 명령을 실행할 수 있습니다.

aws s3 cp s3://awsexamplebucket/example.jpg s3://awsexamplebucket/example.jpg --storage-class STANDARD

이제 버킷 소유자는 객체를 소유합니다. 즉, 객체는 버킷 정책에 설정된 권한을 상속합니다.

교차 계정 업로드로 버킷 소유자에게 객체의 전체 제어 권한을 부여해야 함

다른 계정의 모든 업로드(s3:PutObject)에서 버킷 소유자에게 객체의 전체 제어 권한을 부여하려면 다음과 비슷한 버킷 정책을 사용할 수 있습니다.  

{
    "Id": "Policy1541018284691",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "RequireBucketOwnerFullControlOnPuts",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111122223333:user/iam_user"                ]
            },
            "Action": [
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::awsexamplebucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}

이 버킷 정책을 사용하면 다른 계정의 사용자(111122223333)는 객체의 ACL에서 버킷 소유자에게 전체 제어 권한을 부여하도록 지정한 경우에만 버킷에 업로드할 수 있습니다. 사용자가 다음과 비슷한 명령을 사용하여 객체를 업로드해야 합니다.

aws s3 cp path/to/local/file s3://awsexamplebucket --acl bucket-owner-full-control

페이지 내용이 도움이 되었습니까? | 아니요

AWS 지원 지식 센터로 돌아가기

도움이 필요하십니까? AWS 지원 센터를 방문하십시오.

게시 날짜: 2019년 3월 19일