In dieser Laborumgebung ist der Zugriff nur auf die AWS-Services beschränkt, die zum Ausführen des Labs erforderlich sind. Wenn Sie versuchen, auf andere Dienste zuzugreifen oder Aktionen auszuführen, die über die in diesem Lab beschriebenen hinausgehen, können Fehler auftreten.
Für den ersten Challenge der Kompetenz **KN06** wechseln Sie ins elfte Modul **Module 11 - Load Balancers and Caching**. Hier finden Sie die praktische Übung **Lab 11 - Load Balancing**. Diese ist Schritt für Schritt geleitet.
Die folgenden Challenges bauen auf diesem ersten Lab auf. Versuchen Sie deshalb die Schritte so zu dokumentieren, dass Sie darauf zurückgreifen können.
Das Lab dauert ca. 30'. Führen Sie alle Schritte konzentriert und der Reihe nach durch. Für den Leistungsnachweis zeigen Sie neben der Doku auch noch gleich live, dass der Loadbalancer funktioniert (Browser mehrmals hintereinander reloaden).
:bulb: Für eine **perfekte High Availability-Plattform** würde dieser Load Balander **noch nicht alle Bedingungen** erfüllen. Das **Beispiel unten** zeigt, dass die Instanzen in **unterschiedlichen** Availability-Zones sind. Damit ist zwar schon mal **ein wichtiges Kriterium** erfüllt. Was würde jetzt aber passieren, wenn plötzlich gleichzeitig **10'000x mehr** Requests reinkämen und die Applikation unter dieser Last zusammenbricht?
Genau. Um diesen - oder ähnliche - **Use-cases** in den Griff zu bekommen, benötigt der **Load Balancer** Unterstützung von seinem besten Freund, dem **Auto Scaler** :two_men_holding_hands:. Was dieser unternimmt und wie er es macht, erfahren Sie gleich, nachdem wir noch abschliessend zu diesem Challenge einen möglichen Use-Case eines Service-Ausfalls (DoS-Attacke) angeschaut haben. Sie werden dann im nächsten Challenge auch gleich selber einen **Auto Scaler** aufsetzen und diesen dann im übernächsten Challenge mit dem **Load Balancer** zum unschlagbaren Team **High Availabiliy** vereinen. :wrench:
Denial of Service (DoS) bezeichnet eine Cyberangriffstechnik, bei der ein Angreifer versucht, ein Computersystem oder eine Website durch Überlastung mit Traffic oder Anfragen unzugänglich zu machen. Das Ziel ist, legitimen Nutzern den Zugriff zu verweigern, indem die Ressourcen des Zielsystems erschöpft werden. DoS-Angriffe oder auch gewöhnliche technische Störungen können erhebliche Schäden verursachen und werden durch verschiedene **proaktive** Sicherheitsmaßnahmen wie Firewalls, Intrusion Detection Systems bekämpft und zusätzlich mit Monitoring-Software überwacht. Der Load Balancer hat aber eine andere Aufgabe und ist nicht darauf ausgelegt, solche Problem zu lösen. Und genau da kommt der **Auto Scaler** ins Spiel. Der **Auto Scaler** gehört zu den **reaktiven** Sicherheitsmassnahmen. Er wird durch einen **Trigger** aktiviert. Das ist entweder ein **Status Check** der einen Alarm auslöst, oder eine **CloudWatch-Metrics**, die eine Grenzwertüberschreitung meldet. Er kommt also erst zum Zug, wenn irgendetwas **nicht** stimmt. Die vier Bilder unten zeigen genau ein solches Szenario auf.
Der **Load Balancer** aus dem letzten Challenge und die **Auto Scaling Group** können unabhängig voneinder eingesetzt werden. Gemeinsam sind diese beiden Dienste allerdings unschlagbar und in einer **dynamischen High Availability Umgebung** nicht wegzudenken.
Kombiniert man den **Auto Scaler** mit den **Load Balancer**, erhält der dahinterliegende Service eine um einiges höhere Verfügbarkeit. Beim Ausfall einer Site (z.B. Datacenter Stromausfall) wird der Traffic automatisch auf die andere Site umgeleitet. Die "verlorenen" Instanzen werden automatisch in der verfügbaren Availability Zone hochgefahren. Zusätzlich kann man den **Auto Scaler** auch noch mit Metrics ergänzen. Z.B. Falls die CPU-Auslastung einen Grenzwert überschreitet, sollen dynamisch weitere Instanz hochgefahren werden etc... Das ganze funktioniert natürlich auch umgekehrt. Falls die CPU-Auslastung unter den Grenzwert fällt, wird die zusätzliche Instanz automatisch wieder terminiert. Man spricht in diesem Fall von **Elasticity**. Im Gegensatz zum Begriff **Scalability** (z.B. Einbau einer weiteren SSD) kann die Plattform **on-demand** Ressourcen hinzufügen oder entfernen.
Momentan aber schauen wir diese beiden Dienste noch losgelöst voneinander an. Im folgenden Auftrag geht es deshalb nur um die Vorzüge des **Auto Scalers**. Er stellt sicher, dass meine Ressourcen **immer** dem gewünschten Zustand (Desired state) entsprechen. Im folgenden Challenge setzen wir diesen Dienst so auf, dass **immer mindestens zwei** EC2-Instanzen laufen. Falls eine Instanz wegfällt (z.B. versehntlich terminiert, SW-Issue oder technischer Defekt) wird automatisch eine neue Instanz hochgefahren.
- Skaliert **On-demand** (Performance) und/oder gemäss Planung (Falls man z.B. weiss, dass am Sonntagabend ein Backup-Job viel Ressourcen braucht). <br>
##### Netzwerkschema:
1. Auto Scaling Group reagiert dynamisch auf Status Checks und CloudWatch Metrics: :mag_right: [Originalbild][19b] _(oder unten auf das Bild klicken)_<br>
1 Auto Scaling Group überwacht Status Checks und CloudWatch Metrics |
Gleichzeitig erkennt man hier aber sofort auch die **Grenzen** des **Auto Scalers**. Er ist zwar in der Lage, aufgrund von **status checks** und **CloudWatch-Metrics** den Gesundheitszustand der Instanzen zu checken und entsprechend zu reagieren (z.B. beim Ausfall einer EC2-Instanz eine Ersatz-Instanz hochzufahren), aber er ist alleine **nicht** in der Lage, die Last gleichmässig zu verteilen und dabei auch die neuen Instanzen einzubinden. Und genau hier kommt ihm sein bester Freund, der **Load Balancer**, zur Hilfe :two_men_holding_hands:. Der **Auto Scaler** sorgt also quasi **im Hintergrund** dafür, dass **immer** ausreichend (nicht zuviel, aber auch nicht zuwenig) Ressourcen vorhanden sind, während der **Load Balancer** vorne praktisch als **Türsteher** dafür sorgt, dass diese Ressourcen **gleichmässig** genutzt werden. Weil die Ressourcen nun dynamisch angepasst werden und über zwei oder mehrere **Availability Zones** verteilt sind, sind sämtliche Anforderungen an eine **High Availability-Architektur** erfüllt.
Setzen Sie als erstes ein Launch-Template auf. Wählen Sie dazu links in der **Navigation Bar** unter **`Instances`** den Buttom **`Create Launch template`** aus. Dann konfigurieren Sie das LaunchTemplate mit folgenden Parametern:
- [**diesen Code**](https://gitlab.com/ser-cal/m346-scripts/-/blob/main/KN06/user-data-az_c.md?ref_type=heads) eingeben (Copy/Paste). Bitte darauf achten, dass **nur** der Code eingegeben wird. Die Erklärungen helfen Ihnen lediglich, den Code zu verstehen. Später, beim Leistungsnachweis, wird von Ihnen erwartet, dass Sie diesen bis ins Detail erklären können.
Wählen Sie wieder links in der **Navigation Bar** unter **`Auto Scaling`** das Unterverzeichnis **`Auto Scaling Groups`** aus. Dann klicken Sie auf den orangen Buttom **`Create Auto Scaling group`**. Danach erscheint eine neue Seite mit dem Titel **Choos launch template**, welches Sie wie folgt ausfüllen:<br>
1. Activity history anschauen: Hier sieht man, dass die **Auto Scaling Group** bereits aktiv eingegriffen hat. Es wurden **zwei** EC2-Instanzen **gemäss den ganz am Anfang definierten Informationen im Launch template** gelauncht (Increasing the capacity from 0 to 2).
:bell: Verständnisaufbau für Merkmale, die eine **High availability**-Architektur auszeichnen. Sie wissen, wie eine **Auto Scaling Group** aufgesetzt wird und was sie genau macht. Sie kennen den Unterschied zwischen **Scaling up** (Vertikale Skalierung) und **Scaling out** (Horizontale Skalierung) und verstehen, wie die Services **Auto Scaling Group** und **Load balancer** arbeiten und wie sie sich gegenseitig ergänzen.
##### Leistungsnachweis
- [ ] Das **Launch template** ist korrekt erstellt worden (gemäss Namenskonvention).
- [ ] Die **Auto Scaling Group** ist korrekt erstellt worden (gemäss Namenskonvention).
- [ ]**Zwei** Webserver-Instanzen in **unterschiedlichen Availability Zones** wurden gemäss **Launch template** erstellt.
- [ ] Differenziert und nachvollziehbar im persönlichen Repository dokumentiert.
- [ ] Fachgespräch mit Coach.
- [ ] Sie kennen die Details des verwendeten User-data scripts
- [ ] Sie kennen den Unterschied zwischen Auto-scaler und Load Balancer.
- [ ] Sie verstehen, was **High availability** bedeutet und können diesen Begriff differenziert anhand eines Beispiels erklären.
Beachten Sie ausserdem die [allgemeinen Informationen zu den Abgaben](../Abgaben.md).
:bookmark: Für dieses Lab verwenden Sie in der **AWS Academy** das **Learner Lab**. Es baut auf dem vorangegangenem Challenge **B)** auf. Das heisst: Die **Auto Scaling Group** existiert bereits und hat **zwei Instanzen** in **zwei verschiedenen Availability Zones** erstellt. Falls Sie in der Zwischenzeit das Lab aus- und wieder eingeschaltet haben sollten, ist das kein Problem. Die **Auto Scaling Group** ist **persistent** und startet die Instanzen wieder automatisch, wenn Sie das Lab starten. :pushpin: Das heisst aber auch, dass Sie diese und alle dazugehörigen Ressourcen **am Ende dieses Challenges** unbedingt **löschen** sollten.
Nun. Im **ersten Challenge** von **KN06** haben Sie einen **Load Balancer** erstellt. Im **zweiten Challenge** dann haben Sie im **Learner Lab** eine **Auto Scaling Group** erstellt. Sie haben auch erfahren, wie diese beiden Dienste funktionieren, dass sie beste Freunde sind und sich **perfekt** ergänzen. Nun gilt es also, im **Learner Lab** noch den **Load Balancer** aufzusetzen und diesen mit dem bereits funktionierenden **Auto Scaler** zu vereinen. Wenn alles funktioniert, haben Sie am Ende dieses Challenges die reinste Form einer **hochverfügbaren Plattform** geschaffen. Dies, weil auch der vermeintlich einzige **Single Point of Failure**, der **ELB** (Elastic Load Balancer), AWS-Intern mehrfach über verschiedene IP-Adressen abgesichert wird.
Dieser letzte **KN06 Challenge** setzt einen funktionstüchtigen **Auto Scaler** aus dem letzten Challenge voraus (zwei EC2-Instanzen in unterschiedlichen AZs sollten ebenfall schon laufen).
:warning: **Hinweis:**<br>
Die Umgebung läuft im Moment also wie folgt:
- Die **Auto Scaling Group** ist **im Hintergrund aktiv** und sorgt dafür, dass **immer mindestens zwei Instanzen** laufen.
##### Use Case: Auto Scaler funktioniert, aber ohne Loadbalancer
Dieses Beispiel mit einer Reihenfolge von **5 Bildern** verdeutlicht, weshalb es nicht viel bringt, wenn man nur den **Auto Scaler** aufsetzt, ohne ihn mit dem **Load Balancer** zu ergänzen.
**2. Bild:** Das bedeutet, dass die Last **nicht** gleichmässig verteilt wird. Hier fällt genau die EC2-Instanz aus, auf welche alle User zugreifen.<br>
**3. Bild:** Der Auto Scaler erhält diese Info und ist sofort in der Lage, eine neue Instanz zu starten. Aber so, wie die Umgebung aktuell aufgesetzt ist, können die User nicht darauf zugreifen.<br>
**4. Bild:** Der Auto Scaler funktioniert **as designed**. Bei noch mehr Anfragen wird er aufgrund des überschrittenen Grenzwertes weitere Instanzen hochfahren.<br>
**5. Bild:** Der Prozess wird fortgesetzt. On-demand werden Instanzen hoch- oder runtergefahren. Obwohl der Load mit dieser Scale-out-Strategie abgedeckt wäre, können die User immer noch nicht auf den Dienst zugreifen.
:bulb: Und hier kommt der **Loadbalancer** ins Spiel. Falls dieser nämlich vorhanden wäre, würde er **Hand in Hand** mit dem Auto-Scaler die aktuellen Infos austauschen und dafür sorgen, dass die Anfragen gleichmässig auf die vom **Auto Scaler** zur Verfügung gestellten EC2-Instanzen verteilt werden.
1. Auto Scaling Group ist konfiguriert und reagiert dynamisch auf Status Checks und CloudWatch Metrics: :mag_right: [Originalbild][28b] _(oder unten auf das Bild klicken)_<br>
2. Load Balancer existiert noch nicht. Muss nun erstellt werden
Es werden nicht alle Screenshots angezeigt. Es gibt allerdings die Möglichkeit, jeweils über den Begriff zu "hovern". Begriffe in Blau bedeuten, dass sie mit Links zu den zugehörigen Bildern ergänzt sind und können mit einem Klick geöffnet werden.
1. [**Navigation Bar:**](./x_res/36_Target-Group_ORIG.png) Wählen Sie links unter **`Load Balancing`** den Buttom **`Target Groups`** aus. Dann konfigurieren Sie die **Target Group** mit folgenden Parametern:
1. [**Navigation Bar:**](./x_res/45_Target-Group_ORIG.png) Wählen Sie links unter **`Load Balancing`** den Buttom **`Load Balancers`** aus. Dann klicken Sie auf den Buttom **`Create Load balancer`**.
- Default action: Forward to: **`KN06-XXX-TargetGroup1`** auswählen _(wenn Anfragen auf Port 80 eintreffen, sollen diese an die vorher erstellte TargetGroup weitergeleitet werden)_.
- **Summary:** **`Basic configuration`**, **`Security groups`**, **`Network mappings`** und **`Listeners and routing`** checken _(überprüfen, ob alles korrekt konfiguriert ist)_
Jetzt sind Sie zwar soweit, dass Sie eine Auto Scaling Group **und** einen Load Balancer haben, aber diese sind **noch nicht** aufeinander abgestimmt. Falls jetzt also **neue Instanzen** gelauncht würden, würden diese **noch nicht** der **Target Group** des **Loadbalancers** zugewiesen. Dazu müssen unbedingt noch folgende Steps durchgeführt werden.
##### Schritt 3: Auto Scaling Group der Target Group des Load Balancers zuweisen
1. [**Navigation Bar:**](./x_res/52_Target-Group_ORIG.png) Wählen Sie links unter **`Auto Scaling`** den Buttom **`Auto Scaling Groups`** aus. Dann klicken Sie auf die bereits existierende Auto Scaling Group **`KN06_XXX_AutoScalingGroup`**.
Im letzten Schritt nochmals kurz checken, ob in der **Target Group** die Targets (Instanzen) registriert sind und Health status **healthy** haben und dann mit dem DNS-Namen des Load Balancers testen, ob der Dienst funktioniert.
1. Bei der [**Navigation Bar:**](./x_res/55_Target-Group_ORIG.png) wählen Sie links unter **`Load Balancing`** den Buttom **`Target Groups`** aus. Dann klicken Sie auf den Tab **`Targets`**.
2. Bei der [**Navigation Bar:**](./x_res/56_Target-Group_ORIG.png) wählen Sie links unter **`Load Balancing`** den Buttom **`Load Balancers`** aus. Dann erscheint gleich der Name des Load Balancers **`KN06-XXX-ALB1`** und der zugehörige DNS Name **`KN06-XXX-ASB1-xxxxxx.us-east-1.elb.amazonaws.com`**.
Im Gegensatz zum Anfang dieses Challenges, entspricht die Umgebung jetzt dem **High availiabilty**-Standard - wie folgt:
- Die **Auto Scaling Group** ist **im Hintergrund aktiv** und sorgt dafür, dass **immer mindestens zwei Instanzen** laufen.
- Es wurde ein **Load Balancer** hinzugefügt, der die Last auf die verfügbaren Instanzen verteilt. Er nutzt dafür eine **Target Group**, auf welche auch der **Auto Scaler** Zugriff hat.
##### Use Case: Auto Scaler und Loadbalancer funktionieren:
Dieses Beispiel mit einer Reihenfolge von **5 Bildern** verdeutlicht, wie **Auto Scaler** und **Load Balancer** interagieren und gemeinsam sicherstellen, dass die Plattform **Fehlertolerant** und somit **hochverfügbar** ist.
Ein Benutzer greift auf die App zu. Der **Load Balancer** leitet ihn weiter zur **Instanz 1**.<br>
**2. Bild:** xxx<br>
**3. Bild:** Der Auto Scaler erhält diese Info und ist sofort in der Lage, eine neue Instanz zu starten. Aber so, wie die Umgebung aktuell aufgesetzt ist, können die User nicht darauf zugreifen.<br>
**4. Bild:** Der Auto Scaler funktioniert **as designed**. Bei noch mehr Anfragen wird er aufgrund des überschrittenen Grenzwertes weitere Instanzen hochfahren.<br>
**5. Bild:** Der Prozess wird fortgesetzt. On-demand werden Instanzen hoch- oder runtergefahren. Obwohl der Load mit dieser Scale-out-Strategie abgedeckt wäre, können die User immer noch nicht auf den Dienst zugreifen.
1. Zugriff auf App via IP oder DNS: :mag_right: [Originalbild][29b] _(oder unten auf erstes Bild klicken)_
:bell: Sie wissen, wie man eine **High availability**-Architektur aufsetzt.
Sie sind in der Lage, einen **Load Balancer** aufzusetzen und so zu konfigurieren, dass er mit einer **Auto Scaling Group** zusammenarbeitet und so sicherstellt, dass die Plattform **resilient** und **Fault tolerant** aufgebaut ist.
##### Leistungsnachweis
- [ ] Die **Target Group** ist korrekt erstellt worden (gemäss Namenskonvention).
- [ ] Der **Load Balancer** ist korrekt erstellt worden (gemäss Namenskonvention).
- [ ] Die **Auto Scaling Group** wurde korrekt der **Target Group** des **Load Balancers** zugewiesen.
- [ ] Sie verstehen, weshalb die **Auto Scaling Group** der **Target Group** zugewiesen wird und können anhand eines Beispiels differenziert erklären, wie sich das auf die Funktion der Plattform auswirkt.