다른 AWS 계정에서 내 Amazon S3 버킷으로 업로드된 웹 사이트 콘텐츠를 로드할 수 없는 이유는 무엇입니까?

최종 업데이트 날짜: 2021년 1월 27일

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

간략한 설명

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

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

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

  • 객체 소유자가 객체에 퍼블릭 읽기 액세스를 부여합니다.
  • 객체 소유자가 버킷 소유자에게 객체의 전체 제어 권한을 부여합니다.

다른 계정에 버킷 액세스 권한을 부여할 때 다음에 유의해야 합니다.

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

해결 방법

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

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

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

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

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

객체로 트래픽을 제한하기 위해 버킷 소유자는 특정 IP 주소 또는 VPC에서 오는 요청만 허용하는 버킷 정책을 사용할 수 있습니다.

예를 들어, "aws:SourceIp"로 나열된 IP 주소에서 요청이 전송되지 않는 한 이 버킷 정책은 docexamplebucket의 객체에 대한 액세스를 거부합니다. 또는 요청은 “aws:sourceVpc”로 지정된 VPC에서 이루어져야 합니다.

{
    "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:::docexamplebucket/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "1.1.1.1/32",
                        "2.2.2.2/32",
                        "3.3.3.3/32"
                    ]
                },
                "StringNotEquals": {
                    "aws:sourceVpc": "vpc-12345abc"
                }
            }
        }
    ]
}

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

객체 소유자는 대상 버킷에서 S3 객체 소유권을 활성화하여 버킷 소유자에게 객체에 대한 모든 권한을 자동으로 부여할 수 있습니다. 이 기능은 객체 소유자가 객체를 업로드할 때 버킷 소유자에게 제어 권한을 부여하며 미리 제공된 bucket-owner-full-control ACL을 포함합니다.

버킷 소유자가 S3 객체 소유권을 “버킷 소유자 기본 설정”으로 구성한 후 버킷 소유자는 다른 버킷 정책을 추가할 수 있습니다. 이 추가 버킷 정책을 사용하려면 모든 Amazon S3 PUT 작업에 미리 제공된 bucket-owner-full-control ACL을 포함해야 합니다. 이 ACL은 버킷 소유자에게 새 객체에 대한 모든 권한을 부여합니다. 자세한 내용은 S3 객체 소유권을 사용하여 업로드된 객체의 소유권 제어를 참조하세요.

버킷 소유자에게 객체에 대한 모든 권한을 부여하려면 객체를 업로드할 때 다음 CLI 구문을 사용합니다.

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

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

S3 객체 소유권을 활성화하기 전에 업로드된 기존 객체의 경우 객체 소유자가 버킷 소유자에게 객체에 대한 권한을 부여해야 합니다. 그런 다음 버킷 소유자는 객체 자체를 복사해야 합니다.

버킷 소유자에게 객체에 대한 모든 권한을 부여하려면 객체를 업로드한 계정에 다음 CLI 구문을 사용합니다.

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

객체의 객체 소유권을 상속하려면 버킷 소유자가 다음과 같이 객체 자체를 복사해야 합니다.

aws s3 cp s3://docexamplebucket/example.jpg s3://docexamplebucket/example.jpg --acl bucket-owner-full-control

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

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

다른 계정의 모든 업로드(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:::docexamplebucket/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}

이 버킷 정책을 사용하면 다른 계정(111122223333)의 사용자가 객체의 ACL이 지정된 경우에만 버킷에 업로드할 수 있습니다. 객체의 ACL은 버킷 소유자에게 모든 권한을 부여해야 합니다. 그런 다음 사용자는 다음과 같이 객체를 업로드해야 합니다.

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