Amazon Cloudfront mit S3-Umleitung

10

Ich versuche, etwas zu tun, das relativ einfach sein sollte - ich möchte einige Domains und Subdomains einrichten, um zur Kerndomain für unsere Site umzuleiten, aber ich möchte die Weiterleitungen auf Cloudfront veröffentlichen. Alles funktioniert, außer dass der Stammpfad umgeleitet wird. Dadurch erhalte ich eine XML-Datei, die den S3-Bucket teilweise beschreibt.

Hintergrund

S3

Mit S3 können Sie einen All-Redirect-Bucket einrichten , z.

S3 mit Setup aller Anforderungen umleiten

Wenn Sie dies testen, macht der Web-Endpunkt (brass9-com.s3-website-us-west-1.amazonaws.com) das, was er sollte - er leitet zu brass9.com weiter. Gut.

Cloudfront

Mit Cloudfront können Sie auf einen S3-Bucket zeigen, aber die Art und Weise, wie dies vorgeschlagen wird, ist falsch. Anstatt wie brass9-com.s3.amazonaws.com auf den Bucket mit seinem Namen zu zeigen, müssen Sie den obigen Web-Endpunkt verwenden . Ansonsten können Sie alles auf den Standardeinstellungen belassen und ein gutes Umleitungsverhalten erzielen. Ein Pfad wie www.brass9.com/portfolio leitet also ordnungsgemäß dorthin weiter , wo er sollte. Auch gut.

Das Problem - die Root-Domain-Umleitung

Das einzige, was dann nicht funktioniert, ist die Umleitung von einfach www.brass9.com . Anstatt eine Weiterleitung zu erhalten, erhalten Sie dieses seltsame Ergebnis:

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>brass9-com</Name><Prefix></Prefix>
<Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated>
</ListBucketResult>

OK... . So ist dies nicht ganz unerwartet - weil es kein Standard - Root - Objekt ist. Aber welches Standardstammobjekt würde ich möglicherweise angeben, um dieses Verhalten zu verhindern? Wie heißt das S3-Umleitungsobjekt, auf das ich verweisen muss? Oder gibt es eine andere richtige Konfiguration oder ist dies nur ein Fehler in der Interaktion zwischen Cloudfront und S3, den Amazon beheben muss?

Bekannte nicht funktionierende Lösung: Standardstammobjekt

Es ist möglich, ein Standardstammobjekt von index.html anzugeben, aber es hilft keinem - es ändert nur das Problem. Die Cloudfront-URL leitet stattdessen zu /index.html auf der Hauptwebsite um, bei der es sich um eine 404 handelt (wir verwenden keine index.html-Datei, sondern eine serverseitige Framework-gesteuerte Site). Ich könnte eine index.html auf den Server stellen, aber das macht den geringen Geschwindigkeitsgewinn der Verwendung von Cloudfront zunichte.

Ähnliche Fragen

Eine Frage stellt etwas Ähnliches, gibt jedoch aus irgendeinem Grund eine leere 0-Byte-Antwort zurück, anstatt eine XML-Antwort. Es enthält keine Frage zu diesem Problem oder eine Lösung.

Zum Thema passende Artikel

In einem Artikel wird vorgeschlagen, dass Sie nur die gesamte Website sowohl auf der Bare- als auch auf der WWW-Domain bereitstellen . Dies passt zu den Lesezeichen eines Benutzers, Ihrem Suchranking usw. Sie sollten dies nicht tun.

Einige diskutieren das Hosten einer statischen Website auf S3 und Cloudfront anstelle eines Umleitungsschemas und sind daher nicht miteinander verbunden.

Wie mache ich das richtig?

Screenshot der Cloudfront-Konfiguration - kein Standardstammobjekt, das auf den S3-Ursprung zeigt. InProgress ignorieren - Ich hatte gerade das Standardstammobjekt zum Testen ein- und ausgeschaltet.

Cloudfront-Verteilung ohne Standardstammobjekt, das auf S3 zeigt

