So stellen Sie eine Hochverfügbarkeits-Webanwendung in AWS ECS bereit

Das lokale Ausführen Ihrer containerisierten Web-App ist einfach. Gerade docker run und du bist fertig.

Die Ausführung in einer Produktionsumgebung mit AWS-Infrastruktur ist jedoch viel schwieriger. Wenn Sie kein Ops-Experte sind, können die Entscheidungen überwältigend sein.

Sie müssen bedenken:

  • Was muss ich tun, damit die Server sind sicher gesperrt?
  • Wie erstelle ich meine App immer verfügbar im Falle des Ausfalls eines Containers oder einer ganzen Serverinstanz?
  • Wie werden Entwickler in meinem Team dazu in der Lage sein neue Versionen bereitstellen der App, ohne alles kaputt zu machen oder Ausfallzeiten zu verursachen? Muss ich sie alle mit SSH-Schlüsseln einrichten?
  • Wie wird mein Team Zugriff auf die Protokolle um App-Probleme zu debuggen?
  • Welche AWS-Services sollte ich verwenden, um mir bei all dem oben Genannten zu helfen?

Um diese Fragen zu beantworten, befürchten Sie, dass Sie eine Woche oder länger in den Tiefen des riesigen AWS-Dokumentationsstrudels verbringen müssen, um zu erforschen, wie man ihre verschiedenen Dienste nutzt, mit viel Versuch und Irrtum, bevor Sie schließlich in einer Arbeitsumgebung ankommen auf die Ihre Testbenutzer zugreifen können.

Und nachdem Sie dies abgeschlossen haben, stellen Sie fest, dass Sie jetzt einen weiteren Tag damit verbringen müssen, alle Schritte zu dokumentieren, die Sie unternommen haben, damit Ihre Kollegen die Umgebung in Zukunft neu aufbauen können (denn die meisten AWS-Dokumentationen sagen Ihnen, wo Sie in der AWS-Konsole zeigen und klicken müssen – ziemlich nutzlos zum Erstellen eines wiederholbaren oder automatisierbaren Build-Prozesses).

Dies ist eine erhebliche Vorabinvestition – wahrscheinlich Zeit, die Sie nicht haben, wenn Sie unter Druck stehen, die App den Benutzern vorzustellen.

Also macht man Kompromisse.

Sie bleiben bei dem, was Sie wissen, und erstellen einfach manuell ein paar EC2-Instances mit der AWS-Konsole. Sie verwenden SSH und SCP über Ihr erstelltes Docker-Image und rufen es auf docker run auf jedem. Die meisten Schritte werden nicht dokumentiert und leben nur in deinem Kopf weiter. Ihr Team kann jederzeit von der Konfiguration in der Konsole rückwärts arbeiten, wenn es die Umgebung neu erstellen muss. Und sie können sich jederzeit per SSH in die Instanzen einloggen, um Bereitstellungen vorzunehmen und Protokolle zu überprüfen. Nicht ideal, aber es wird vorerst reichen.

Aber Sie müssen nicht all diese technischen Vorleistungen übernehmen.

Stattdessen können Sie mit dem AWS Elastic Container Service (ECS) eine produktionsbereite Anwendung in weniger als einer Stunde zum Laufen bringen. Am Ende dieses Leitfadens haben Sie:

  • Hochverfügbare, lastverteilte Anfragen an Ihre Container-Instances (über Application Load Balancer)
  • Ein dauerhafter und sicherer Satz von Serverinstanzen (über eine Auto Scaling-Gruppe), auf denen ein Betriebssystem ausgeführt wird, das für das Hosten von Containern optimiert ist
  • Zentralisierte, durchsuchbare Anwendungsprotokolle (über CloudWatch)
  • Versionierte Docker-Images Ihrer App, die in AWS Elastic Container Repository (ECR) gehostet werden
  • Ein schneller, zuverlässiger und SSH-freier Anwendungsfreigabeprozess
  • Wiederholbarer und versionierter Umgebungskonfigurationsprozess (über eine CloudFormation-Stack-Vorlage)

Dieser Prozess und diese Architektur basieren auf dem bewährten Ansatz, den ich zum Hosten der API und des Verwaltungsportals verwendet habe mein SaaS-Geschäft auf AWS in den letzten 3 Jahren.

ECS-Web-App-Architektur

ECS-Web-App-Architektur

ECS-Kernkonzepte

Bevor wir mit dem Aufbau unserer Umgebung beginnen, lassen Sie uns schnell einige grundlegende Konzepte und Begriffe behandeln, auf die wir uns beziehen werden.

Erstens ist ECS der Service, den AWS bereitstellt, um Container zu orchestrieren, die auf EC2-Instanzen laufen. Es funktioniert, indem ein Agent-Prozess auf jeder Host-Instanz ausgeführt wird, mit der der zentrale ECS-Controller-Dienst kommuniziert, und den Agenten anweist, bestimmte Container zu erzeugen oder zu beenden, sowie Zustandsprüfungen für laufende Container durchzuführen.

