webentwicklung-frage-antwort-db.com.de

Wie stellen Sie eine Wartungsseite für AWS auf, wenn sich Ihre Instanzen hinter einer ELB befinden?

Wie stellen Sie eine Wartungsseite in AWS bereit, wenn Sie neue Versionen Ihrer Anwendung hinter einer ELB bereitstellen möchten? Wir möchten, dass der ELB-Datenverkehr an die Wartungsinstanz weiterleitet, während die neuen automatisch skalierten Instanzen auftauchen, und nur dann zu den neuen Instanzen "übergehen", wenn sie vollständig eingerichtet sind. Wir verwenden die automatische Skalierung, um vorhandene Instanzen herunterzufahren, und neue Instanzen, die den neuen Code enthalten.

Das Szenario, das wir zu vermeiden versuchen, besteht darin, dass der ELB sowohl den Datenverkehr zu neuen EC2-Instanzen als auch die Wartungsseite bedient. Da keine permanenten Sitzungen aktiviert sind, möchten wir verhindern, dass der Benutzer zwischen der Seite für den Wartungsmodus und der in einer EC2-Instanz bereitgestellten Anwendung hin und her geschaltet wird. Wir können auch nicht einfach skalieren (beispielsweise von 2 auf 4 Instanzen und dann zurück auf 2), um die neuen Instanzen einzuführen, da die Codeänderungen möglicherweise Datenbankänderungen beinhalten, die die Änderungen für den alten Code beeinträchtigen würden. 

30
BestPractices

Der einfachste Weg für AWS ist der DNS-Dienst Route 53 .

Sie können die Funktion von Weighted Round Robin verwenden.

"Sie können WRR verwenden, um Server in Produktion zu bringen, A/B-Tests durchzuführen, Oder um den Datenverkehr auf Regionen oder Rechenzentren unterschiedlicher Größe zu verteilen."

Weitere Informationen in AWS-Dokumentationen zu dieser Funktion

BEARBEITEN: Route 53 hat kürzlich eine neue Funktion hinzugefügt, die DNS-Failover für S3 ermöglicht. Weitere Informationen finden Sie in der Dokumentation: http://docs.aws.Amazon.com/Route53/latest/DeveloperGuide/dns-failover.html

21
Guy

Route53 ist keine gute Lösung für dieses Problem. Es dauert lange, bis die DNS-Einträge ablaufen, bis die Wartungsseite angezeigt wird (und danach dauert es genauso lange, bis sie nach Abschluss der Wartung aktualisiert werden). Mir ist klar, dass die Auslöser von Lambda und CodeDeploy zum Zeitpunkt der Fragestellung nicht existierten, aber ich wollte andere wissen lassen, dass mit Lambda eine relativ saubere Lösung erstellt werden kann, die ich in einem Blogbeitrag ausführlich beschrieben habe. . http://blog.ajhodges.com/2016/04/aws-lambda-setting-temporary.html

Die Lösung der Lösung ist das Abonnieren einer Lambda-Funktion für CodeDeploy-Ereignisse, durch die Ihre ASG durch eine Mikroinstanz ersetzt wird, die eine statische Seite in Ihrem Lastenausgleich während der Bereitstellung bereitstellt.

7
asdag8

