Frage Amazon Cloudfront mit S3. Zugriff verweigert


Wir versuchen, S3-Buckets über Cloudfront zu verteilen, aber aus irgendeinem Grund ist die einzige Antwort ein AccessDenied-XML-Dokument wie das Folgende:

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

Hier sind die Einstellungen, die wir verwenden:

Distribution Settings Origin Settings

Und hier ist die Richtlinie für den Eimer

{
    "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/*"
        }
    ]
}

71
2018-03-11 12:32


Ursprung


Cache-Verhaltenseinstellungen - imgur.com/JBZqrRm - Jordan Adams
Stellen Sie sicher, dass Cloudfront aus dem S3-Bucket lesen kann. - Nathan C
Wie würde ich das aktivieren oder überprüfen? - Jordan Adams
Ursprungseinstellungen, letzte Option. Sehen Sie Ihren Screenshot. :) - Nathan C
Ich glaube, ich habe es schon früher versucht und es hat nicht funktioniert, aber ich habe es gerade wieder geändert und es wird gerade verteilt. Ich füge die Policy des Buckets zu meinem Post hinzu :) - Jordan Adams


Antworten:


Wenn Sie auf das Stammverzeichnis Ihrer CloudFront-Distribution zugreifen, müssen Sie ein Standardstammobjekt festlegen: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

So geben Sie ein Standardstammobjekt mithilfe der CloudFront-Konsole an:

  • Melden Sie sich bei der AWS Management Console an und öffnen Sie die Amazon CloudFront-Konsole unter https://console.aws.amazon.com/cloudfront/.

  • Wählen Sie in der Liste der Verteilungen im oberen Bereich die zu aktualisierende Distribution aus.

  • In dem Fenster "Verteilungsdetails", auf der Allgemeines Tab, klicken Sie auf Bearbeiten.

  • In dem Bearbeiten Sie die Verteilung Dialogfeld, in der Standard-Stammobjekt Geben Sie den Dateinamen des Standardstammobjekts ein.

    Geben Sie nur den Objektnamen ein, z. B. index.html. Fügen Sie kein / vor dem Objektnamen hinzu.

  • Um Ihre Änderungen zu speichern, klicken Sie auf Ja, Bearbeiten.


66
2017-10-16 23:12





Ich hatte gerade das gleiche Problem und während Koushas Antwort das Problem für löst index.html im Root-Pfad war mein Problem auch mit Unterverzeichnissen, wie ich diese mit kombiniert habe index.html um "hübsche URLs" zu erhalten (example.com/etwas / anstatt "hässlich" example.com/etwas.html)

Teilweise ist es auch die Schuld von Amazon, denn wenn Sie die CloudFront-Distribution einrichten, bietet es Ihnen S3-Buckets zur Auswahl, aber wenn Sie eine davon auswählen, wird die Bucket-URL anstelle der statischen Website-Hosting-URL als Backend verwendet.

Also um das Problem zu beheben:

  • Aktivieren Sie das statische Website-Hosting für den Bucket
  • Stellen Sie das ein Index (und vielleicht Error) entsprechend dokumentieren
  • Kopieren Endpunkt URL - Sie finden es neben den oben genannten Einstellungen - Es sollte etwa so aussehen: <bucket.name> .s3-website- <aws-region> .amazonaws.com
  • Verwenden Sie diese URL als Ursprung Ihrer CloudFront-Verteilung. (Dies wird auch die CF machen Standard-Stammobjekt Einstellung unnötig, aber tut nicht weh, um es trotzdem einzustellen)

40
2018-05-11 14:01



Perfekte Antwort ab dem Datum auf diesen Kommentar. - Sai Ramachandran
Das war es auch für mich. Ich hatte bereits eine andere Website und dachte, dass ich die neue identisch konfiguriere. So leicht zu übersehen. - Günther Eberl
Sie müssen dem Bucket auch öffentliche GetObject- und ListObjects-Berechtigungen hinzufügen. - Georges


