2015-12-03 7 views
14

Ich habe eine statische Website zu Amazon S3 nur zum Einsatz, die sich hier eingesehen werden können: http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/Cloudfront + S3 Website: „Der angegebene Schlüssel nicht existiert“, wenn ein impliziter Index Dokument angezeigt werden soll

Wenn Sie klicken Sie auf einen der Artikel Links, werden Sie die folgenden Fehler feststellen:

S3 Error

S3 wird die Datei beschwerte nicht vorhanden ist. Nun, das ist seltsam - ich benutze CloudFront auf meiner Domain. Wenn Sie also auf diesen Artikellink klicken, wird die Anforderung an CloudFront gesendet, die dann versucht, die Datei aus dem S3-Bucket abzurufen.

Wenn Sie jedoch dieselbe URL von S3 direkt aufrufen, zB: http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/2015/building-a-heroku-addon-planning/, wird die Seite einfach geladen.

Es scheint, dass hier etwas in der Übersetzung verloren geht.

Jeder hat einen Vorschlag, was ich tun kann, um meine Einstellungen zu beheben?

Antwort

33

Ich gehe auf ein Bein und sagen, dass der angegebene Schlüssel nicht technisch existiert, so ist die Fehlermeldung technisch genau, aber nicht die ganze Geschichte erzählen. Dies sollte eine einfache Lösung sein.

S3-Buckets haben zwei ¹ Endpunkte, "REST" und "Website". Sie haben zwei verschiedene Feature-Sets. Der Website-Endpunkt bietet eine magische Auflösung von Indexdokumenten (z. B. index.html, die anscheinend in dem von Ihnen bereitgestellten Beispiel an den Browser zurückgegeben wird), während dies bei den REST-Endpunkten nicht der Fall ist.

Wenn Sie CloudFront vor einem für das Website-Hosting verwendeten Bucket konfigurieren, möchten Sie den Ursprung normalerweise nicht als "S3" -Ursprung konfigurieren, indem Sie den Bucket-Namen aus der Dropdown-Liste auswählen. Stattdessen möchten Sie es als "benutzerdefinierten" Ursprung konfigurieren und den Hostnamen des Websiteendpunkts wie in der S3-Konsole (z. B. example-bucket.s3-website-us-east-1...) verwenden, da CloudFront andernfalls annimmt, dass er den REST-Endpunkt für den Bucket verwenden soll Authentifizierung und private Inhalte, die der Endpunkt der Website nicht enthält).

Important

Do not select the name of your bucket from the list, for example, example.com.s3.amazonaws.com.

http://docs.aws.amazon.com/gettingstarted/latest/swh/getting-started-create-cfdist.html

Die Dokumentation Refactoring wurde da diese Frage wurde ursprünglich beantwortet, so dass die obige Meldung erscheint jetzt später eine Seite gezeigt, und hat umformuliert worden, aber der Kern ist das gleiche. Der "Name des Buckets" scheint sich auf die Auswahlmöglichkeiten in der Drop-down-Liste zu beziehen, was nicht Ihren Vorstellungen entspricht.

Note

Be sure to specify the static website hosting endpoint, not the name of the bucket.

http://docs.aws.amazon.com/AmazonS3/latest/dev/website-hosting-cloudfront-walkthrough.html

Der Hinweis, dass Sie den REST-Endpunkt für den Eimer verwenden, weil die Fehlermeldung nicht in XML wäre, wenn Sie die Website Endpunkt verwendet hat.

Erstellen Sie einen neuen Ursprung für die CloudFront-Verteilung, wie beschrieben, ändern Sie dann das Verhalten zum Senden von Anforderungen an den neuen Ursprung und senden Sie dann eine CloudFront-Cache-Invalidierungsanforderung für *, und Sie sollten festgelegt werden. auch

Siehe:

http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html#WebsiteRestEndpointDiff


¹ zwei Endpunkten. Technisch gibt es mehr als zwei, da alle Buckets mindestens zwei REST-Endpunkt-Hostnamen haben ...aber es gibt zwei Typen von Endpunkten. Buckets verfügen außerdem über einen Übertragungsbeschleunigungsendpunkt, der das AWS-Kantennetzwerk für schnellere/optimierte Übertragungen verwendet, insbesondere von geografischen Standorten, die weiter von der Region entfernt sind, in der der Bucket bereitgestellt wird. Das sieht nach https://example-bucket.s3-accelerate.amazonaws.com aus, wenn Sie es aktivieren und eine zusätzliche Nutzungsgebühr tragen, da Sie mehr vom AWS-Netzwerk und weniger vom öffentlichen Internet verwenden ... aber das ist ein Unterschied in der Bereitstellung des Endpunkts, nicht das Verhalten von der Endpunkt Der Übertragungsbeschleunigungsendpunkt ist immer noch ein REST-Endpunkt. Daher verfügt er genauso wie die anderen REST-Endpunkte nicht über die Website-Hosting-Funktionen. Sie möchten CloudFront nicht für die Verwendung des Beschleunigungsendpunkts konfigurieren, da dies keine Verbesserung bietet (CloudFront verwendet bereits das Edge-Netzwerk), Ihnen wird jedoch die zusätzliche Gebühr für die Beschleunigung in Rechnung gestellt.

+1

Danke! Genau das war mein Problem. Es ist witzig, weil ich auf diese Weise schon so viele Seiten eingerichtet habe, und das war nie ein Problem - ich denke, es war alles relativ viel Glück, bis jetzt, da meine Seiten hauptsächlich einzelne Seiten waren. Heh. – rdegges

+0

Macht Sinn. Websites mit einer einzelnen Seite funktionieren problemlos, wenn Sie das Stammobjekt in der CloudFront-Konfiguration überschreiben. Damit index.html jedoch an einer anderen Stelle funktioniert oder benutzerdefinierte Fehlerseiten oder Umleitungsregeln verwendet werden, benötigen Sie den Website-Endpunkt. –

+3

Ja! Vielen Dank. Super hilfreich. Ich hoffe, jemand anderes, der diesen dummen Fehler macht, kann Ihre Antwort auch nützlich finden =) – rdegges

6

Encountered gleiche Problem und wie, wie ich es in Cloudfront Herkunft war aufgelöst Einstellungen gesetzt Herkunft Domain Name-<website bucket>.s3-website-us-west-2.amazonaws.com

In Cloudfront Einstellungen generieren stellen Sie sicher,index.html als Standard-Root-Objekt zu haben.

In S3 stellen Sie sicher, Mit diesen Eimer haben eine Website ausgewählt und index.html als Index Dokument gesetzt Host.

+0

Die Lösung für mich war, dass jemand das Standard-Root-Objekt als '/ index.html' und nicht als' index.html' eingerichtet hatte. –

+0

das war die Lösung für mich - danke! –