Amazon S3 Redirect und Cloudfront

71

Ich versuche, 301 Weiterleitungen in S3 mithilfe von Objekten einzurichten , auf die hier verwiesen wird: http://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html . Ich hatte einige Probleme und kann anscheinend nicht herausfinden, was ich falsch mache.

Was ich bekomme, ist eine leere Seite (0-Byte-Datei), als ob der Metadatenwert 'Website Redirect Location' nicht festgelegt wäre.

Was mache ich falsch?

Funktioniert dies auch unter AWS CloudFront?


Mein S3-Konsolen-Setup S3-Konsolen-Setup

Paar Dinge zu beachten:

Ich habe dieses Setup zum Hosten einer statischen Site. Ich verwende ssl / https mit meinem eigenen Zertifikat, das hochgeladen und in der Cloudfront-Distribution festgelegt wurde. Alle Seiten außer den umleitenden Objekten scheinen zu funktionieren. Ich habe versucht, Routing-Regeln einzurichten, aber sie schienen in Cloudfront nicht zu funktionieren.

Ich versuche, auf die Weiterleitungen sowohl über die Cloudfront-URL als auch über die S3-URL zuzugreifen ( https://s3.amazonaws.com/ {Bucket} / users / sign_in).

Matt Smith
quelle

Antworten:

146

Für Website-ähnliche Funktionen in S3, wie z. B. Weiterleitungen, HTML-Fehlermeldungen und Indexdokumente, können Sie den REST-Endpunkt ( ${bucket_name}.s3.amazonaws.comoder ${bucket_name}.s3.${region}.amazonaws.com) nicht verwenden, da diese Funktionen nur von den Website-Endpunkten ( ${bucket_name}.s3-website.${region}.amazonaws.com) bereitgestellt werden .

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

Um das Verhalten in Cloudfront verfügbar zu machen, müssen Sie Cloudfront so konfigurieren, dass auch dieser Endpunkt verwendet wird, nicht der REST, der über die automatische Vervollständigung in der Konsole angeboten wird.

Geben Sie den Hosting-Endpunkt für die statische Amazon S3-Website für Ihren Bucket ein. Dieser Wert wird in der Amazon S3-Konsole auf der Seite Eigenschaften unter Statisches Website-Hosting angezeigt .

Wenn Sie den Bucket-Namen in diesem Format angeben, können Sie Amazon S3-Weiterleitungen und benutzerdefinierte Amazon S3-Fehlerdokumente verwenden.

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DownloadDistS3AndCustomOrigins.html

Beachten Sie, dass die Webendpunkte HTTPS nicht unterstützen. Sie können Cloudfront jedoch so konfigurieren, dass es mit HTTP aus dem Bucket abgerufen wird, obwohl die Clientverbindung HTTPS ist.


Hilfreicher Tipp: Bei der Fehlerbehebung und beim Testen von Änderungen mit CloudFront sind Benutzer häufig verwirrt über die offensichtliche "Latenz" zwischen dem Vornehmen von Änderungen und dem Beginn des neuen Verhaltens von CloudFront. Bei Fehlerseiten verfügt CloudFront über eine standardmäßige 5-Minuten- Fehler-Caching-Mindest-TTL , die verhindert, dass Anforderungen für fehlgeschlagene Seiten erneut an den Ursprung gesendet werden. Dies ist ein separater Zeitgeber von der im Cache-Verhalten festgelegten minimalen / Standard- / maximalen TTL . Insbesondere beim Testen möchten Sie diese Timer möglicherweise deaktivieren und bei jeder nachfolgenden Anforderung von Seiten, die Fehler zurückgegeben haben, einen erneuten Versuch erzwingen. Verwenden Sie dazu die Schritte, die ich in der Antwort auf eine Frage zur offensichtlichen Amazon CloudFront-Latenz angegeben habe .

Michael - sqlbot
quelle
4
Haben Sie den Match Viewer für Ihre Ursprungsprotokollrichtlinie konfiguriert? Der Endpunkt der s3-Website unterstützt https nicht. Sie möchten es auf http setzen. docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/…
imperalix
3
Vielen Dank! Nachdem ich tagelang versucht hatte herauszufinden, warum ich es nicht zum
Laufen
1
Hier ist etwas, das mich ewig festgefahren hat. S3OriginConfigAchten Sie darauf, param nicht einzuschließen, wenn Sie das festlegen Originsund stattdessen verwenden CustomOriginConfig. Scheint offensichtlich, hat mich aber für eine Weile erwischt :)
Xolv.io
1
Eine weitere zu beachtende Sache ist, dass wenn Sie eine CloudFront-OAI (Origin Access Identity) verwenden, um den direkten Zugriff auf den S3-Bucket einzuschränken, dies nicht mehr funktioniert. Eine Alternative (obwohl sie umgangen werden kann) besteht darin, einen benutzerdefinierten Header zu erstellen und weiterzuleiten und über eine Bucket-Richtlinie zu verfügen, die dies überprüft. zB abridge2devnull.com/posts/2018/01/…
KJH
1
@KJH das stimmt, OAIs funktionieren nicht, da die Website-Hosting-Funktion eigentlich nur für öffentlich lesbare Inhalte gedacht war . Das Optimieren eines der wenigen Header, mit denen S3 von Richtlinien ausgewertet werden kann, ist eines der Dinge, die nützlich sind, wenn der Inhalt nur "sicher" genug sein muss, um ehrliche Leute fernzuhalten. Ich habe darüber nachgedacht, eine Lambda @ Edge-Bibliothek zu erstellen, um die Webendpunktfunktionalität zu emulieren, damit dies alles vermieden werden kann, habe aber noch keinen hinreichend starken Grund dafür gefunden.
Michael - sqlbot
9

