Wie richte ich ELB-Integritätsprüfungen mit mehreren Anwendungen ein, die auf jeder EC2-Instanz ausgeführt werden?

11

Bei AWS möchten wir ELBs verwenden, um EC2-Instanzen, die mehrere Anwendungen hosten, auszugleichen. Idealerweise möchten wir einen Gesundheitscheck für die Anwendung haben.

Mit AWS Elastic Load Balancers können Sie derzeit jedoch nur einen Ort für eine Integritätsprüfung anpingen.

Was wäre der beste Weg, um eine Integritätsprüfung mit ELB zu implementieren, die den Status mehrerer Anwendungen berücksichtigt, die auf jeder EC2-Instanz bereitgestellt werden?

Andrei Fierbinteanu
quelle
4
Eine Möglichkeit besteht darin, Ihre eigene Integritätsprüfung zu implementieren, indem ein Skript einen Status zurückgibt, der auf den Prüfungen beider Anwendungen basiert.
Nathan C
1
ELB ist ein verwalteter Dienst. Erstellen Sie eine weitere ELB für die zweite Anwendung mit einer eigenen Integritätsprüfung. Die meisten Kosten fallen pro Anfrage an, daher kostet der Betrieb von 2 ELBs fast das gleiche.
Guy
Ich denke, die Antwort von @ NathanC ist die beste Lösung. Ich habe einen ähnlichen Fall, in dem der Gesundheitscheck fehlschlagen sollte, wenn eine der beiden Bedingungen fehlschlägt. Wenn Sie eine weitere ELB hinzufügen, können Sie eine weitere Gesundheitsprüfung durchführen, aber AFAIK kann nur eine ELB verwenden, um den Verkehr zu leiten (oder nicht)
Tom Harrison Jr
@Guy tatsächlich, da die ELB-Stunden unabhängig von Anfragen berechnet werden, sind das ~ 20 USD pro Monat (abhängig von der Region), sodass die meisten Kosten pro Anfrage nur anfallen, wenn Sie bereits weit über 2,5 TB Daten pro Monat bereitstellen ( bei $ 0,008 / GB)
Josip Rodin

Antworten:

10

Hier sind zwei Möglichkeiten, dies zu lösen.

Die erste Option besteht darin, dem Host eine weitere Integritätsprüfung hinzuzufügen, die die Integrität überprüft und HTTP 200 an die ELB zurückgibt, wenn die Logik besagt, dass Sie den Host online halten möchten. Die Logik dort liegt natürlich bei Ihnen. Der Nachteil hierbei wäre, dass bei erfolgreicher Bereitstellung von App 2 auf einigen Hosts alle Hosts weiterhin "fehlerfrei" sind und Datenverkehr empfangen.

Eine andere Möglichkeit besteht darin, für jede Anwendung eine zusätzliche ELB zu verwenden. Sie können mehrere ELBs auf dieselben Backend-EC2-Instanzen verweisen, und die Kosten dafür sind recht gering. Auf diese Weise können Sie die Integritätsprüfung pro Anwendung durchführen und Hosts mit Problemen auf Anwendungsebene löschen, anstatt alles oder nichts zu tun.

Bearbeiten: Bitte beachten Sie, dass dies eine ältere Antwort ist und spezifisch für ELB und nicht für ALB ist. ALB unterstützt nativ separate Ziele auf einem Host.

Nathan V.
quelle
7

Die Verwendung einer ELB pro App ist der richtige Weg.

Erstens benötigen Sie sie möglicherweise trotzdem, wenn sich jede Anwendung in einer eigenen Domäne befindet und Sie SSL unterstützen müssen. Amazon ELBs erlauben derzeit nur ein SSL-Zertifikat für jede Domain und erfordern separate ELBs für jede SSL-fähige Domain. (Wildcard-SSL-Zertifizierungen sind eine Ausnahme).

Die Herausforderung hierbei besteht darin, dass ELB-Integritätsprüfungen derzeit nicht an eine bestimmte virtuelle Domäne gerichtet werden können, die auf einer EC2-Instanz gehostet wird. (Es wird kein "Host:" - Header gesendet). ELB-Integritäts-Pings werden immer in die Standarddomäne verschoben, als hätten Sie die IP-Adresse für die EC2-Instanz in Ihren Browser geladen. Daher ist etwas Klebstoff erforderlich, um die Integritätsprüfungen für die Standarddomäne zu erhalten und dann mit dem Integritätsstatus einer bestimmten Anwendung zu antworten.

Hier ist eine funktionierende Beispielkonfiguration, die einer Nginx- serverDirektive hinzugefügt werden könnte . Es würde auf jeder der EC2-Instanzen installiert, deren Lastausgleich erfolgt.

    # This goes in the `server` block noted by 'default_server', often /etc/nginx/sites-enabled/default

    # All AWS Health Checks from the ELBs arrive at the default server.
    # Forward these requests on the appropriate configuration on this host.
    location /health-check/ {
      rewrite ^/health-check/(?<domain>[a-zA-Z0-9\.]+) /api/v1/status break;
      # Lie about incoming protocol, to avoid the backend issuing a 301 redirect from insecure->secure,
      #  which would not be considered successful.
      proxy_set_header X-Forwarded-Proto 'https';
      proxy_set_header "Host" $domain;
      proxy_pass http://127.0.0.1;
    }

In der Einstellung "Health Check" der ELB für "first-application.com" wählen Sie "HTTP" und Port 80 aus und geben einen Pfad wie folgt ein:

/health-check/first-application.com

Wenn die obige Nginx-Konfiguration auf dem Host ausgeführt wird, wird die Anforderung in der Standarddomäne empfangen und die Antwort von der Nginx-Konfiguration auf demselben Host für https://first-application.com/api/v1/status übertragen

Bei diesem Ansatz gibt es in Nginx keine Konfiguration pro App. Solange jede App einen eindeutigen Domainnamen hat, müssen Sie nur sicherstellen, dass Sie für jede App eine entsprechende ELB einrichten.

Mark Stosberg
quelle
3
Danke. Dies schien jedoch den Trick zu tun. Ich hatte gehofft, damit nicht mehrere Lastausgleiche benötigen zu müssen.
Tourdownunder
6

Am 11. August 2016 führte Amazon Application Load Balancers ein . Mit diesen können Sie mehrere Zielgruppen angeben, von denen jede ihre eigene Art der Integritätsprüfung hat. Dies ist jetzt mit einem einzigen Load Balancer möglich!

Thomas
quelle