Ich hatte das gleiche Problem wie @Cezz, obwohl die Lösung in meinem Fall nicht funktionieren würde.

Sobald das statische Website-Hosting für den Bereich aktiviert ist, bedeutet dies, dass Benutzer auf den Inhalt entweder über die Cloudfront-URL oder die S3-URL zugreifen können, was nicht immer wünschenswert ist. In meinem Fall ist die Cloudfront-Verteilung beispielsweise SSL-fähig und Benutzer sollten nicht über eine Nicht-SSL-Verbindung darauf zugreifen können.

Die Lösung, die ich fand, war:

  • Halten Sie das statische Website-Hosting im S3-Bucket deaktiviert
  • Behalten Sie den Ursprung der Cloudfront-Distribution als S3-ID bei
  • Setzen Sie "Bucket-Zugriff beschränken" auf "Ja" (und erlauben Sie CloudFront, die Bucket-Richtlinie automatisch zu aktualisieren)
  • Erstellen Sie auf "Error Pages" eine benutzerdefinierte Antwort, und ordnen Sie den Fehlercode "403: Forbidden" der gewünschten Antwortseite, z. B. /index.html, mit einem Antwortcode von 200 zu

Beachten Sie jedoch, dass ich in meinem Fall eine einzelne Seite Javascript-Anwendung, wo alle Pfade durch index.html gelöst werden. Wenn Sie Pfade haben, die zu verschiedenen Objekten in Ihrem S3-Bucket aufgelöst werden, funktioniert dies nicht.


7
2017-11-18 14:01



Danke für deine Antwort. Dieser hat für mich funktioniert. Ich hatte das gleiche Problem wie du. Ich wollte nicht, dass Personen auf meinen S3-Bucket zugreifen. Daher musste ich den Zugriff auf den S3-Ursprung einschränken, der nur funktioniert, wenn Sie den Ursprung wie in der Autovervollständigung in Cloudfront vorgeschlagen ausfüllen. Eine Randnotiz: Sie müssen das statische Website-Hosting nicht deaktivieren. Es genügt, die Bucket-Richtlinie zu entfernen, die den öffentlichen Zugriff zulässt. - Torsten
Das war wirklich hilfreich, die verbotene Nachricht kommt von S3, was ich zuerst nicht bemerkt habe, also musst du das mit einer benutzerdefinierten Fehlerseite erfassen, damit dein SPA funktioniert. - Ivan


In meinem Fall habe ich mehrere Ursprünge mit "Pfadmuster" -Bewegungen zusammen mit einem Ursprungspfad in meinem S3-Bucket verwendet:

Schlechtes Setup:

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

Mein-S3-Ursprung: Ursprungspfad: /images

S3-Dateien: /images/my-image.jpg

GET Anfrage: /images/my-image.jpg -> 403

Was passierte, war, dass die gesamte CloudFront GET-Anfrage an den Ursprung gesendet wurde: /image/my-image.jpg Präfix von Origin Path: /images, so sieht die Anfrage in S3 aus /images/images/my-image.jpg was nicht existiert.

Lösung

Entferne den Ursprungspfad.

Dies ermöglichte mir den Zugriff auf den Bucket mit einer Herkunftszugangsidentität und eingeschränkten Bucket-Berechtigungen und individuellen Dateiberechtigungen.


2
2017-11-08 01:10





In meinem Fall hatte ich Route 53 falsch konfiguriert. Ich hatte einen Alias ​​auf meiner Domain erstellt, aber auf den S3-Bucket statt auf die CloudFront-Distribution.

Außerdem habe ich das Standard-Root-Objekt weggelassen. Die Konsole könnte wirklich verbessert werden, wenn sie dem Fragezeichentext ein wenig Information über die möglichen Konsequenzen des Weglassens hinzufügen.


0
2017-10-14 14:29