ECS stellt die folgenden Ressourcen bereit, die wir verwenden werden:

  • EIN Cluster ist eine logische Gruppierung von EC2-Instances, die für die Ausführung von Anwendungscontainern verfügbar gemacht werden. ECS führt seinen Agentenprozess auf jeder Instance im Cluster aus.
  • EIN Aufgabendefinition Hier konfigurieren Sie, wie ein Container ausgeführt wird. Insbesondere spezifizieren Sie das verwendete Docker-Image, Port-Mappings, dessen Speicher-/CPU-Anforderungen und alle Umgebungsvariablen, die zur Laufzeit im Container gesetzt werden sollen.
  • EIN Aufgabe nennt ECS einen laufenden Docker-Container, der mit der in einer Aufgabendefinition bereitgestellten Konfiguration erstellt wurde.
  • EIN Service Hier definieren Sie die Orchestrierungsanforderungen für eine bestimmte Aufgabendefinition. Der Hauptpunkt hier ist die Definition der gewünschten Anzahl von Tasks für eine Task-Definition, die jederzeit ausgeführt werden soll. Es ist möglich, verschiedene Aufgabendefinitionen innerhalb eines einzelnen Dienstes zu konfigurieren, aber für unsere Web-App haben wir nur eine 1:1-Zuordnung von Dienst zu Aufgabendefinition. Innerhalb des Service teilen Sie ECS auch mit, welcher Load Balancer zum Weiterleiten von Anfragen an ihn verwendet werden soll.

Kasse Dieser Artikel für einen eingehenderen Blick auf die ECS-Definitionen.

Bauen Sie Ihre Umgebung auf

Ok, Zeit, Ressourcen zu erstellen …

Schritt 0: Voraussetzungen

Der Rest des Leitfadens geht davon aus, dass:

  • Sie haben bereits ein AWS-Konto
  • es hat eine VPC und mindestens 2 öffentliche Subnetze konfiguriert (vorzugsweise in verschiedenen Verfügbarkeitszonen)
  • Sie haben eine erstellt EC2-Schlüsselpaar die für SSH in EC2-Instanzen von Ihrem Computer verwendet werden würden
  • du hast die AWS-CLI auf Ihrem Computer installiert

Schritt 1: Bereiten Sie Ihren App-Quellcode vor

Wenn Sie es vorziehen, eine vorgefertigte grundlegende Node.js-Webanwendung zu verwenden, um die verbleibenden Schritte durchzuarbeiten, können Sie ziehen dieses Repo zu Ihrem Gerät und fahren Sie mit Schritt 2 fort.

Wenn Sie Ihre App bereits angedockt haben und nun bereit sind, sie bereitzustellen, kopieren Sie einfach diese Shell-Datei in den Stammordner Ihres Anwendungsquellcodes. Es enthält einige Hilfsskripte, die wir zum Erstellen und Bereitstellen des Docker-Images verwenden werden.

Schritt 2: Docker-Variablen konfigurieren

Öffne das docker-task.sh Datei und aktualisieren Sie die folgenden Variablen:

  • IMAGE_NAME: Dies muss auf den Namen des Bildes eingestellt werden, das Sie erstellen möchten (z winterwindsoftware/simple-express-app)
  • AWS_REGION: Name der Region, in der Sie bereitstellen (z us-east-1)
  • CONTAINER_PORT: Portnummer, die von Ihrem Container-Image bereitgestellt wird (bei Verwendung der Beispiel-App ist dies 8080)

Speicher die Datei.

Schritt 3: ECR-Repository erstellen

./docker-task.sh createrepo

Dadurch wird ein neues Repository mit dem gleichen Namen wie die erstellt IMAGE_NAME Variable.

Notieren Sie sich den Wert der repositoryUri JSON-Feld, das in der Antwort von AWS in Ihrem Terminal gedruckt wird. Öffne das docker-task.sh Datei und aktualisieren Sie die REPOSITORY_PATH mit dem ersten Teil dieses Werts (bis hin zum „amazonaws.com“-Bit). Es sollte ungefähr so ​​​​aussehen <aws_account_id>.dkr.ecr.<aws_region>.amazonaws.com.

Anschließend können Sie die öffnen ECR-Konsole um zu überprüfen, ob das Repo ordnungsgemäß erstellt wurde.

Schritt 4: Docker-Image lokal erstellen

Schritt 5: Stellen Sie das Image auf ECR ​​bereit

Um das Bild in ECR hochzuladen, führen Sie Folgendes aus:

Wenn Sie nach Abschluss die AWS-Konsole aktualisieren, sollten Sie das dort aufgeführte neue Bild sehen.

Schritt 6: CloudFormation-Stack erstellen

Wir werden einen CloudFormation-Stack verwenden, um alle erforderlichen AWS-Ressourcen zu starten. Überschreiben diese Stack-Datei in ein neues /cloudformation Ordner in der Codebasis Ihrer App.

Öffnen Sie dann Ihr Terminal und führen Sie den folgenden CLI-Befehl aus, um Ihren Stack zu erstellen. Bevor Sie es ausführen, müssen Sie alle von spitzen Klammern umgebenen Werte aktualisieren, z. B. (<vpc_id>).

aws cloudformation deploy \ --stack-name SimpleExpressApp \ --template-file ./cloudformation/ecs-webapp-stack.yml \ --capabilities CAPABILITY_IAM \ --parameter-overrides KeyName="<keypair_id>" \ VpcId='<vpc_id>' \ SubnetId='<subnet_id_1>,<subnet_id_2>' \ ContainerPort=8080 \ DesiredCapacity=2 \ EcsImageUri='<ecr_image_uri>' \ EcsImageVersion='<app_version>' \ InstanceType=t2.micro \ MaxSize=3

⚠️ Beachten Sie, dass dadurch einige kostenpflichtige stündliche Ressourcen entstehen, darunter 2 Mikro-EC2-Instances und ein Application Load Balancer. Wenn Sie diesen Stack nur zu Testzwecken erstellen, können Sie Ihren Stack mit löschen CloudFormation-Konsole Sobald Sie fertig sind, entfernen Sie alle Ressourcen.

Schritt 7: Im Browser testen

Die Erstellung des Stacks dauert etwa 5 Minuten. Sobald es fertig ist, gehen Sie zu Load Balancer-Konsole und wählen Sie die erstellte ALB aus. Kopieren Sie den Wert der DNS name Einstellung in die Adressleiste Ihres Browsers. Es sollte ungefähr so ​​​​aussehen ecsalb-12345678.us-east-1.elb.amazonaws.com. Dies sollte die Startseite der App öffnen.

Sie können die Protokolle auch von Ihrer App aus anzeigen, indem Sie zu gehen CloudWatch Logs-Konsole.

Wie stelle ich neue Versionen meiner App bereit?

Pushen Sie eine neue Image-Version

Um eine aktualisierte Version der App bereitzustellen, nehmen Sie zunächst eine kleine Änderung an Ihrer Codebasis vor. Wenn Sie die Node.js-Beispielanwendung verwenden, können Sie sie einfach ausführen npm version minor um die Nebenversionsnummer zu erhöhen, wenn sie dynamisch gelesen und auf der Homepage gerendert wird.

Führen Sie dann Folgendes aus, um die neue Version des Images zu erstellen und an ECR zu übertragen:

./docker-task.sh build && ./docker-task.sh push

Notieren Sie sich die neue Versionsnummer. Führen Sie dann denselben CLI-Befehl wie in Schritt 6 aus, außer mit dem EciImageVersion Parameterwert aktualisiert (dieses Beispiel hat eine neue Versionsnummer von 1.1.0):

aws cloudformation deploy \ --stack-name SimpleExpressApp \ --template-file ./cloudformation/ecs-webapp-stack.yml \ --capabilities CAPABILITY_IAM \ --parameter-overrides KeyName="<keypair_id>" \ VpcId='<vpc_id>' \ SubnetId='<subnet_id_1>,<subnet_id_2>' \ ContainerPort=8080 \ DesiredCapacity=2 \ EcsImageUri='<ecr_image_uri>' \ EcsImageVersion='1.1.0' \ InstanceType=t2.micro \ MaxSize=3

Aktualisieren Sie nach Abschluss des Stack-Updates Ihren Browser, um die neue Version der App anzuzeigen. Das ist es! Kein SSH-ing in Server oder Kopieren von Dateien über das Netzwerk.

Zurück rollen

Sie haben Ihren Rauchtest nach der Veröffentlichung durchgeführt und einen neu eingeführten Fehler mit hoher Priorität entdeckt. 😰 Es wird eine Weile dauern, das Problem zu untersuchen/beheben, also entscheiden Sie sich in der Zwischenzeit für ein Rollback auf die vorherige Version. Kein Problem! Führen Sie einfach den CloudFormation-Bereitstellungsbefehl unter Angabe der vorherigen Versionsnummer erneut aus. Schwitzen 😅.

Erweitern Sie Ihren Stack

Sie haben jetzt also eine laufende, containerisierte Web-App mit hoher Verfügbarkeit.

Wenn Sie dies weiterführen und den Stack für Ihre eigenen Anforderungen erweitern möchten, können Sie dies tun, indem Sie die bearbeiten ecs-webapp-stack.yml CloudFormation-Vorlage.

Hier ein paar Anregungen zum Ausprobieren:

  • Fügen Sie Ihrem Application Load Balancer ein SSL-Zertifikat hinzu, um Anfragen an Ihre Web-App zu sichern
  • Fügen Sie einen Route53-DNS-Eintrag hinzu, um Ihrer App einen benutzerfreundlichen Domänennamen zu geben
  • Erstellen Sie eine separate Staging-Umgebung mit demselben Stack (Hinweis: Benennen Sie den Stack einfach in Ihrem Cloudformation-CLI-Bereitstellungsbefehl um).

Ursprünglich erschienen bei winterwindsoftware.com

Similar Posts

Leave a Reply

Your email address will not be published.