Kam mit einer anderen Lösung, die für uns gut funktioniert. Hier sind die Schritte:

  1. Replizieren Sie Ihre EB-Umgebung, um eine andere zu erstellen, nennen Sie sie beispielsweise etwas wie app-environment-maintenance.
  2. Ändern Sie die Konfiguration für die automatische Skalierung und setzen Sie die Min- und Max-Server auf Null. Dies kostet Sie keine EC2-Server und die Umgebung wird grau und wird in Ihre Liste aufgenommen.
  3. Dies ist eine Voraussetzung, aber wir verwenden Cloudfront, wie es viele Leute für HTTPS usw. tun. Cloudfront hat Fehlerseiten.
  4. Erstellen Sie einen neuen S3-Website-Hosting-Bucket mit Ihren Fehlerseiten. Erwägen Sie, separate Dateien für Antwortcodes, 503 usw. zu erstellen. Siehe Verzeichnisanforderungen und -routen.
  5. Fügen Sie den S3-Bucket Ihrer Cloudfront-Distribution hinzu.
  6. Fügen Sie Ihrer Cloudfront-Distribution ein neues Verhalten für eine Route wie /error/* hinzu.
  7. Richten Sie in Cloudfront eine Fehlerseite ein, um 503-Antwortcodes zu verarbeiten und auf Ihre S3-Bucket-Route zu verweisen, z. B. /error/503-error.html.
  8. Schließlich können Sie mit der AWS-CLI jetzt die Umgebung CNAME austauschen, um Ihre Hauptumgebung in den Wartungsmodus zu versetzen. Zum Beispiel:

    aws elasticbeanstalk swap-environment-cnames \ --profile "$awsProfile" \ --region "$awsRegion" \ --output text \ --source-environment-name api-prod \ --destination-environment-name api-prod-maintenance

Dadurch würde Ihre app-prod-Umgebung in den Wartungsmodus versetzt. Die ELB würde einen 503 werfen, da keine EC2-Instanzen ausgeführt werden. Cloudfront wird dann den 503 fangen und die entsprechende 503-Fehlerseite zurückgeben.

Und das ist es. Ich weiß, dass es einige Schritte gibt und ich habe eine Menge der vorgeschlagenen Optionen ausprobiert, darunter Route53 usw. Aber bei all diesen gibt es Probleme mit ihrer Funktionsweise mit ELBs und Cloudfront usw.

Nachdem Sie die Hostnamen für die Umgebungen ausgetauscht haben, dauert es ungefähr eine Minute, um sie weiterzugeben.

5
Jacob Thomason

Ich weiß, dass dies eine alte Frage ist, aber nachdem ich heute (Dezember 2018) das gleiche Problem gesehen habe, scheint es einen anderen Weg zu geben, dieses Problem zu lösen.

Anfang des Jahres führte AWS Unterstützung für Umleitungen und fixierte Antworten auf Application Load Balancer ein. In einer Nussschale:

  • Suchen Sie Ihre ELB in der Konsole.
  • Zeigen Sie die Regeln für den entsprechenden Listener an.
  • Fügen Sie eine feste 503-Antwortregel für den Hostnamen Ihrer Anwendung hinzu.
  • Geben Sie optional eine text/plain- oder text/html-Antwort an (d. H. Das HTML Ihrer Wartungsseite).
  • Änderungen speichern.

Sobald die Regel an die ELB übertragen wurde (ca. 30 Sekunden für mich), wenn Sie versuchen, Ihren Host in Ihrem Browser aufzurufen, wird die 503-Wartungsseite angezeigt.

Wenn Ihre Bereitstellung abgeschlossen ist, entfernen Sie einfach die hinzugefügte Regel.

2
Tom

Unser Bereitstellungsprozess führt zunächst eine Cloudformation durch, um eine ec2-Mikroinstanz (Wartungsinstanz) aufzubauen, die vordefinierte statische Seite von s3 auf die ec2 kopiert. Cloudformation wird mit elb geliefert, an die micro ec2-Instanz angehängt ist. Dann wird ein Skript (Powershell oder CLI) ausgeführt, um Webinstanzen (ec2) aus der Wartungsinstanz von Elb zu entfernen.

Auf diese Weise wechseln wir während des Implementierungsprozesses zur Wartungsinstanz. 

In unserem Fall haben wir zwei Elben, eine für die äußere und die andere für die innere. Unsere internen elb-Dateien werden während dieses Vorgangs nicht aktualisiert. Nach Abschluss der Tests wird der Rauchtest abgeschlossen. Nach dem Testen führen wir ein anderes Skript aus, um Webinstanzen wieder an elb anzuhängen und den Wartungsstapel zu löschen.

1

Soweit ich sehen konnte, waren wir in einer Situation, in der die obigen Antworten nicht zutrafen oder nicht ideal waren.

Wir haben eine Rails) -Anwendung, die den Puma mit Ruby 2.3 auf 64-Bit-Amazon Linux/2.9.0 ausführt, das mit einer (klassischen) ELB zu kommen scheint.

Das Handling des ALB 503 war also keine Option.

Wir haben auch eine Vielzahl von Hardware-Clients, denen ich nicht trauen würde, DNS TTL immer zu respektieren, so dass Route53 riskant ist.

Was anscheinend gut funktioniert hat, ist ein sekundärer Port auf dem Nginx, der mit der Plattform geliefert wird.

Ich fügte dies als .ebextensions/maintenance.config

files:
  "/etc/nginx/conf.d/maintenance.conf":
    content: |
      server {
        listen 81;
        server_name _ localhost;
        root /var/app/current/public/maintenance;
      }

container_commands:
  restart_nginx:
    command: service nginx restart

Und legte eine Kopie von https://Gist.github.com/pitch-Gist/2999707 in public/maintenance/index.html

Um die Wartung einzustellen, schalte ich meine ELB-Listener einfach so, dass sie auf Port 81 anstatt auf den Standard 80 zeigen. Keine zusätzlichen Instanzen, S3-Buckets oder das Warten auf Clients, die neues DNS erhalten.

Es dauert nur ungefähr 15 Sekunden, bis die Bohnenstange (wahrscheinlich meistens auf die Wolkenbildung im Back-End wartend) angewendet wird.

1
Mat Schaffer