Und die Origin-Konfiguration für diese Distribution:

Ursprung - zeigt auf S3, Standardeinstellungen

Chris Moschini
quelle
1
Jede Anfrage an einen Website-Endpunkt, der so konfiguriert ist, dass alles umgeleitet wird, sollte genau das tun, einschließlich des Stamms. Haben Sie eine Bucket-Richtlinie für diesen Umleitungs-Bucket? Es klingt, als ob Sie könnten, aber Sie sollten nicht. Klingt auch ein bisschen so, als hätten Sie eine zwischengespeicherte Antwort von Cloudfront erhalten, GET /bevor Sie Ihre Konfiguration für die Verwendung des Webendpunkts korrigiert haben.
Michael - sqlbot
1
Es war in der Tat eine zwischengespeicherte ListBucket-Antwort, die in S3 noch andauerte, obwohl ich die Konfiguration von CF mehrmals ungültig gemacht und geändert hatte. Das Löschen dauert nur eine oder vier Stunden. @ Michael-sqlbot Wenn du deinen Kommentar als Antwort postest, kann ich ihn als Akzeptiert markieren.
Chris Moschini

Antworten:

4

Wenn Sie dieses Problem haben, überprüfen Sie zuerst, wenn Sie den s3-Bucket-Ursprung für die Cloudfront konfigurieren. Die automatische Vervollständigung gibt den s3-REST-Endpunkt domain.amazonaws.com zurück, der diese ListBucketResult-Antwort zurückgibt.

Sie müssen den Website-Endpunkt domain.s3-website-region.amazonaws.com manuell notieren

Wichtig: Wenn Sie die Cloudfront mit dem REST-Endpunkt falsch konfiguriert haben, müssen Sie den Cache durch Invalidierungen ungültig machen. Andernfalls wird die REST-Antwort weiterhin zurückgegeben

Lapinkoira
quelle
Der Hinweis zur Cache-Ungültigmachung hat mir schließlich geholfen, ein Problem zu lösen, das ich mehrere Tage lang verfolgt habe. Vielen Dank!
Nate
Vielen Dank! Für Terraforming Benutzer im originBlock der Verteilung, Verwendung aws_s3_bucket.BUCKET.website_endpointin dem domain_name(nicht bucket_regional_name) und den Add - custom_origin_configBlock.
Dusan
Du bist ein Lebensretter! Wir haben den letzten Tag mit diesem Problem zu kämpfen und ListBucketResult XML immer wieder zurückbekommen, obwohl wir die Verteilungseinstellungen geändert haben. Nachdem die Distribution gelöscht und eine neue erstellt wurde, die auf domain.s3-website-region.amazonaws.com verweist, funktionierte die Weiterleitung für uns!
Dale Zak
2

Lösung: Richten Sie die Umleitung wie in der Frage angegeben ein und warten Sie die S3- und CloudFront-Cache-Zeiten ab. Sie können 4 Stunden oder länger dauern, Sie müssen also nur alles einrichten und dann warten und auf das Beste hoffen.

(Dies ist Michaels Lösung aus den Kommentaren, aber es ist jetzt Jahre her und dies hat es wirklich verdient, als beantwortet markiert zu werden.)

Chris Moschini
quelle
0

Schreiben als Antwort, da ich keinen Kommentar abgeben kann. Aus der Dokumentation unter http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/DistributionConfigDatatype.html#DistributionConfigDatatype_Elements geht hervor, dass Sie ein leeres Standardstammobjekt haben können:

Wenn Sie beim Erstellen einer Distribution kein Standardstammobjekt angeben möchten, fügen Sie ein leeres DefaultRootObject-Element hinzu.

Dani_l
quelle
Sie können (obwohl einige API-Bibliotheken dies verbieten) - aber wenn Sie ein leeres Standard-Stammobjekt verwenden, erhalte ich die lächerliche ListBucketResult-XML-Antwort, die Sie in meiner Frage sehen.
Chris Moschini