S3가 포함 된 Amazon Cloudfront. 접근 불가


91

Cloudfront를 통해 S3 버킷을 배포하려고하지만 어떤 이유로 유일한 응답은 다음과 같은 AccessDenied XML 문서입니다.

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>89F25EB47DDA64D5</RequestId>
    <HostId>Z2xAduhEswbdBqTB/cgCggm/jVG24dPZjy1GScs9ak0w95rF4I0SnDnJrUKHHQC</HostId>
</Error>

사용중인 설정은 다음과 같습니다.

배포 설정 원점 설정

그리고 여기 버킷 정책이 있습니다

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity *********"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::x***-logos/*"
        }
    ]
}

캐시 동작 설정 -imgur.com/JBZqrRm
Jordan Adams

Cloudfront가 S3 버킷에서 읽을 수 있는지 확인하십시오.
Nathan C

이 기능을 어떻게 활성화 또는 확인합니까?
Jordan Adams

원점 설정, 마지막 옵션. 스크린 샷을 참조하십시오. :)
Nathan C

나는 이것을 이전에 시도했지만 작동하지 않았지만 다시 변경했으며 배포 과정에 있습니다. 나는 버킷 정책을 내 게시물에 추가 할 것이다 :)
Jordan Adams

답변:


91

CloudFront 배포의 루트에 액세스하는 경우 기본 루트 객체를 설정해야합니다. http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

CloudFront 콘솔을 사용하여 기본 루트 객체를 지정하려면

  • AWS Management Console에 로그인하고 https://console.aws.amazon.com/cloudfront/ 에서 Amazon CloudFront 콘솔을 엽니 다 .

  • 상단 창의 배포 목록에서 업데이트 할 배포를 선택하십시오.

  • 에서 배포 세부 정보 창 , 온 일반 탭을 클릭 편집 .

  • 에서 편집 배포 대화 상자에서 기본 루트 개체 필드에 기본 루트 개체의 파일 이름을 입력합니다.

    개체 이름 만 입력하십시오 (예 :) index.html. 객체 이름 앞에 /를 추가하지 마십시오.

  • 변경 사항을 저장하려면 예, 편집을 클릭 하십시오 .


제 경우에는이 설정으로 문제가 해결되지 않았습니다. 여전히 액세스 거부 오류가 발생합니다
KurioZ7

53

난 그냥 같은 문제를 했어 Kousha이고의 답변에 대한 문제를 해결 않지만 index.html을 루트 경로에 내가 함께 그 사용, 내 문제는 하위 디렉토리와도 있었다 index.html을을 (예를 얻을 "꽤 URL을"로 "못생긴"대신 .com / something / example.com/something.html)

CloudFront 배포를 설정할 때 선택할 수있는 S3 버킷을 제공하지만 그 중 하나를 선택하면 정적 웹 사이트 호스팅 URL이 아닌 버킷 URL을 백엔드로 사용하기 때문에 Amazon의 잘못이기도합니다.

따라서 문제를 해결하려면 다음을 수행하십시오.

  • 버킷에 정적 웹 사이트 호스팅 활성화
  • 세트 인덱스 (아마도 오류 적절하게) 문서를
  • 엔드 포인트 URL 복사 -위 설정 옆에서 찾을 수 있습니다. <bucket.name> .s3-website- <aws-region> .amazonaws.com
  • 해당 URL을 CloudFront Distribution 오리진으로 사용하십시오. (이것은 또한 CF 기본 루트 객체 설정을 불필요하게 만들지 만 어쨌든 설정하지 않아도됩니다)

이 의견에 대한 날짜 기준으로 완벽한 답변.
사이 Ramachandran

그것은 저에게도 마찬가지였습니다. 이미 다른 웹 사이트가 작동하고 있으며 새 웹 사이트를 동일하게 구성했다고 생각했습니다. 이것을 간과하기 쉽습니다.
Günther Eberl

또한 버킷에 퍼블릭 GetObject 및 ListObjects 권한을 추가해야합니다.
Georges

8

@Cezz와 동일한 문제가 있었지만 해결책은 작동하지 않습니다.

버킷에 정적 웹 사이트 호스팅이 활성화되면 사용자는 Cloudfront URL 또는 S3 URL을 통해 콘텐츠에 액세스 할 수 있습니다. 이는 항상 바람직하지는 않습니다. 예를 들어 필자의 경우 Cloudfront 배포에서 SSL을 사용하도록 설정했으며 사용자는 비 SSL 연결을 통해 액세스 할 수 없어야합니다.

내가 찾은 해결책은 다음과 같습니다.

  • S3 버킷에서 정적 웹 사이트 호스팅을 비활성화 상태로 유지
  • Cloudfront 배포 원본을 S3 ID로 유지
  • "버킷 액세스 제한"을 "예"로 설정하십시오 (쉽게 CloudFront에서 버킷 정책을 자동으로 업데이트하도록 허용)
  • "오류 페이지"에서 사용자 정의 응답을 작성하고 오류 코드 "403 : 금지됨"을 원하는 응답 페이지 (예 : /index.html)에 응답 코드 200으로 맵핑하십시오.

필자의 경우 모든 경로가 index.html에 의해 해결되는 단일 페이지 자바 스크립트 응용 프로그램을 제공하고 있습니다. S3 버킷의 다른 객체로 해석되는 경로가 있으면 작동하지 않습니다.


1
답변 주셔서 감사합니다. 이것은 나를 위해 일했습니다. 나는 너와 같은 문제가 있었다. 사람들이 내 S3 버킷에 액세스하는 것을 원하지 않았으므로 Cloudfront의 자동 완성에서 제안한대로 오리진을 채울 때만 작동하는 S3 오리진에 대한 액세스를 제한해야했습니다. 한 가지 참고 사항은 정적 웹 사이트 호스팅을 비활성화 할 필요가 없습니다. 퍼블릭 액세스를 허용하는 버킷 정책 만 제거하면됩니다.
Torsten

이것은 정말 도움이되었습니다. 금지 된 메시지는 처음에는 알지 못했던 S3에서 나왔으므로 SPA가 작동하도록 사용자 정의 오류 페이지를 잡아야합니다.
Ivan

4

필자의 경우 S3 버킷의 원점 경로와 함께 "경로 패턴"동작과 함께 여러 원점을 사용하고있었습니다.

잘못된 설정 :

CloudFront 동작 : /images/*->My-S3-origin

My-S3-origin : 원산지 경로 : /images

S3 파일 : /images/my-image.jpg

GET 요청 : /images/my-image.jpg-> 403

발생한 전체 CloudFront GET 요청은 /image/my-image.jpgOrigin Path : 접두사가 붙은 origin :으로 전송 /images되었으므로 S3에 대한 요청 /images/images/my-image.jpg은 존재하지 않는 것처럼 보입니다 .

해결책

원점 경로를 제거하십시오.

이를 통해 오리진 액세스 ID 및 버킷 권한과 개별 파일 권한이 제한된 버킷에 액세스 할 수있었습니다.


1

제 경우에는 Route 53을 잘못 구성했습니다. 내 도메인에 별칭을 만들었지 만 CloudFront 배포 대신 S3 버킷을 가리 켰습니다.

또한 기본 루트 객체를 생략했습니다. 콘솔을 생략했을 때 발생할 수있는 결과에 대한 정보를 물음표 텍스트에 추가하면 콘솔을 실제로 개선 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.