m346/KN03/KN03.md
Marcello Calisto ebaecb5781 Text ergänzt
2024-03-03 11:28:21 +01:00

17 KiB

TBZ Banner

KN03 Inhaltsverzeichnis

[TOC]


Intro

Beachten Sie die allgemeinen Informationen zu den Abgaben.

Wir nutzen Amazon Web Services oder abgekürt AWS. Alles was wir hier umsetzen, bieten allerdings auch andere public cloud Anbieter (z.B. Microsoft Azure, Google Cloud Platform oder Linode).


Challenges

A) Cloud-init Datei verstehen

Ausgangslage:

In den vorangegangenen Challenges haben sie vorwiegend mit der imperativen Methode gearbeitet. Jetzt beginnen Sie, sich mit der deklarativen Methode auseinanderzusetzen. Der erste Challenge ist relativ einfach. Sie analysieren ein bereits vorhandenes .yaml-File und setzen sich mit den einzelnen Zeilen/Kommandos auseinander.

Anleitung:

Die wichtigsten Informationen zu Cloud-init und YAML finden Sie in der Theorie.

Laden Sie diese cloud-init Datei herunter. Erklären Sie alle Zeilen der Cloud-init Datei in folgendem Schema. Achtung: Viele Werte sind nicht definiert von cloud-init, sondern von Linux/Ubuntu. z.B. sudo: <sudo-Regeln>. Die Sudo-Regeln sind definiert in Linux (sudoers-file).

#cloud-config
users: # ....
 - name: ubuntu # Benutzername
   sudo: ALL=(ALL) NOPASSWD:ALL # sudo-Regeln für diesen Benutzer
   #...
   #...

Ziel der Übung

🔔 Sie verstehen die Befehlsstruktur von Cloud-init-files und können diese interpretieren und dokumentieren.

Leistungsnachweis
  • Im Cloud-init Script sind sämtliche Zeilen dokumentiert.
  • Sie verstehen die Befehle im Cloud-init Script.
  • Differenziert und nachvollziehbar im persönlichen Repository dokumentiert.
  • Fachgespräch mit Coach.

Beachten Sie ausserdem die allgemeinen Informationen zu den Abgaben.



B) SSH-Key und Cloud-init (Beginner)

Ausgangslage:

Sie wissen bereits, wie man auf AWS ein SSH Keypair erstellt und können sich mit diesem Key per SSH mit einer Instanz in der Cloud verbinden. Dieser Challenge geht nun etwas tiefer. Weil das Keypair von AWS - und nicht von Ihnen - erzeugt wurde, fehlt ihnen noch der Public-Key zu Ihrem bereits bei sich abgelegten Private Key (file.pem). Mit puttygen können Sie jederzeit den zugehörigen Public Key erzeugen. Diesen können Sie dann auf jeder beliebigen Instanz in der Cloud ablegen, um schnell darauf zuzugreifen.

Anleitung (Windows)

Anstatt, dass Sie den SSH-Key im GUI auswählen, können Sie ihn auch im Cloud-Init mitgeben. Dies werden wir folgend tun. Installieren Sie puttygen, falls Sie es noch nicht haben (unter Quellen finden Sie den Link). Extrahieren Sie den öffentlichen Schlüssel (für beide Keys) wie folgt.

Schritt 1: Putty Key Generator öffnen - Private-Key auswählen und laden
public1
Schritt 2: Putty Key Generator - Public-Key erzeugen
public1

Anleitung (Mac)

Um den öffentlichen Schlüssel aus einer RSA PEM-Datei auf einem Mac zu extrahieren, können Sie das Terminal und das openssl-Befehlszeilentool verwenden. Hier sind die Schritte:

  1. Öffnen Sie das Terminal auf Ihrem Mac. Sie finden es im Ordner "Programme" unter "Dienstprogramme" oder verwenden Sie Spotlight (Cmd + Leertaste und geben Sie "Terminal" ein).

  2. Verwenden Sie den folgenden Befehl, um den öffentlichen Schlüssel aus der RSA PEM-Datei zu extrahieren:

Option RSA : Öffentlichen RSA Schlüssel aus einer .pem-Datei extrahieren
public1
Ersetzen Sie your_rsa_key.pem durch den tatsächlichen Namen Ihrer RSA PEM-Datei
Option ECDSA : Öffentlichen ECDSA Schlüssel aus einer .pem-Datei extrahieren
public1
Ersetzen Sie your_ecdsa_key.pem durch den tatsächlichen Namen Ihrer ECDSA PEM-Datei
  1. Wenn Ihre PEM-Datei mit einem Passwort geschützt ist, werden Sie aufgefordert, das Passwort einzugeben.

    Der Befehl gibt den öffentlichen Schlüssel auf dem Bildschirm aus. Der öffentliche Schlüssel beginnt normalerweise mit "-----BEGIN PUBLIC KEY-----" und endet mit "-----END PUBLIC KEY-----".

