Im vorherigen Kapitel hast du ein Container Image für die Backend Applikation erstellt. Wie besprochen beinhaltet das Container Image die Applikation, die Abhängigkeiten, die die Applikation benötigt, und das Container Image beschreibt wie die Applikation ausgeführt werden kann. Das Backend Container Image beispielsweise beinhaltet eine Python Laufzeitumgebung, da das Backend in Python implementiert ist und Python zum Ausführen braucht.
Du hast das Container Image in ein Amazon ECR Container Repository hochgeladen. Die Container Repositories speichern die Container Images. Also fragst du dich vielleicht wie die Container ausgeführt werden, damit deine Backend Applikation nutzbar ist? Damit wirst du dich in diesem Kapitel beschäftigen.
Eine Container Engine ist Software, die ein Container Image aus einer Container Registry herunterlädt und den Container ausführt. Die Container Engine virtualisiert das darunterliegende Host-Betriebssystem. Das bedeutet, dass der Container nicht direkt mit dem Betriebssystem interagiert, sondern alle Aufrufe durch die Container Engine gehen. Somit isoliert die Container Engine den Container vom Rest des Systems, dies trägt zu besserer Sicherheit bei.
Ein Containerverwaltungsservice (engl. Container Orchestrator) ist Software, die im Kontext vom Ausführen von Containern auftaucht. Ein Containerverwaltungsservice ist nicht zwingend notwendig zum Ausführen von einem Container, dafür ist die Container Engine zuständig. Dennoch macht ein Containerverwaltungsservice das Betreiben von Container einfacher. Meistens soll nicht nur ein Container ausgeführt werden. Oft werden mehrere Container mit dem gleichen oder unterschiedlichen Container Images ausgeführt. Im Zusammenhang von Cloud Computing hast du bereits Anforderungen wie hohe Verfügbarkeit und Elastizität kennengelernt. Diese Anforderungen können durch das Ausführen von mehreren Containern erfüllt werden. Ein Containerverwaltungsservice kontrolliert die Anzahl der Container. Zum Beispiel kann ein Containerverwaltungsservice, wenn am Black Friday mehr Kunden als normal gleichzeitig shoppen, mehr Container starten, damit alle Anfragen bearbeitet werden (Elastizität). Ein Containerverwaltungsservice kann einen Container neu starten, falls dieser gecrasht ist und trägt somit zur Hohen Verfügbarkeit bei.
Lass uns all diese neuen Konzepte mithilfe von einer Analogie besser verstehen. Ein musikalisches Blasorchester besteht aus einem Dirigenten, Musikinstrumenten (z.B. Trompete, Tuba, …), Menschen, und Notenbüchern. Ein Notenbuch beinhalten den Text der Musik beschreibt. Ein Notenbuch ist wie ein Container Image, das Container Image beinhaltet den Code, der die Applikation beschreibt. Die Notenbücher werden in einem Bücherregal gespeichert. Genauso werden Container Images in einer Container Registry gespeichert. Das Bücherregal ist also die Analogie für eine Container Registry. Um eine Aufführung durchzuführen, wählen die Menschen, die im Orchester mitspielen, verschiedene Notenbücher für die verschiedenen Instrumente. Die Menschen sind also wie eine Container Engine, die Container Images herunterlädt. Die Menschen in einem Blasorchester blasen Luft in die Musikinstrumente und die Musikinstrumente produzieren Töne. Vergleichbar führt die Container Engine (Menschen) die Container aus und gibt die Eingabe (Luft) an die Container (Musikinstrumente). Die Bühne, auf der die Menschen mit den Musikinstrumenten stehen, kann unsere Serverhardware mit Host-Betriebssystem darstellen. Auf der Bühne können mehrere Trompeten gleichzeitig gespielt werden und es können auch andere Musikinstrumente zeitgleich auf der Bühne gespielt werden. Genauso kann die Container Engine auf dem Host-Betriebssystem mehrere Instanzen von einem Container Image gleichzeitig ausführen und auch Container mit einem anderen Container Image zeitgleich ausführen. Zum Beispiel können mehrere Backend-Container und mehrere Frontend-Container gleichzeitig ausgeführt werden. Zuletzt steht der Dirigent in unserer Analogie stellvertretend für den Containerverwaltungsservice. Der Dirigent leitet das Orchester und sagt den Menschen, die Instrumente nicht zu spielen oder weiterzuspielen. Auch der Containerverwaltungsservice sendet der Container Engine Befehle, um Container zu stoppen oder zu starten.
Amazon Elastic Container Service (Amazon ECS) ist ein Containerverwaltungsservice. Es müssen Aufgaben definiert werden (Task Definition), um Docker-Container in Amazon ECS auszuführen. Dabei legst du fest, welches Docker-Image jeder Container für die Aufgaben nutzen soll und wie viel CPU und Speicher dafür zu Verfügung stehen. Weitere Parameter können je nach Bedarf angepasst werden. In der Definition einer Aufgabe können mehrere Container genutzt werden. Die Aufgabe selbst muss nicht die ganze Anwendung enthalten, sondern die Anwendung kann auf mehrere Aufgabendefinitionen aufgeteilt werden.
Je nachdem wie der Workload variiert und ob Container selbstständig verwaltet werden sollen, gibt es verschiedene Launchtypes für Amazon ECS: Amazon EC2 und AWS Fargate. Der Launchtype EC2 stellt Amazon EC2-Instanzen für die Container zur Verfügung und eignet sich für stabile CPU- und Speicherauslastungen. Zusätzlich musst du deine Infrastruktur selbst verwalten.
Im Vergleich dazu bietet der Launchtype Fargate den Vorteil, dass die Infrastruktur nicht selbst verwaltet werden muss und sich dieser selbstständig skaliert, wodurch die Anzahl seiner Aufgaben erhöhen oder reduzieren kann je nach Grösse der Nachfrage. Die Skalierung kann als Grundlage den Wert einer Metrik nutzen beispielsweise die CPU-Auslastung. Durch diese Metriken kann dann festgelegt werden, wann Amazon ECS skalieren soll.
Eine andere Art der Skalierung ist die geplante Skalierung. Dadurch wird festgelegt an welchem Tag und zu welcher Zeit eine bestimmte Menge an Aufgaben erfüllt werden soll. Als dritte Möglichkeit kann die Anpassung auch schrittweise erfolgen. Je nachdem wie groß oder klein die Veränderung der betrachteten Metrik ist, zum Beispiel der mittleren CPU-Auslastung, hängt davon auch die Skalierung ab. Die Skalierbarkeit ist für mehrere Availability Zones automatisch möglich und erhöht dadurch die Verfügbarkeit der eigenen Anwendungen, da durch die Availability Zones die Anwendung redundant wird. Um die Amazon EC2-Instanzen in einem Amazon ECS-Cluster zu managen, ist kein weiteres Programm nötig. Mit API-Aufrufen können container-basierte Anwendungen einfach gestartet und gestoppt werden. Außerdem können dadurch Informationen über den gesamten Zustand des Clusters aufgerufen werden. Durch Amazon ECS können auch viele bereits bekannte Services genutzt werden wie Security Groups und and IAM-Rollen.
In den folgenden Schritten wirst du ein Container Cluster erstellen. Das Cluster wird genutzt, um Backend-Container auszuführen. Wie ein Cluster Backend-Container ausführen soll werden mit Task Definitionen beschrieben. In diesem Kapitel wirst du Task Definitionen für die ToDo-Applikation erstellen.
Aufgabe:
Erstelle ein Container Cluster in Amazon Elastic Container Service (Amazon ECS) und benenne es workshop-cluster
. Nutze als Template Networking only und wähle Use Container Insights aus, um mehr Einblicke später in das Cluster zu bekommen.
Beim ersten Versuch ein Amazon ECS Cluster zu erstellen kann es ggf. zu einer Fehlermeldung kommen mit dem Vermerk, dass eine Service Rolle noch nicht existiert. Sollte das der Fall sein, den Vorgang mit Cancel abbrechen und die oben genannten Schritte 1 - 6 nochmals ausführen. Im Hintergrund wurde die Rolle dann automatisch angelegt.
workshop-backend
eingeben.container-backend
eingeben.<yourAWSAccountID>.dkr.ecr.us-east-1.amazonaws.com/workshop-backend:latest
workshop-db.xxxxxxxxx.us-east-1.rds.amazonaws.com
. Diesen findest du bei deiner bereits erstellten RDS Datenbank.DB_USER
| Value: clusteradmin
DB_PASSWORD
| Value: todopassword
DB_HOST
| Value: DNS Endpunkt der DB Instanz
Die Umgebungsvariablen werden im Source Code der Backend Applikation gelesen. Du setzt hier Werte für die drei Umgebungsvariablen DB_USER, DB_PASSWORD, und DB_HOST. Diese Informationen nutzt der Source Code der Backend Applikation um sich mit der Datenbank zu verbinden. Mit dem DNS Endpunkt (DB_HOST) kann die Backend Applikation die Datenbank im Internet finden. Dann kann sich die Applikation mit dem DB_USER und DB_PASSWORD bei der Datenbank anmelden. Die angemeldete Backend Applikation kann jetzt Daten aus der Datenbank lesen oder neue Daten in der Datenbank speichern.
workshop-cluster
.backend-service
eingeben.2
eingeben.Workshop-VPC
ausgewählt.Workshop-PublicA
und Workshop-PublicB
auswählen.Workshop-ECS-Backend-SG
auswählen.todoApp
.80:HTTP
Listener auswählen.workshop-backend
target group im Dropdown auswählen.Herzlichen Glückwunsch! Du hast erfolgreich das Backend für deine Anwendung durch Amazon ECS implementiert und dadurch hochverfügbar gemacht. Nun können zwei Container im Hintergrund laufen, um die Anwendung zu unterstützen. Diese sind durch den Load Balancer auf zwei Availability Zones verteilt. Im nächsten Schritt wird nun das Frontend aufgesetzt. Das Frontend wird dann über den Load Balancer auf das Backend zugreifen und das Backend API auf die ToDos in der Datenbank zugreifen.