Ich hatte das gleiche Problem mit fehlgeschlagenen Weiterleitungen und heruntergeladenen Dateien mit der Länge Null, verwendete jedoch keine Cloudfront.

Die Hauptursache in meinem Fall war, dass mein DNS-CNAME-Eintrag auf den REST-Endpunkt (static.righto.com.s3-us-west-2.amazonaws.com) anstelle des Website-Endpunkts (static.righto.com.s3- Website) verwies -us-west-2.amazonaws.com). Durch das Aktualisieren des CNAME-Datensatzes wurden meine Weiterleitungen behoben.

Ein weiteres Symptom für dieses Problem war, dass fehlende Seiten eine XML-Fehlerseite anstelle einer HTML-Fehlerseite zeigten.

In diesem Dokument wird der Unterschied zwischen Website-Endpunkten und REST-Endpunkten erläutert.

Ken Shirriff
quelle
1

Wenn Sie hierher kommen, um eine Lösung zu finden, ohne CloudFront zu verwenden, finden Sie hier:

Sie können s3cmd (natürlich im Bash-Skript) und seine Parameter verwenden:

  • --add-header mit x-amz-website-redirect-location

Dieses Skript löst beispielsweise das Problem für die Seite /about/:

s3cmd \
--acl-public \
--add-header "x-amz-website-redirect-location: /about/" \
--no-preserve \
put "./path/to/any/small/file/at/your/local/drive/index.html" "s3://domain.com/about"

Dieses Skript kopiert eine vorhandene Datei mit einem neuen Dateinamen ohne abschließenden Schrägstrich. Es ist nicht wichtig, was die Datei enthält, da der Browser sofort umgeleitet wird.

Wenn Sie (und wichtigere Webcrawler ) versuchen, eine Seite zu öffnen, zu der /aboutSie 301weitergeleitet werden /about/. Dies ermöglicht es, die richtige Seite im Cache von Google, Yandex und anderen Suchmaschinen zu halten.

Sie können diesen Code für mehrere Seiten wiederholen. Oder Sie können Funktionen zum Durchsuchen von Ordnern hinzufügen und für jeden einen Anruf tätigen. Wahrscheinlich wirst du es so nett sein, es hier zu zeigen :)

Oleg Poltoratskii
quelle