AWS ELB-Seite "Entschuldigung, Website ist nicht verfügbar"

9

Ich habe eine grundlegende ELB v2-Site. Noch kein Clustering oder so. Ich bin ziemlich unerfahren mit AWS.

Mein Stack ist nginx / uwsgi / django + einige andere Dienste.

Ich habe mich gefragt, ob jemand darüber nachgedacht hat, eine Seite im Stil "Entschuldigung, die Website ist derzeit nicht verfügbar ..." zu erstellen (benutzerdefinierter Text, mit dem ich geplante Ausfallzeiten aktualisieren kann, ist ein Bonus!), Wann immer es aus irgendeinem Grund Ausfallzeiten gibt, und die Gesundheit von Die Instanz ist rot. Es scheint nicht, dass Amazon diese Funktion bietet - vermisse ich etwas? Gibt es eine Möglichkeit, eine separate, winzige Instanz zu erstellen, die NUR bereitgestellt wird, wenn die Hauptinstanz rot ist oder so?

Vielen Dank!

std''OrgnlDave
quelle

Antworten:

22

Die einfache und coole Lösung besteht darin, Ihre ELB hinter CloudFront zu stellen.

Wenn der Ursprungsserver (in diesem Fall die ELB) einen 5XX-Fehler auslöst (oder 4XX, wenn Sie möchten), kann CloudFront eine benutzerdefinierte Fehlerseite zurückgeben , auf der Sie CloudFront so konfigurieren können, dass es aus einem S3-Bucket abgerufen wird, indem Sie einen zweiten Ursprung erstellen, der auf den zeigt Bucket und Erstellen eines Cache-Verhaltens-Routings (z. B.) /errors/static/*zum Bucket.

Dies funktioniert aus einem wichtigen Grund besser als Route 53-Failover ... ein schwerwiegender Fehler, wenn Sie so wollen ... Browser sind schrecklich, wenn es darum geht, DNS-Lookups viel länger als erwartet zwischenzuspeichern. Die DNS-TTL ist nicht relevant.

Sobald ein Browser einen DNS-Eintrag in der Hand hat, versucht er im Wesentlichen, ihn zu verwenden ... normalerweise, bis alle Browserfenster geschlossen sind.

Wenn Ihre Website für einen Besucher, der bereits auf der Website war, ausfällt, ist es unwahrscheinlich, dass er die alternative Website sieht.

Schlimmer noch, wenn ein Besucher Ihre Website zum ersten Mal besucht, während sie nicht erreichbar ist, bleibt er auf der Wartungsseite, bis er alle Browserfenster schließt.

Wenn Sie Failover-DNS verwenden, ist dies nur dann wirklich gut, wenn das Failover-Ziel noch Ihre Anwendung ist, möglicherweise nur etwas weiter entfernt.

Sie können das Caching von CloudFront deaktivieren, wenn Sie es nicht benötigen.

Sie können CloudFronts Fehler beim Zwischenspeichern von TTL auch auf einen Wert ungleich Null konfigurieren, wenn Sie möchten, dass Ihre Website nicht mehr gehämmert wird, während sie nicht verfügbar ist, und versuchen, sie wiederherzustellen. Für eine bestimmte Seite, die einen Fehler auslöst, wird die Fehlerseite weiterhin angezeigt und Ihr Server wird nicht mit weiteren Anforderungen für diese Seite belästigt, bis die Fehler-CachingTTL abläuft.

Michael - sqlbot
quelle
Interessant. AWS erwähnt diesen Nachteil nicht in seiner Dokumentation. Dies unterstreicht, wie wichtig das Testen ist.
Tim
Nun, @Tim, AWS empfiehlt, fortlaufende Updates durchzuführen. Sie hatten nicht ihren "Docker Service", den sie jetzt anbieten, also war EBS für unsere Docker-App. Ich brauchte nur einen.
std''OrgnlDave
6

Verwenden Sie Route53-DNS und Failover-Routing . Sie sollten in der Lage sein, einen S3-Bucket zu erstellen, in dem eine statische Website mit nur einer Seite gehostet wird. Ich glaube nicht, dass man das nur mit ELB machen kann.

Amazon hat einen Blog-Beitrag, in dem Sie erfahren, wie es hier geht .

Update: Wie Michael sagt, gibt es einen Nachteil beim DNS-Caching im Browser. Weitere Informationen finden Sie in seiner Antwort. Route 53 ist wahrscheinlich eine einfachere Option als CloudFront, aber CF bietet andere Vorteile, Leistung und kann in einigen Anwendungsfällen die Kosten senken.

Tim
quelle
Ich sage hier +1 ... dies ist eine gute Lösung, aber es scheint eine Achillesferse zu haben, was es in einigen Anwendungsfällen weniger lebensfähig macht.
Michael - sqlbot
@ Michael-sqlbot Was ist der Nachteil dieses Ansatzes? Browser-DNS-Caching-Zeit?
Tim
Ja genau. Leute, die an der Fehlerseite "festhalten", finde ich nervig.
Michael - sqlbot
Hier ist ein aktualisierter Blog-Beitrag von AWS mit einer neueren, einfacheren Methode für das ELB-Failover-Routing. aws.amazon.com/blogs/aws/… Weitere Informationen finden Sie in meinem Beitrag unten.
AstroTom
2

Es wurden bereits mehrere Lösungen erwähnt, darunter CloudFront und Route53. CloudFront ist eine ausgezeichnete Lösung und hat meiner Erfahrung nach die Dinge überhaupt nicht verlangsamt, bringt aber zusätzliche Kosten mit sich. Und Route53 hat die bereits erwähnten DNS-Caching-Probleme.

Bis ALB benutzerdefinierte Fehlerseiten sofort unterstützt (was möglicherweise der Fall ist oder nicht), gibt es möglicherweise eine neue Lösung nach der kürzlichen Ankündigung fester ALB-Antworten , aber es ist kein Point-and-Click: Sie können eine Lambda-Funktion einrichten, die vorübergehend hinzugefügt wird Eine Regel für Ihren Load Balancer, die eine feste Antwort mit dem Inhalt Ihrer Fehlerseite liefert.

Abgesehen vom Schreiben des Lambda müssen Sie einen Weg finden, um ihn "Ein" und "Aus" auszulösen. Dies kann möglicherweise über eine Route53-Integritätsprüfung oder eine Integritätsprüfung der Load-Balancer-Zielgruppe erfolgen (wahrscheinlich über CloudWatch-Alarm -> SNS - > Lambda).

Es ist nicht ganz einfach, würde aber nach dem Einrichten wahrscheinlich gut funktionieren!

Tim Malone
quelle
0

Wie von @Tim und @Micheal geschrieben, haben Sie die Wahl zwischen Route53-DNS und Failover-Routing oder CloudFront mit benutzerdefinierten Fehlerseiten . Beide Methoden haben ihre Vor- und Nachteile.

Wenn Sie Cloudfront noch nicht verwenden, ist Route53 meiner Meinung nach eine einfachere Lösung. Siehe den aktualisierten Blog-Beitrag von AWS (der jetzt eine einfachere Methode für die ELB-Integration enthält).

Die Einrichtung von CloudFront ist viel komplizierter und dauert für jedes Update etwa 15 Minuten. Cloudfront speichert auch (wie zu erwarten) Caches, sodass nicht klar ist, ob dies langsamer reagiert als der DNS-Cache mit Route 53.

Beachten Sie, dass Sie die einfache S3-Lösung, wie im AWS-Blog 3 beschrieben, nicht verwenden können, wenn Ihre ELB-Website nur auf SSL reagiert . In diesem Fall müssen Sie Cloudfront vor dem S3-Bucket hinzufügen, um SSL hinzuzufügen. Dies macht die DNS-Fehlerroutinglösung komplizierter.

AstroTom
quelle
Dieser Blog-Beitrag bietet keine saubere Lösung - er hat genau das Problem, das ich in meinem Beitrag erwähnt und in Kommentaren mit Tim besprochen habe. Dies ist durchaus sinnvoll, wenn Sie über mehrere Bereitstellungen verfügen, die Ihre Anforderungen bearbeiten können, jedoch aufgrund der Art und Weise, wie Browser DNS-Suchvorgänge zwischenspeichern, für eine Fehlerseite völlig ungeeignet sind. Der Inhalt des AWS-Beitrags berücksichtigt diese Realität leider nicht. DNS-Failover "fällt aus Sicht des Endbenutzers nicht zuverlässig zurück". CloudFront verfügt außerdem über vollständig separate Cache-Einstellungen für Fehlerantworten .
Michael - sqlbot