2017-10-24 1 views
0

Ich verwende eine einzelne Seite App, die auf S3 gehostet wird und über CloudFront im Web verfügbar ist. Wenn ich Wartungsarbeiten an meiner API durchführe, möchte ich einen manuellen Schalter haben, der dazu führt, dass die Anforderung an meine App eine Wartungsseite rendert.Wartungsmodus mit S3 + CloudFront

Ich kann die Wartung HTML (oder JSON) auf die S3 setzen. Wie konfiguriere ich CloudFront, um die Wartungsseite zurückzugeben, wenn ich den Wartungsmodus einschalte?

Antwort

2

erstellen Lambda @ Edge-Funktion Ihre statische „Wartung“ Antwort zu erzeugen: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-examples.html#lambda-examples-static-web-server

Wenn Sie es aktivieren möchten, wählen Sie Viewer-Anfrage Trigger und verwenden Sie die ARN der Lambda-Funktion auf der Seite mit den Einstellungen für die Cache-Verhalten, die die Wartungsnachricht zurückgeben und Änderungen speichern soll. Um es zu deaktivieren, entfernen Sie es. Die Änderung wird normalerweise innerhalb eines sehr kurzen Zeitraums bearbeitet.

Dies wird Ihr Ziel erreichen, weil eine Viewer-Anfrage Trigger ausgelöst vor wird die Cloudfront-Cache überprüft, und wenn er eine Antwort erzeugt, wird die Antwort, ohne zu überprüfen, den Cache und das erzeugte Antwort zurückgegeben wird nicht in der Cloudfront-Cache gespeichert - Jeder zwischengespeicherte Inhalt bleibt also nach dem Entfernen des Auslösers erhalten.

Beachten Sie, dass das erste Mal, wenn Sie tatsächlich eine Funktion wie diese mit einer Cloudfront Verteilung assoziieren, ich glaube, dass Sie brauchen, um „Trigger zu aktivieren und replizieren“ in der Lambda-Konsole, so dass die Lambda-Funktion global zugänglich ist, wenn Cloudfront Bedürfnisse es. Sie müssen sie nicht mit der "echten" CloudFront-Verteilung verknüpfen, wenn Sie diese testen - Sie können eine zweite zum Testen erstellen - aber eine Funktionsversion muss diesen Replikationszyklus durchlaufen, bevor sie in der CloudFront-Konsole verwendet werden kann . Funktionen zur Verwendung mit Lambda @ Edge müssen in der Region us-east-1 erstellt und dann in alle Regionen repliziert werden, sodass eine CloudFront-Kante sie über ihre nächstgelegene Region aufrufen kann. Lambda @ Edge-Funktionen werden immer mit ihrer numerischen Versions-ID referenziert. Funktionsaliasnamen, einschließlich der Magic-Zeichenfolge $LATEST, werden von Lambda @ Edge nicht verwendet.

+0

Schön! Das ist was ich wollte. Vielen Dank. –

+0

@ MaticJurglič groß. Ich habe am Ende eine weitere Notiz hinzugefügt, um Ihnen möglicherweise einige Fehlerbehebungen zu ersparen. –

0

Sie können ein invalidation bestimmter Dateien auf CloudFront tun, aber das bedeutet, dass Sie die aktuelle Web-App während der Wartung überschreiben müssen und sie dann wiederherstellen (und wieder ungültig machen) müssen, sobald Sie wieder da sind.

Ich denke, die beste Lösung ist, Unterstützung für Wartungsmodus in Ihrer App hinzufügen und regelmäßig (und auf Service nicht verfügbar Fehler) nach einem Flag irgendwo (in der Regel eine statische Datei über CloudFront mit einem kurzen Höchstalter serviert) und wenn Es besagt, dass Sie sich im Wartungsmodus befinden, die App einfrieren und einen Dialog anzeigen, der dem Benutzer mitteilt, dass die API gewartet wird - oder Funktionen sperren, die API-Zugriff erfordern, und den Benutzer weiterhin den schreibgeschützten Zugriff mit zwischengespeicherten Daten verwenden.

Mit der letztgenannten Lösung müssen Sie nur eine Datei in S3 hochladen und daran denken, sie nach dem Abschluss wieder zu entfernen/zu ersetzen - Sie können sogar eine Nachricht (ein Changelog vielleicht?) Einfügen, die die App Ihren Benutzern anzeigt .

Verwandte Themen