Beispiel:
public1

Kopieren Sie den öffentlichen Schlüssel aus der Ausgabe für Ihre Verwendung. Dieser Befehl geht davon aus, dass die PEM-Datei einen privaten RSA-Schlüssel enthält (erstes Beispiel oben).


Erstellen Sie eine neue Instanz in AWS mit den folgenden Einstellungen:

  • Ubuntu 22.04

  • Bei "Key pair" verwenden Sie ihren zweiten Schlüssel.

  • Keine Änderungen bei den restlichen Einstellungen.

  • aber: verwenden Sie die cloud-init Datei und ersetzen Sie den Schlüssel mit ihrem ersten öffentlich Schlüssel. Beachten Sie das Format ssh-rsa <ihr-Schlüssel-ohne-zeilenumbrüche> random-name

    Schema

  • Sie können ihre Cloud-init Konfiguration einfach in dem Feld "user data" in der Sektion "Advanced details" reinkopieren.

    1. Hinweis: In KN02 haben Sie sich per SSH mit der laufenden EC2-Instanz verbunden und dann sämtliche Installationsschritte per Hand (imperativ) ausgeführt. Wenn Sie nun aber ihre YAML-Datei in das Feld kopieren, wird AWS sämtliche Schritte automatisch durchführen und alles ohne Handeingabe installieren.

    2. Hinweis: Stellen Sie sicher, dass die Zeile #cloud-config auch tatsächlich in der YAML-Datei steht, sonst wird der Inhalt nicht korrekt ausgeführt.

Sie haben nun aber ihren Public-Key zwei mal verwendet (einmal beim Feld "Key Pair" in der Management Console und einmal im Cloud-init Script). Ein Schlüssel wird demzufolge vom anderen Schlüssel überschrieben. Welcher von welchem?

Die beiden Bilder unten verdeutlichen nochmals, dass der Public-Key aus dem Cloud-init Script übernommen wurde (links das Cloud-init Script und rechts das authorized_keys File von der EC2-Instanz).

Denken Sie nochmals an den Ablauf beim Erstellen der EC2-Instanz. Was wurde wann eingetragen? Was ist genau passiert?

Cloud-init Script Eintrag in AWS EC2-Instanz (authorized_keys)
keypair1 keypair2

Zeigen Sie nun, dass Sie nur mit dem Key aus der Cloud-Init Datei einloggen können.

Rufen Sie nun das cloud-init-log (/var/log/cloud-init-output.log) auf und merken Sie sich den Pfad /var/log/ für zukünftige Aufträge für die Fehlerfindung.

Ziel der Übung

🔔 Verständnisaufbau für das Deployment von deklarativen Scripts und die Nutzung von Public-Keys.

Leistungsnachweis
  • Ihre angepasste Cloud-init Konfiguration als Datei im Git-Repository.
  • Ein Screenshot der Details oder Liste der Instanz, welcher den verwendeten Key zeigt.
  • Screenshot mit dem ssh-Befehl und des Resultats unter Verwendung des ersten Schlüssels.
  • Screenshot mit dem ssh-Befehl und des Resultats unter Verwendung des zweiten Schlüssels.
  • Screenshot mit dem Auszug aus dem Cloud-Init-Log.
  • Technisch nachvollziehbare Erklärung, weshalb nur einer der beiden Keys funktioniert.
  • Differenziert und nachvollziehbar im persönlichen Repository dokumentiert.
  • Fachgespräch mit Coach.

Beachten Sie ausserdem die allgemeinen Informationen zu den Abgaben.



C) Template (Beginner)

Ausgangslage:

Damit Ihr Coach / Lehrperson ebenfalls auf Ihre Instanz zugreifen kann, ergänzen Sie Ihr cloud-init Script auch mit dessen Public-Key.Dieser Auftrag ist erfüllt, wenn die Lehrperson anschliessend ohne Authentifikation auf Ihre Instanzen zugreifen kann.

Anleitung

Erstellen Sie sich ein Cloud-Init Template aufgrund der Datei aus B), welches Sie bei den folgenden Kompetenzen einsetzen.

Fügen Sie auch direkt den öffentlichen Schlüssel für Lehrpersonen hinzu, so dass die darin eingetragenen Lehrpersonen Zugriff auf Ihre Instanzen kriegen. Es ist gut möglich, dass der Public-Key Ihrer Lehrperson nicht auf der Liste ist. In diesem Fall melden Sie sich kurz bei Ihr.

Ziel der Übung

🔔 Verständnisaufbau, dass mehrere Public Keys (von diversen Benutzern) hinzugefügt werden können
...ausserdem

  • Zugriff für Coach/Lehrperson auf Ihre Instanzen
Leistungsnachweis
  • Ihr Coach kann auf eine beliebige Instanz von Ihrem Account zugreifen.
  • Differenziert und nachvollziehbar im persönlichen Repository dokumentiert.
  • Fachgespräch mit Coach.

Beachten Sie ausserdem die allgemeinen Informationen zu den Abgaben.



D) Auftrennung von Web- und Datenbankserver (Advanced)

Ausgangslage:

Früher dominierten Monolithen als vorherrschende Architektur die IT. Hierbei wurde die gesamte Anwendung als eine einzige Einheit entwickelt, getestet und bereitgestellt. Dazu gehörten neben der Hardware auch das Betriebsssystem, Storage- und Datenbankanwendungen. Dabei entstanden oftmals komplexe und untrennbare Abhängigkeiten. Wenn z.B. ein Kernel-Patch installiert wurde, musste das gesamte System heruntergefahren. Das bedeutete oft Wochenendarbeit für die IT-Mitarbeiter und Downtime für die Applikation. Mit dem Aufkommen von komplexen und skalierbaren Anforderungen haben sich deshalb Microservices als Alternative etabliert und inzwischen durchgesetzt. Microservices zerlegen die Anwendung in unabhängige, spezialisierte Dienste, was eine verbesserte Skalierbarkeit, Wartbarkeit und Flexibilität ermöglicht. Diese Verschiebung markiert einen Wandel hin zu agileren und anpassungsfähigeren Ansätzen in der heutigen Softwarelandschaft.

Anleitung

In KN02 haben Sie eine virtuelle Instanz installiert mit Web- und Datenbankserver. Sie haben sämtliche Befehle von Hand ausgeführt. Am Ende lief die gesamte Anwendung (Webserver und Datenbankserver) auf nur einer Instanz. Wenn Sie nun dieselbe Anwendung nochmals installieren, müssten Sie sämtliche Schritte wieder von Hand (imperativ) eingeben. Cloud-init hilft Ihnen die Installation zu vereinfachen/automatisieren. Man spricht dann von der deklarativen Methode und von Infrastructure as Code. Beide Begriffe werden Sie in ihrer Laufbahn als Plattformentwickler noch des öfteren hören und lesen.

Die drei wichtigsten Vorteile von Cloud-init sind:

  1. Automatisierte Bereitstellung: Cloud-init ermöglicht die automatische Konfiguration und Initialisierung von virtuellen Maschinen, wodurch die Bereitstellung beschleunigt und vereinfacht wird.
  2. Skalierbarkeit: Durch die Anwendung von identischen Konfigurationen auf mehreren Instanzen können Ressourcen leicht skaliert werden, um auf steigende Anforderungen zu reagieren.
  3. Zentrale Verwaltung und Aktualisierung: Cloud-init ermöglicht eine zentrale Verwaltung von Konfigurationen und erleichtert die Aktualisierung und Wartung von VM-Instanzen, was Konsistenz und Wartbarkeit fördert.

In der nächsten Teilaufgabe werden wir die Datenbank und den Webserver voneinander trennen in zwei Unterschiedliche Instanzen. Für beide Instanzen werden Sie zudem eine Cloud-init Datei (cloud-init-web.yaml, und cloud-init-db.yaml) erstellen.

Das folgende Schema zeigt Ihnen unsere Zielarchitektur mit den entsprechenden Ports. Beachten Sie den zusätzlichen Port, den Sie nun ebenfalls öffnen müssen (auf der richtigen Instanz).

🔖 In dieser Übung liegt das Backend ebenfalls im Public Subnet. In der Praxis werden solche Backend-Server aus Sicherheitsgründen in ein Private Subnet gelegt. Im Moment halten wir die Konfiguration simpel. Sie werden im KN05 ein eigenes VPC mit Public- und Private Subnets aufsetzen und dann mehr über diese Best Practice erfahren.

Schema

Aufgaben:

  • Lesen Sie das folgende kurz durch bevor Sie beginnen. Erstellen Sie dann zuerst den Datenbank-Server. Wenn dieser läuft und die Screenshots gemacht wurden, erstellen Sie den Web-Server. Wichtig: Der Datenbank-Server muss laufen, bevor Sie den Webserver installieren. Sie brauchen im Script des Webservers (Frontend) die Interne IP-Adresse des Datenbank-Servers für die Verbindung zwischen Front- und Backend (Port 3306).
  • Installieren Sie die gleichen Pakete wie in KN02 via Cloud-Init. Verteilen Sie die Pakete korrekt auf die beiden Cloud-init Dateien. Dazu müssen Sie überlegen und genau verstehen, welche Befehle für welchen Dienst genutzt werden.
  • In KN02 hatten Sie Dateien via GIT geklont und dann an die Zielorte kopiert. Sie gehen nun ein wenig anders vor. Sie verwenden die write_files-Anweisung von Cloud-init, um Dateien zu erstellen. Sie finden in der Doku zu Cloud-init: Write Files weitere Informationen. Sie können die Datei-Inhalte vom letzten Auftrag KN02/C) kopieren.
  • In KN02 hatten Sie verschiedene Befehle ausführen müssen. Verwenden Sie die runcmd-Anweisung von Cloud-init, um Befehle auszuführen. Sie müssen natürlich nur noch die Befehle ausführen, die in den vorherigen Punkten nicht abgedeckt sind.
  • Führen Sie den folgenden Befehl noch zusätzlich aus: sudo sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/mariadb.conf.d/50-server.cnf. Dieser Befehl ändert die Konfigurationsdatei der Datenbank und lässt externe Verbindungen zu. In der Vorlage (cloud-init-db_Vorlage.yaml), ist der Anfang auf Zeile 19 bereits eingetragen).
  • Fügen Sie das Paket adminer hinzu. Adminer bietet eine GUI, um Datenbanken zu administrieren. Sie müssen anschliessend die beiden folgenden Befehle ausführen (Die entsprechende Cloud-init-Anweisung kennen Sie bereits):
    1. sudo a2enconf adminer. Dies fügt die Konfiguration für das Paket adminer der apache Config hinzu. In der Vorlage (cloud-init-web_Vorlage.yaml), ist der Anfang auf Zeile 45 bereits eingetragen.
    2. Starten Sie den Apache Service neu.

Templates für die IaC-Files

  • Als Hilfe dienen Ihnen die beiden IaC-Script-Vorlagen (unten). Sie können diese downloaden und wo nötig ergänzen.
  • Erklären Sie im Script oder in Ihrer Doku jede einzelne Zeile (Text nach einem Hashtag # wird als Text interpretiert).
  • Achten Sie auch auf die Zeileneinzüge (Indendations). Diese sind in den Vorlagen korrekt - daran müssen Sie nichts ändern. Bedenken Sie aber, dass sie in YAML-Files zu Fehlern führen, wenn sie nicht korrekt sind.
    IaC Vorlage cloud-init-db.yaml IaC Vorlage cloud-init-web.yaml
    cloud-init-db cloud-init-web

Ziel der Übung

🔔 Verständnisaufbau für das Erstellen und Anwenden von Cloud-init Scripts (IaC)
...ausserdem

  • Bedeutung der Aufteilung von Services auf verschiedene Instanzen und deren Vorteile
Leistungsnachweis
  • Differenziert und nachvollziehbar im persönlichen Repository dokumentiert.
  • Fachgespräch mit Coach.

...sowie folgende Punkte

  • Beweisführung DB Server
  1. Verbinden Sie sich mit dem Server (Shell) und zeigen Sie, dass, die Datenbankverbindung mit dem Benutzer admin funktioniert. Der Befehl dazu lautet mysql -u admin -p. Sie müssen dann anschliessend das Passwort eingeben. Erstellen Sie einen Screenshot, der den Befehl und die CLI von mysql zeigt.

  2. Von ihrem lokalen System zeigen Sie, dass Sie von extern auf den Datenbank Server zugreifen können. Verwenden Sie dazu telnet mit dem Befehl telnet <IP> 3306. Erstellen Sie einen Screenshot des Befehls und des Resultats. Sie können den Telnet-Client über die Windows-Features aktivieren. Wenn Sie kryptische Zeichen als Antwort bekommen, funktioniert der Zugriff. Telnet

  3. Fügen Sie die Cloud-Init-Datei im Git-Repository hinzu.

  • Beweisführung Webserver
  1. Rufen Sie die Seiten index.html, info.php und db.php auf und erstellen Sie einen Screenshot der URL und des Inhalts.

  2. Rufen Sie Adminer auf (http://ihre-ip/adminer/), verbinden Sie sich mit dem DB-Server und zeigen Sie mit Screenshots, dass die Verbindung funktioniert. Adminer

    ...danach Zugriff auf die Datenbank Adminer

  3. Fügen Sie die Cloud-Init-Datei im Git-Repository hinzu.

Beachten Sie ausserdem die allgemeinen Informationen zu den Abgaben.

Häufige Fehlerquellen

  • Sie vergessen die erste Zeile in der Cloud-init Datei #cloud-config. Diese ist notwendig!
  • Einrückungen wurden nicht korrekt erstellt. Das Format können Sie hier überprüfen: https://www.yamllint.com/.
  • Sie können auf dem Server die Log-Datei für Fehler durchsuchen: /var/log/cloud-init-output.log
  • Das Format des SSH-Schlüssels ist falsch. Korrekt ist: ssh-key XXXXXXXXXX aws-key.


Quellen

puttygen: Puttygen download



Zurück zu KN03


Zurück zur Hauptseite