Amazon Cloudfront z S3. Brak dostępu

91

Próbujemy rozpowszechniać segmenty S3 za pośrednictwem Cloudfront, ale z jakiegoś powodu jedyną odpowiedzią jest dokument XML AccessDenied, taki jak poniżej:

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

Oto ustawienia, których używamy:

Ustawienia dystrybucji Ustawienia pochodzenia

A oto zasady dotyczące koszyka

{
    "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/*"
        }
    ]
}
Jordan Adams
źródło
Ustawienia zachowania pamięci podręcznej - imgur.com/JBZqrRm
Jordan Adams
Upewnij się, że Cloudfront może czytać z segmentu S3.
Nathan C
Jak mam to włączyć lub sprawdzić?
Jordan Adams,
Ustawienia pochodzenia, ostatnia opcja. Zobacz zrzut ekranu. :)
Nathan C
Myślę, że próbowałem tego wcześniej i to nie działało, ale właśnie to zmieniłem i jest w trakcie dystrybucji. Dodam zasady wiaderka do mojego posta :)
Jordan Adams

Odpowiedzi:

91

Jeśli uzyskujesz dostęp do katalogu głównego swojej dystrybucji CloudFront, musisz ustawić domyślny obiekt główny: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

Aby określić domyślny obiekt główny za pomocą konsoli CloudFront:

  • Zaloguj się do konsoli zarządzania AWS i otwórz konsolę Amazon CloudFront pod adresem https://console.aws.amazon.com/cloudfront/ .

  • Na liście dystrybucji w górnym okienku wybierz dystrybucję do aktualizacji.

  • W okienku Szczegóły dystrybucji na karcie Ogólne kliknij opcję Edytuj .

  • W oknie dialogowym Edytuj rozkład , w polu Domyślny obiekt główny wprowadź nazwę pliku domyślnego obiektu głównego.

    Wprowadź tylko nazwę obiektu, na przykład index.html. Nie dodawaj znaku / przed nazwą obiektu.

  • Aby zapisać zmiany, kliknij Tak, Edytuj .

Kousha
źródło
W moim przypadku to ustawienie nie rozwiązało problemu. Nadal
pojawia się
53

Właśnie miałem ten sam problem i chociaż odpowiedź Kousha rozwiązuje problem dla index.html w ścieżce katalogu głównego, mój problem dotyczył również podkatalogów, ponieważ użyłem tych w połączeniu z index.html, aby uzyskać „ładne adresy URL” (przykład .com / coś / zamiast „brzydkiego” example.com/something.html)

Częściowo jest to także wina Amazon, ponieważ po skonfigurowaniu dystrybucji CloudFront zaoferuje ci ona wiadra S3 do wyboru, ale jeśli wybierzesz jeden z nich, użyje adresu URL wiadra zamiast statycznego adresu URL hostingu witryny jako zaplecza.

Aby rozwiązać problem:

  • Włącz statyczny hosting witryn dla segmentu
  • Ustaw odpowiednio dokument indeksu (i być może błąd )
  • Skopiuj adres URL punktu końcowego - możesz go znaleźć obok powyższych ustawień - Powinien on wyglądać mniej więcej tak: <nazwa_backa.> .S3-website- <region-pazur> .amazonaws.com
  • Użyj tego adresu URL jako źródła Dystrybucji CloudFront. (Spowoduje to również, że ustawienie Domyślnego obiektu głównego CF nie będzie konieczne, ale i tak nie zaszkodzi go ustawić)
Miroslav
źródło
Doskonała odpowiedź na datę tego komentarza.
Sai Ramachandran
To też było dla mnie. Miałem już działającą inną stronę internetową i pomyślałem, że skonfigurowałem ją identycznie. Tak łatwo to przeoczyć.
Günther Eberl,
Musisz także dodać publiczne uprawnienia GetObject i ListObjects do segmentu.
Georges
8

Miałem ten sam problem co @Cezz, chociaż rozwiązanie nie działałoby w moim przypadku.

Gdy tylko statyczny hosting witryny zostanie włączony dla segmentu, oznacza to, że użytkownicy mogą uzyskać dostęp do treści za pośrednictwem adresu URL Cloudfront lub adresu URL S3, co nie zawsze jest pożądane. Na przykład w moim przypadku dystrybucja Cloudfront ma włączoną obsługę SSL, a użytkownicy nie powinni mieć do niej dostępu przez połączenie inne niż SSL.

Rozwiązaniem, które znalazłem było:

  • utrzymuj statyczny hosting stron internetowych wyłączony w segmencie S3
  • zachowaj źródło dystrybucji Cloudfront jako identyfikator S3
  • ustaw „Ogranicz dostęp do segmentu” na „Tak” (i dla ułatwienia CloudFront automatycznie aktualizuj zasady segmentu)
  • na „Stronach błędów” utwórz niestandardową odpowiedź i zamapuj kod błędu „403: Zabroniony” na żądaną stronę odpowiedzi, tj. /index.html, z kodem odpowiedzi 200

Zauważ jednak, że w moim przypadku obsługuję jednostronicową aplikację javascript, w której wszystkie ścieżki są rozwiązywane przez index.html. Jeśli masz ścieżki, które prowadzą do różnych obiektów w segmencie S3, to nie zadziała.

Jonny Green
źródło
1
Dzięki za odpowiedź. Ten działał dla mnie. Miałem ten sam problem co ty. Nie chciałem, aby ludzie uzyskiwali dostęp do mojego segmentu S3, więc musiałem ograniczyć dostęp do S3 Origin, który działa tylko wtedy, gdy wypełnisz źródło, jak sugeruje automatyczne uzupełnianie w Cloudfront. Z jednej strony należy pamiętać, że nie trzeba wyłączać statycznego hostingu witryny. Wystarczy usunięcie zasady segmentu, która umożliwia publiczny dostęp.
Torsten
To było bardzo pomocne, zakazana wiadomość pochodzi z S3, której początkowo nie zdawałem sobie sprawy, więc musisz złapać ją za pomocą niestandardowej strony błędu, aby Twoje SPA działało.
Ivan
4

W moim przypadku korzystałem z wielu źródeł z zachowaniami „Wzorzec ścieżki” wraz ze ścieżką pochodzenia w moim segmencie S3:

Zła konfiguracja:

Zachowanie CloudFront: /images/*->My-S3-origin

My-S3-origin: Origin Path: /images

Pliki S3: /images/my-image.jpg

Żądanie GET: /images/my-image.jpg -> 403

Działo się tak, że całe żądanie CloudFront GET jest wysyłane do źródła: z /image/my-image.jpgprefiksem Origin Path: /imageswięc żądanie do S3 wygląda tak, /images/images/my-image.jpgże nie istnieje.

Rozwiązanie

usuń ścieżkę początkową.

To pozwoliło mi uzyskać dostęp do segmentu z ograniczoną tożsamością dostępu źródłowego i uprawnieniami segmentu oraz indywidualnymi plikami.

Scott Jungwirth
źródło
1

W moim przypadku źle skonfigurowałem Trasę 53. Utworzyłem Alias ​​w mojej domenie, ale wskazałem go na S3 Bucket zamiast dystrybucji CloudFront.

Pominąłem również domyślny obiekt główny. Konsolę można naprawdę ulepszyć, jeśli dodadzą trochę informacji do tekstu znaku zapytania o potencjalnych konsekwencjach pominięcia go.

toon81
źródło