ArchRefCard-01 mit AWS Fargate (Kompetenznachweis)
Auftrag
Grafik und Diagramme
Aufgabe: Erstellen Sie Grafiken und Diagramme von ECS und ECR: Wie spielen Repository, Task Definition, Task und Service zusammen?
ECS-Beschreiben
Aufgabe: Beschreiben Sie die Funktionalität von ECS:
- Skalierbarkeit: ECS bietet eine automatische Skalierung von Container-Workloads an, um den Anforderungen gerecht zu werden. Durch die Nutzung von Auto Scaling-Gruppen und Elastic Load Balancing kann die Skalierung der Container-Workloads dynamisch angepasst werden.
- Cluster-Management: ECS ermöglicht die Erstellung und Verwaltung von Clustern, bestehend aus EC2-Instanzen oder Fargate-Containern, auf denen Container-Workloads ausgeführt werden können. Innerhalb dieser Cluster können Ressourcen gemeinsam genutzt werden, um verschiedene Anwendungen und Services zu unterstützen.
- Integrationen: ECS ist eng mit anderen AWS-Diensten integriert, darunter Elastic Load Balancing, Identity and Access Management (IAM), CloudWatch und CloudFormation. Dadurch lässt sich ECS nahtlos in bestehende AWS-Infrastrukturen und Workflows integrieren. Diese Integrationen ermöglichen eine verbesserte Skalierbarkeit, Überwachung, Zugriffskontrolle und die Automatisierung von Prozessen.
Privates Repository erstellen
Aufgabe: Erstellen Sie eine ein privates Repository in ECR für die App Ref. Card 01
Um ein privates Repository in AWS ECR zu erstellen, geht man auf die AWS-Webseite und navigiert zum ECR (Elastic Container Registry). Dort klickt man auf die Schaltfläche "Repository erstellen". Anschließend füllt man das Formular wie folgt aus:
Nach dem Erstellen des Repositories sollte es etwa wie folgt aussehen:
Optimiertes Dockerfile
Aufgabe: Benutzen Sie Ihr optimiertes Dockerfile aus dem Unterricht. Sollten Sie kein lauffähiges Dockerfile besitzen, verwenden Sie die Vorlage auf der nächsten Seite.
Im folgenden Link findet man meine Version des optimierten Dockerfiles mit allen dazugehörigen files: Dockerfile: https://github.com/masluse/m346-ref-card-01
Testen
Zunächst überprüfen wir das Image mit dem Befehl 'docker build' und starten dann einen Container daraus.
docker build -t archrefcard-01:latest .
Um sicherzustellen, dass Ihr erstelltes Image einwandfrei funktioniert, können Sie es mithilfe der Befehle "docker images" oder "docker inspect" überprüfen. Sobald Sie die notwendigen Informationen über Ihr Image erhalten haben, können Sie es lokal ausführen, indem Sie den Befehl "docker run" verwenden. Vergewissern Sie sich, dass die Ausführung des Images ohne Fehler erfolgt.
docker run -d -p 8080:8080 archrefcard-01:latest
Image hochladen
-
Als erstes sollte man die push befehle in der AWS Konsole öffnen:
-
Als nächstes sollte man den Token herausfinden:
aws ecr get-login-password --region us-east-1
-
In Ihrem lokalen Terminal geben Sie nun den zweiten Teil des Befehls nach dem | ein.
echo "<TOKEN>" | docker login --username AWS --password-stdin 1234EXAMPLE.dkr.ecr.us-east-1.amazonaws.com
-
Zum schluss muss das Image nur noch generiert und hochgeladen werden mit den folgenden befehlen:
docker build -t regli/rechsteiner-app-ref-card-01 . docker tag regli/rechsteiner-app-ref-card-01:latest 12345EXAMPLE.dkr.ecr.us-east-1.amazonaws.com/regli/rechsteiner-app-ref-card-01:latest docker push 12345EXAMPLE.dkr.ecr.us-east-1.amazonaws.com/regli/rechsteiner-app-ref-card-01:latest
VPC
Anschließend haben wir ein neues VPC erstellt, um unsere Arbeit zu erleichtern. Der Vorteil besteht darin, dass wir die Container in den privaten Subnetzen platzieren und über NAT-Instanzen eine Verbindung zum Internet herstellen können. Uns ist aufgefallen, dass die Container ohne Internetzugang nicht richtig starten und dass die Kosten in die Höhe getrieben werden, wenn jeder Container eine öffentliche IP-Adresse hat. Ein weiterer Punkt ist, dass es sicherer ist, wenn der Service selbst keine öffentliche IP-Adresse hat, sondern alles über den Load Balancer läuft.
ECS Cluster
Aufgabe: Erstellen und dokumentieren sie einen ECS-Cluster. Achten Sie auf sinnvoll benannte Objekte, verwenden Sie keine generischen Namen mehr (z.Bsp. nicht nginx-custom oder fargate-service), sondern Ihren nachnamen-refcard01.
Im folgenden sieht man die konfigruation die wir für das Cluster verwendet haben:
Task Definition
Aufgabe: Erstellen Sie eine Task Definition für App Ref. Card 01. Recherchieren oder testen Sie die Minimal anforderungen an Prozessor und Speicher.
Die Task-Definition war sehr einfach, da man nur das Image ":latest", einen Namen für den Container und einen Port angeben musste, der nach außen gemappt werden soll. Wir fanden es jedoch schade, dass man aus irgendeinem Grund nur den Container-Port angeben konnte und nicht noch separat den Host-Port, da wir später über Port 80 auf den Webserver zugreifen wollten. Wir haben dieses Problem jedoch einfach mit dem Load Balancer umgangen, indem wir ihm gesagt haben, dass er auf Port 8080 auf den Containern hören soll, aber von außen über Port 80 erreichbar sein soll.
Die Aufgabe, die minimale Anforderungen an Prozessor und Speicher hatte, konnten wir schnell lösen. Wir haben uns für eine Konfiguration mit 0,25 vCPU und 0,5 GB RAM entschieden, da dies das niedrigste auswählbare Angebot war und der Container damit funktioniert hat.
Load-Balancer
Aufgabe: Erstellen Sie sich einen Load-Balancer vor Ihrem ECS Service
Um einen Load Balancer zu erstellen, navigiert man zuerst zur EC2-Konsole und wählt dann "Load Balancer" aus. Dort kann man einen neuen Load Balancer erstellen. Im nächsten Schritt muss man dann die Konfiguration des Load Balancers anpassen, je nach den spezifischen Anforderungen des eigenen Projekts. Hier ist ein Beispiel für die Konfiguration, die wir für unseren Load Balancer verwendet haben:
Sicherheitsgruppe für Loadbalancer erstellen:
Target Gruppe für Loadbalancer erstellen:
VPC Security Groups
Aufgabe: Befassen Sie sich mit den VPC Security Groups. Verwenden Sie für die Fallstudie nicht die Default Security Group, sondern erstellen Sie eine neue, sauber benannte Security Group und sichern Sie diese nach "least privilege" ab.
In der Security Group ist es speziell so konfiguriert, dass der einzige Inbound-Traffic, der erlaubt ist, über den Port 8080 kommt und ausschließlich vom Load Balancer stammt. Dadurch wird verhindert, dass Traffic, der nicht vom Load Balancer kommt, zu den Containern gelangen kann.
Service erstellen
Folgend sieht man die Konfiguration unseres Services
Besonders beim folgenden ist das die Container nur in die Privaten Subnetze kommen:
Loadbalancer hinzufügen:
Endergebnis:
Neue Versionen
Aufgabe: Dokumentieren Sie den Ablauf für neue Versionen der ref-card-01: welche ECS Komponenten müssen aktualisiert werden? Dokumentieren Sie die benötigten Zeiten für den Neustart und wie lange mehrere Versionen aufrufbar sind. Zusatzaufgabe: Automatisieren Sie diesen Ablauf mit der AWS CLI.
Aufgabe
=== "Aufgabe"
src/main/resources/templates/index.html so bearbeiten das man nachher einen unterschied sieht:

Image erneut hochladen:

Auf dem Service den Neue Bereitstellung erzwingen Hacken auswählen und speichern:

Webserver kontrollieren:

Zusatzaufgabe
src/main/resources/templates/index.html so bearbeiten das man nachher einen unterschied sieht:

Image erneut hochladen:

Auf das AWS CLI gehen und den folgenden befehl ausführen:
``` bash
aws ecs update-service --cluster <cluster-name> --service <service-name> --force-new-deployment
```

Webserver kontrollieren: