[10]: https://git-scm.com/downloads
![TBZ Banner](../../x_gitres/tbz_logo.png)
# Inhaltsverzeichnis KN02 Challenge A)
### Zweiter Teil-Challenge
[TOC]
## Ausgangslage:
Verwenden Sie für den folgenden Teil-Challenge das AWS Academy *"**Learner Lab**"*. Ab jetzt arbeiten Sie **immer** im **Learner Lab** - **Ausser explizit anders angegeben.**
- Der **zweite** Teil-Challenge von **KN02 A)** heisst **S3 Einstieg**. Dieses Lab ist der zweite Kompetenznachweis von Challenge **A)**. Sie richten zuerst ihren ersten **S3-Bucket** ein und erstellen eine **Bucket Policy** für entsprechende Zugriffsberechtigungen. Danach legen Sie darin eine **index.html**-Webseite ab, auf die Sie von überall aus der Welt zugreifen können (statischer Webserver).
- Führen Sie dieses Lab durch und achten Sie auf die jeweiligen Punkte unter **Leistungsnachweis** des [KN02 Hauptauftrages](../KN02.md#2-teil-challenge-s3-einstieg) unter Challenge A
Beachten Sie die [allgemeinen Informationen zu den Abgaben](../Abgaben.md).
## Challenge
### 2. Teil-Challenge: S3 Einstieg
Führen Sie alle Tasks durch. Sie erstellen die Screenshots der verschiedenen Bereiche für Ihre Abgabe **nachdem** Sie **alle** Schritte des Challenges durchgeführt haben.
#### 1. Task: Erstellen eines S3-Buckets
**:radio_button: Schritt 1: S3-Dienst auswählen**
- Wählen Sie im **Services**-Menü den Bereich **Storage services** und dann **S3**.
**:radio_button: Schritt 2: Bucket erstellen**
- Wählen Sie auf der rechten Seite der Seite **Create bucket**.
**:radio_button: Schritt 3: Bucket-Namen festlegen**
- Geben Sie für **Bucket name** einen eindeutigen, den Regeln des Domain Name Systems (DNS) entsprechenden Namen für Ihren neuen Bucket ein.
**:pushpin: Hinweis zu Namensrichtlinien:**
- Der Name muss eindeutig sein und darf nicht mit bereits bestehenden Bucket-Namen in Amazon S3 übereinstimmen.
- Der Name darf nur Kleinbuchstaben enthalten.
- Der Name muss mit einem Buchstaben oder einer Zahl beginnen.
- Der Name muss zwischen 3 und 63 Zeichen lang sein.
- Nachdem Sie den Bucket erstellt haben, können Sie den Namen nicht mehr ändern, daher wählen Sie ihn sorgfältig aus.
- Wählen Sie einen Bucket-Namen, der den Inhalt des Buckets widerspiegelt, da der Name im URL-Pfad der Objekte sichtbar ist, die Sie in Ihren Bucket hochladen.
**:radio_button: Schritt 4: Region auswählen**
- Wählen Sie eine **Region** aus, in der Ihr Bucket gespeichert werden soll.
**:pushpin: Hinweis:**
- Wählen Sie eine Region in Ihrer Nähe, um Latenz und Kosten zu minimieren oder um regulatorische Anforderungen zu erfüllen. Objekte, die in einer Region gespeichert sind, verlassen diese Region nur, wenn Sie sie ausdrücklich in eine andere Region verschieben.
**:radio_button: Schritt 5: Öffentlichen Zugriff konfigurieren**
- Deaktivieren Sie die Option **Block all public access**, da Sie testen möchten, ob die Website funktioniert.
**:pushpin: Hinweis:**
- Eine Warnmeldung wie **Turning off block all public access might result in this bucket and the objects within becoming public** erscheint unter der Sicherheitsoption, die Sie deaktiviert haben.
- Aktivieren Sie das Kontrollkästchen neben **I acknowledge that...**.
**:radio_button: Schritt 6: Bucket erstellen**
- Scrollen Sie zum unteren Ende der Seite und wählen Sie **Create bucket**.
- Ihr neuer Bucket erscheint in der **Buckets**-Liste.
#### 2. Task: Eine Bucket-Richtlinie hinzufügen, um den Inhalt öffentlich zugänglich zu machen
**:radio_button: Schritt 7: Bucket auswählen und Berechtigungen öffnen**
- Wählen Sie den Link mit dem Namen Ihres Buckets und gehen Sie dann zum Tab **Permissions**.
**:radio_button: Schritt 8: Bucket-Richtlinie bearbeiten**
- Wählen Sie im Abschnitt **Bucket policy** die Option **Edit**.
**:radio_button: Schritt 9: Richtlinie einfügen**
- Um öffentlichen Lesezugriff für Ihre Website zu gewähren, kopieren Sie die folgende Bucket-Richtlinie und fügen Sie sie in den Richtlinieneditor ein:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::example-bucket/*"
]
}
]
}
```
**:radio_button: Schritt 10: Bucket-Namen anpassen**
- Ersetzen Sie in der Richtlinie `example-bucket` durch den Namen Ihres eigenen Buckets.
**:radio_button: Schritt 11: Änderungen speichern**
- Wählen Sie **Save changes**, um die Richtlinie zu speichern.
#### 3. Task: Hochladen eines HTML-Dokuments
In dieser Aufgabe laden Sie ein HTML-Dokument in Ihren neuen Bucket hoch.
**:radio_button: Schritt 12: HTML-Datei herunterladen**
- Öffnen Sie das Kontextmenü (Rechtsklick) für den folgenden Link und wählen Sie **Link speichern unter**: `index.html`.
- Speichern Sie die Datei `index.html` auf Ihrem lokalen Computer.
**:radio_button: Schritt 13: Datei in den S3-Bucket hochladen**
- Wählen Sie in der Konsole den Tab **Objects**.
- Laden Sie die Datei `index.html` in Ihren Bucket hoch:
- Wählen Sie **Upload**.
- Ziehen Sie die Datei `index.html` auf die Upload-Seite.
- Alternativ können Sie **Add files** wählen, zur Datei navigieren und **Open** auswählen.
**:radio_button: Schritt 14: Eigenschaften überprüfen**
- Erweitern Sie den Abschnitt **Properties**.
**:pushpin: Hinweis:**
- In diesem Abschnitt werden die in Amazon S3 verfügbaren Speicherklassen aufgelistet. Sie werden später mehr über die Speicherklassen erfahren, aber nehmen Sie sich einen Moment Zeit, um sie sich anzusehen.
**:radio_button: Schritt 15: Speicherklasse überprüfen**
- Stellen Sie sicher, dass die **Standard**-Speicherklasse ausgewählt ist.
**:radio_button: Schritt 16: Upload abschließen**
- Wählen Sie unten auf der Seite **Upload**.
- Wählen Sie **Close**.
**:bookmark: Ergebnis:**
- Die Datei `index.html` erscheint in der **Objects**-Liste.
#### 3. Task: Testen Ihrer Website
**:radio_button: Schritt 17: Eigenschaften öffnen**
- Wählen Sie den Tab **Properties** und scrollen Sie zum Abschnitt **Static website hosting**.
**:radio_button: Schritt 18: Statische Website aktivieren**
- Wählen Sie **Edit**.
- Wählen Sie **Enable**.
- Geben Sie im Textfeld **Index document** `index.html` ein.
- Wählen Sie **Save changes**.
**:radio_button: Schritt 19: Website-URL kopieren**
- Scrollen Sie erneut zum Abschnitt **Static website hosting** und kopieren Sie die **Bucket-Website-Endpoint-URL** in die Zwischenablage.
**:radio_button: Schritt 20: Website testen**
- Öffnen Sie einen neuen Tab in Ihrem Webbrowser, fügen Sie die kopierte URL ein und drücken Sie **Enter**.
- Die **Hello World**-Webseite sollte angezeigt werden. Sie haben erfolgreich eine statische Website mit einem S3-Bucket gehostet!
#### Lab abgeschlossen
Herzlichen Glückwunsch! Sie haben das Lab abgeschlossen.
**:radio_button: Schritt 21: Abmelden von der AWS Management Console**
- Melden Sie sich von der AWS Management Console ab.
- Klicken Sie in der oberen rechten Ecke der Seite auf Ihren Benutzernamen
- Wählen Sie **Sign out**.
**:radio_button: Schritt 22: Labor beenden**
- Wählen Sie **End Lab** im **Learner Lab** und bestätigen Sie mit **Yes**, dass Sie das Labor beenden möchten.
#### Ziel der Übung
:bell: Erste Hands-on Erfahrung mit dem AWS Service **EC2** (Elastic Compute Cloud)
##### Leistungsnachweis
- [ ] HTML-Seite, inkl. URL
- [ ] Liste der EC2-Instanzen
- [ ] Details der *Web Server*-Instanz (öffentliche IP sichtbar)
- [ ] Security-Group: Liste der Inbound-Regeln.
Beachten Sie ausserdem die [allgemeinen Informationen zu den Abgaben](../../Abgaben.md).
#### b) 2. Lab - S3 Einstieg
Führen Sie alle Schritte durch. Sie erstellen die Screenshots der verschiedenen Bereiche für Ihre Abgabe **nachdem** Sie **alle** Schritte des Challenges durchgeführt haben.
#### Ziel der Übung
:bell: Erste Hands-on Erfahrung mit dem AWS Service **S3** (Object Storage)
##### Leistungsnachweis
- [ ] Liste der Buckets.
- [ ] HTML-Seite, inkl. URL.
- [ ] Liste der Dateien im Bucket.
- [ ] Eigenschaften von "Static website hosting".
Beachten Sie ausserdem die [allgemeinen Informationen zu den Abgaben](../../Abgaben.md).
----
ALLES WAS HIER KOMMT, AM ENDE LÖSCHEN
### B) Zugriff mit SSH-Key
#### Ausgangslage:
Wechseln Sie nun den Kurs und verwenden Sie *"**Learner Lab**"*. Ab jetzt arbeiten Sie **immer** im **Learner Lab** - **Ausser explizit anders angegeben.**
Unter [Quellen](./KN02.md#quellen) finden Sie ein Dokument, welches die Unterschiede zwischen Passwort und SSH-Key beschreibt. Lesen Sie sich **kurz** ein, wenn Sie möchten. Wir werden grundsätzlich **kein Passwort** verwenden, sondern **immer** SSH Keys.
Sie werden nun gemäss der folgenden Anleitung eine EC2-Instanz und **zwei** Keypairs erstellen. Danach weisen Sie dieser EC2-Instanz einen der beiden Key pair Namen zu. Sobald die Instanz verfügbar ist, überprüfen Sie, ob Sie sich mit beiden Keys darauf einloggen können.
#### Anleitung:
Erstellen Sie nun eine neue **Ubuntu**-Instanz in AWS mit den Standard-Einstellungen und erstellen Sie dann **zwei Key pairs** wie folgt:
- Ubuntu Server 22.04 AMI (Amazon Machine Image) auswählen.
- Achten auf **Free tier eligible**.
Auswahl AMI (Amazon Machine Image), **Free tier eligible** |
:-------------------------:|
![keypair1](./x_res/02_os_800.png) |
- Bei "Key pair" erstellen Sie **zwei** Key-Value Pairs! Geben Sie Namen wie **\-1** und & **\-2**.
Create new Key pair | Felder ausfüllen / anwählen
:-------------------------:|:-------------------------:
![keypair1](./x_res/01a_Keypair_400.png) | ![keypair2](./x_res/01b_Keypair_400.png)
- Stellen Sie sicher, dass Sie **beide Schlüssel** herunterladen.
- Nachdem beide Keys erstellt wurden, wählen Sie bei "Key pair" dann den **ersten** Key aus. Belassen sie die restlichen Parameter so wie sie bereits eingestellt sind. Scrollen Sie bis ganz nach unten und klicken Sie auf **Launch instance**.
Speicherort der privaten (und öffentlichen) Schlüssel muss ein Pfad sein, der eingeschränkte Rechte hat (nur Ihr persönlicher Account). Normalerweise wird der Pfad `C:\Users\\.ssh` verwendet.
Der Befehl für den Zugriff sieht nun folgendermassen aus. Der Parameter -o verhindert, dass Sie ein Timeout kriegen.
---
```bash
ssh @ -i \.pem -o ServerAliveInterval=30
# Standard-Benutzername ist ubuntu!
# Beispiel: ssh ubuntu@121.12.3.1 -i c:\Users\calisto\.ssh\Calisto-1.pem -o ServerAliveInterval=30
```
---
Zeigen Sie, dass sie sich **nur** mit **dem ausgewählten** Schlüssel einloggen können.
**Hinweis**: AWS speichert ihren privaten Schlüssel **nicht**. Sie können den nicht wiederherstellen. Auf dem Ubuntu-Server liegt immer nur der öffentliche Schlüssel. Seien Sie also vorsichtig und verlieren Sie den Schlüssel nicht.
#### Ziel der Übung
:bell: Sie verstehen, wie Key pairs erstellt und angewendet werden. Einer wird nicht funktionieren. Überlegen Sie sich, weshalb das so ist und wie die Authentifizierung durchgeführt wird. Wo werden die Keys (Private / Public) abgelegt?
##### Leistungsnachweis
- [ ] 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 der Instanz-Detail (oder Liste), so dass der verwendete Schlüssel sichtbar ist.
- [ ] Differenziert und nachvollziehbar im persönlichen Repository dokumentiert.
- [ ] Fachgespräch mit Coach.
Beachten Sie ausserdem die [allgemeinen Informationen zu den Abgaben](../Abgaben.md).
----
### C) Installation von Web- und Datenbankserver
#### Ausgangslage:
Via SSH auf EC2-Instanz zugreifen und sämtliche Kommandos für das Setup des Webservers mit DB-Zugriff **manuell** (imperativ) der Reihe nach ausführen.
Verwenden Sie die Instanz aus Aufgabe B) und gehen Sie wie folgt vor:
#### Ports checken, Rule ergänzen (Security Group)
- Stellen Sie sicher, dass die dazu notwendigen Ports in der ausgewählten Security-Group offen sind:
- 22 für SSH Zugriff (sollte bereits vorhanden sein)
- 80 für HTTP Zugriff (dazu müssen sie in der ausgewählten Security Group noch eine Inbound rule erstellen - gleich wie beim ersten Lab, siehe Bild unten)
Inbound rule für HTTP hinzufügen |
:-------------------------:|
![keypair1](./x_res/02_sg_http_800.png) |
#### SSH-Verbindung aufbauen
- Bauen Sie von Ihrem Laptop aus eine SSH-Verbindung auf Ihre EC2-Instanz auf (via Terminalfenster auf ihrem Laptop mit SSH auf die EC2-Instanz zugreifen). Kommandos auf Ihrer EC2-Instanz der letzten Übung auszuführen:
**1.** Connect to instance | **2.** SSH Client auswählen
:-------------------------:|:-------------------------:
![connect1](./x_res/03d_connect_400.png) | ![connect2](./x_res/03e_connect_400.png)
- Führen Sie wie folgt sämtliche Kommandos für das Setup des Webservers mit DB-Zugriff **manuell** (imperativ) der Reihe nach aus.
- `sudo apt update` auf. Dieser Befehl aktualisiert die Pakete/Software.
- `sudo apt install apache2`. Dieser Befehl installiert den Apache Webserver.
- `sudo apt install php`. Dieser Befehl installiert den PHP Applikationsserver.
- `sudo apt install libapache2-mod-php`. Dieser Befehl installiert die PHP-Erweiterung für Apache.
- `sudo apt install php-mysqli`. Dieser Befehlt installiert das PHP-Modul, um Datenbank-Abfragen zu erstellen.
- `sudo apt install mariadb-server`. Dieser Befehl installiert den Datenbankserver.
- `sudo mysql -sfu root -e "GRANT ALL ON *.* TO 'admin'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;"`.
- `sudo systemctl restart mariadb.service`. Dieser Befehl startet den DB Server neu.
- `sudo systemctl status mariadb.service`. Dieser Befehl checkt, ob der DB Server läuft. Falls Anzeige grün **active (running)**, dann ok.
- `sudo systemctl restart apache2`. Dieser Befehl startet den Webserver neu.
- `sudo systemctl status apache2`. Dieser Befehl checkt, ob der Webserver läuft. Falls Anzeige grün **active (running)**, dann ok.
- `cd ~`. Dieser Befehl stellt sicher, dass Sie sich in ihrem Home-Verzeichnis befinden
- `git clone https://gitlab.com/ser-cal/m346-scripts.git`. Diesen Befehl sollten Sie bereits beherrschen.
- `sudo cp ./m346-scripts/KN01/*.php /var/www/html/`. Dieser Befehl kopiert die beiden PHP-Dateien in das Verzeichnis des Webservers.
- Rufen Sie von ihrem Rechner nun die folgenden Seiten auf:
- *http://[Ihre-IP]/index.html*. Diese URL zeigt ihnen die Informationen von Apache an. Wenn die Seite funktioniert, zeigt dies, dass Apache installiert wurde und funktioniert.
- *http://[Ihre-IP]/info.php*. Diese URL zeigt ihnen die Informationen von PHP an. Wenn diese Seite funktioniert, zeigt dies, dass das PHP-Modul funktioniert und Sie nun dynamische Seiten hosten können.
- *http://[Ihre-IP]/db.php*. Diese URL zeigt ihnen die Datenbank-Benutzer. Wenn diese Seite funktioniert, zeigt es Ihnen, dass die Datenbank-Verbindung funktioniert.
#### Ziel der Übung
:bell: **Verständnisaufbau** für den Unterschied zwischen **imperativer** und **deklarativer** Plattformentwicklung.
Bei dieser Übung setzen Sie auf einer bestehenden EC2-Instanz einen Webserver mit Datenbankanbindug auf. Sie installieren dazu **imperativ** (Eingabe einzelner Kommandos per Tastatur) folgende Software:
- Apache Webserver
- PHP und PHP-Erweiterung für Apache
- PHP-Modul für Datenbankabfragen
- Datenbankserver (MariaDB)
...des weiteren:
- erstellen Sie einen DB-Benutzer (inkl. Passwort)
- restarten anschliessend den DB-Server
- ...und den den Webserver
Alle Commands schön der Reihe nach, sonst gibt es Probleme. Falls Sie **100** weitere Instanzen so aufsetzen müssten, würden Sie sämtliche Schritte 100x wiederholen :grimacing:. Gut also, dass das **imperative** Vorgehen vom **deklarativen** Vorgehen - auch **IaC** (Infrastructure as Code) genannt - abgelöst wird. Wie das geht, erfahren Sie schon bald :smiley:.
##### Leistungsnachweis
- [ ] Erstellen Sie Screenshots der **drei** Webseiten (mit sichtbaren URLs).
- [ ] Differenziert und nachvollziehbar im persönlichen Repository dokumentiert.
- [ ] Fachgespräch mit Coach.
Beachten Sie ausserdem die [allgemeinen Informationen zu den Abgaben](../Abgaben.md).
##### Beispiel-Abgabe:
- Screenshots der drei URLs:
Apache | PHP | DB-User
:---:|:---:|:---:|
![Apache](./x_res/03a_apache_300.png) | ![PHP](./x_res/03b_apache_300.png) | ![User](./x_res/03c_user_300.png)
---
### Quellen
Thorntech: [Passwords vs. SSH keys - what's better for authentication?](https://thorntech.com/passwords-vs-ssh)
---
> [⇧ **Zurück zu KN02**](./Readme.md)
---
> [⇧ **Zurück zur Hauptseite**](https://gitlab.com/ser-cal/M346)
---