Entwicklungsumgebung

1. Übersicht

In diesem Lab werden Funktionen und Möglichkeiten vorgestellt, mit denen Softwareentwickler den Entwicklungsworkflow für die Entwicklung von Python-Anwendungen in einer Containerumgebung optimieren können. Bei der typischen Containerentwicklung muss der Nutzer die Details von Containern und den Container-Build-Prozess genau kennen. Außerdem müssen Entwickler in der Regel den Ablauf unterbrechen, um ihre Anwendungen in Remote-Umgebungen zu testen und zu debuggen. Mit den in dieser Anleitung erwähnten Tools und Technologien können Entwickler effektiv mit Containeranwendungen arbeiten, ohne ihre IDE zu verlassen.

58a4cdd3ed7a123a.png

Was ist Cloud Workstations?

Cloud Workstations bietet verwaltete Entwicklungsumgebungen in Google Cloud mit integrierter Sicherheit und vorkonfigurierten, aber anpassbaren Entwicklungsumgebungen. Sie können über eine browserbasierte IDE, mehrere lokale Codeeditoren (z. B. VSCode oder JetBrains IDEs wie IntelliJ IDEA Ultimate und PyCharm Professional) oder über SSH auf Cloud Workstations zugreifen.

Cloud Workstations verwendet die folgenden Ressourcen:

  • Administratoren erstellen Workstationcluster.
  • In jedem Workstationcluster erstellen Administratoren eine oder mehrere Workstationkonfigurationen, die als Vorlagen für Workstations dienen.
  • Entwickler können Workstations erstellen, die Entwicklungsumgebungen definieren, die eine Cloud IDE, Sprachtools, Bibliotheken usw. bereitstellen.

Mit Cloud Workstations können IT- und Sicherheitsadministratoren ihre Entwicklungsumgebungen ganz einfach bereitstellen, skalieren, verwalten und schützen. Entwickler haben außerdem die Möglichkeit, mit einheitlichen Konfigurationen und anpassbaren Tools auf Entwicklungsumgebungen zuzugreifen.

Cloud Workstations verbessert den Sicherheitsstatus Ihrer Anwendungsentwicklungsumgebungen und trägt so dazu bei, die Sicherheit nach links zu verschieben. Es verfügt über Sicherheitsfunktionen wie VPC Service Controls, privater ein- oder ausgehender Traffic, erzwungene Image-Updates und Zugriffsrichtlinien für Identity and Access Management.

Was ist Cloud Code?

Cloud Code bietet IDE-Unterstützung für den gesamten Entwicklungszyklus von Kubernetes- und Cloud Run-Anwendungen, vom Erstellen und Anpassen einer neuen Anwendung von Beispielvorlagen bis hin zur Ausführung der fertigen Anwendung. Cloud Code unterstützt Sie dabei mit sofort einsatzbereiten Beispielen, sofort einsatzbereiten Konfigurations-Snippets und einer maßgeschneiderten Fehlerbehebung. Dadurch wird die Entwicklung mit Kubernetes und Cloud Run erheblich einfacher.

Hier sind einige der Cloud Code-Features:

  • Kontinuierlich Anwendungen erstellen und ausführen
  • Fehler beim Support für die Kubernetes-Anwendung in der Entwicklung beheben
  • Streamen und Ansehen von Logs

Weitere Informationen zu anderen Cloud Code-Features

Lerninhalte

In diesem Lab lernen Sie Methoden für die Entwicklung mit Containern in GCP kennen, darunter:

  • Cloud Workstations prüfen
  • Workstation starten
  • Cloud Code überprüfen
  • Fehlerbehebung in Kubernetes

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Projektteilnehmer. Es handelt sich um eine Zeichenfolge, die von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich. Sie kann nach dem Festlegen nicht mehr geändert werden. Die Cloud Console generiert automatisch einen eindeutigen String. ist Ihnen meist egal, was es ist. In den meisten Codelabs musst du auf die Projekt-ID verweisen, die üblicherweise als PROJECT_ID gekennzeichnet ist. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine weitere zufällige ID erstellen. Alternativ können Sie einen eigenen verwenden und nachsehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information gibt es noch einen dritten Wert, die Projektnummer, die von manchen APIs verwendet wird. Weitere Informationen zu allen drei Werten finden Sie in der Dokumentation.
  1. Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Cloud-Ressourcen/APIs verwenden zu können. Dieses Codelab sollte möglichst wenig kosten. Wenn Sie Ressourcen herunterfahren möchten, um über diese Anleitung hinaus keine Kosten zu verursachen, können Sie die von Ihnen erstellten Ressourcen oder das gesamte Projekt löschen. Neue Google Cloud-Nutzer haben Anspruch auf eine kostenlose Testversion mit 300$Guthaben.

Umgebung einrichten

Legen Sie in Cloud Shell Ihre Projekt-ID und die Projektnummer für Ihr Projekt fest. Speichern Sie sie als Variablen des Typs PROJECT_ID und PROJECT_ID.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
    --format='value(projectNumber)')

In diesem Lab stellen Sie Code in GKE bereit. Außerdem verwenden Sie Cloud-Workstations als IDE.

Mit dem Einrichtungsskript unten wird diese Infrastruktur für Sie vorbereitet.

  1. Laden Sie das Setup-Skript herunter und machen Sie es ausführbar.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/setup_with_cw.sh
chmod +x setup_with_cw.sh
  1. Öffne die Datei „setup_with_cw.sh“ und bearbeite die Werte für Passwörter, die derzeit auf CHANGEME festgelegt sind
  2. Führen Sie das Setupskript aus, um einen GKE-Cluster zu erstellen, den Sie in diesem Lab verwenden werden. Diese Einrichtung dauert etwa 20 Minuten.
./setup_with_cw.sh &
  1. Öffnen Sie Cloud Workstations in der Cloud Console. Warten Sie, bis der Cluster den Status READY hat, bevor Sie mit den nächsten Schritten fortfahren.
  2. Wenn die Verbindung zu Ihrer Cloud Shell-Sitzung getrennt wurde, klicken Sie auf „Wieder verbinden“. und führen Sie dann den Befehl „gcloud cli“ aus, um die Projekt-ID festzulegen. Ersetzen Sie die Beispiel-Projekt-ID unten durch Ihre Qwiklabs-Projekt-ID, bevor Sie den Befehl ausführen.
gcloud config set project qwiklabs-gcp-project-id
  1. Laden Sie das folgende Skript herunter und führen Sie es im Terminal aus, um die Cloud Workstations-Konfiguration zu erstellen.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/workstation_config_setup.sh
chmod +x workstation_config_setup.sh
./workstation_config_setup.sh

Cloud Workstations-Cluster und -Konfiguration

Öffnen Sie Cloud Workstations in der Cloud Console. Prüfen Sie, ob der Cluster den Status READY hat.

305e1a3d63ac7ff6.png

Prüfen Sie den Status für vorhandene Konfigurationen.

2e23c2e9983d1ccf.png

Erstellen Sie eine neue Workstation.

a53adeeac81a78c8.png

Ändern Sie den Namen in my-workstation und wählen Sie die vorhandene Konfiguration aus: codeoss-python.

f052cd47701ec774.png

Workstation starten

  1. Starten und starten Sie die Workstation. Es dauert einen Moment, bis die Workstation gestartet wird.

682f8a307032cba3.png

  1. Du kannst Cookies von Drittanbietern zulassen, indem du auf das Symbol in der Adressleiste klickst. 1b8923e2943f9bc4.png

fcf9405b6957b7d7.png

  1. Klicken Sie auf „Website funktioniert nicht?“.

36a84c0e2e3b85b.png

  1. Klicke auf „Cookies zulassen“.

2259694328628fba.png

  1. Sobald die Workstation gestartet wurde, wird Code OSS IDE angezeigt.

Klicken Sie auf „Als erledigt markieren“. auf der Seite „Erste Schritte“.

94874fba9b74cc22.png

3. Cloud Code – Übersicht

Sehen Sie sich verschiedene Abschnitte in Cloud Code an.

  • Kubernetes-Entwicklung: Sie erhalten eine vollständig integrierte Entwicklungs- und Debuggingumgebung für Kubernetes in Ihrer IDE. Erstellen und verwalten Sie Cluster direkt in der IDE.
  • Fehler in ausgeführten Anwendungen beheben Beheben Sie Fehler im Code in Ihren IDEs mit Cloud Code for VS Code und Cloud Code for IntelliJ, indem Sie die integrierten IDE-Debugging-Funktionen nutzen.
  • Informationen zu Bereitstellungen Sehen Sie sich zugrunde liegende Ressourcen und Metadaten für Ihre Kubernetes-Cluster und Cloud Run-Dienste an. Sie können eine Beschreibung abrufen, Logs ansehen, Secrets verwalten oder ein Terminal direkt in einem Pod abrufen.
  • Lokale Entwicklung mit Kubernetes vereinfachen. Cloud Code für IDEs verwendet beliebte Tools wie Skaffold, Jib und kubectl, um in Echtzeit kontinuierliches Feedback zu Ihrem Code zu geben.

e4e89eea9ff45dff.png

In Google Cloud anmelden

  1. Klicken Sie auf das Cloud Code-Symbol und wählen Sie „In Google Cloud anmelden“ aus:

1769afd39be372ff.png

  1. Klicken Sie auf „Zur Anmeldung fortfahren“.

923bb1c8f63160f9.png

  1. Prüfen Sie die Ausgabe im Terminal und öffnen Sie den Link:

517fdd579c34aa21.png

  1. Melden Sie sich mit den Anmeldedaten Ihrer Qwiklabs-Teilnehmer an.

db99b345f7a8e72c.png

  1. Wählen Sie „Zulassen“ aus:

a5376553c430ac84.png

  1. Kopieren Sie den Bestätigungscode und kehren Sie zum Tab „Workstation“ zurück.

6719421277b92eac.png

  1. Füge den Bestätigungscode ein und drücke die Eingabetaste.

e9847cfe3fa8a2ce.png

Klicken Sie auf „Zulassen“. um diese auf die Workstation zu kopieren und einzufügen.

58149777e5cc350a.png

4. Neue Python-Startanwendung erstellen

In diesem Abschnitt erstellen Sie eine neue Python-Anwendung.

  1. Öffnen Sie ein neues Terminal.

c31d48f2e4938c38.png

  1. Neues Verzeichnis erstellen und als Arbeitsbereich öffnen
mkdir music-service && cd music-service

code-oss-cloud-workstations -r --folder-uri="$PWD"
  1. Erstellen Sie eine Datei mit dem Namen requirements.txt und kopieren Sie den folgenden Inhalt in diese Datei

789e8389170bd900.png

Flask
gunicorn
ptvsd==4.3.2
  1. Erstellen Sie eine Datei mit dem Namen app.py und fügen Sie den folgenden Code in diese ein
import os
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/")
def hello_world():
    message="Hello, World!"
    return message

if __name__ == '__main__':
    server_port = os.environ.get('PORT', '8080')
    app.run(debug=False, port=server_port, host='0.0.0.0')

  1. Erstellen Sie eine Datei mit dem Namen Dockerfile und fügen Sie Folgendes ein:
FROM python:3.8
ARG FLASK_DEBUG=0
ENV FLASK_DEBUG=$FLASK_DEBUG
ENV FLASK_APP=app.py
WORKDIR /app
COPY requirements.txt .
RUN pip install --trusted-host pypi.python.org -r requirements.txt
COPY . .
ENTRYPOINT ["python3", "-m", "flask", "run", "--port=8080", "--host=0.0.0.0"]

Hinweis: Mit FLASK_DEBUG=1 können Sie Codeänderungen an einer Python flask-Anwendung automatisch neu laden. Mit diesem Dockerfile können Sie diesen Wert als Build-Argument übergeben.

Manifeste generieren

Führen Sie in Ihrem Terminal den folgenden Befehl aus, um einen Standardwert für skaffold.yaml und deployment.yaml zu generieren

  1. Initialisieren Sie Skaffold mit dem folgenden Befehl
skaffold init --generate-manifests

Wenn Sie dazu aufgefordert werden, bewegen Sie den Cursor mit den Pfeilen und die Leertaste, um die gewünschten Optionen auszuwählen.

Wählen Sie aus:

  • 8080 für den Anschluss
  • y zum Speichern der Konfiguration

Skaffold-Konfigurationen aktualisieren

  • Standard-App-Namen ändern
  • skaffold.yaml öffnen
  • Wählen Sie den Image-Namen aus, der derzeit als dockerfile-image festgelegt ist
  • Klicken Sie mit der rechten Maustaste und wählen Sie „Alle Vorkommen ändern“ aus.
  • Geben Sie den neuen Namen als python-app ein.
  • Bearbeiten Sie den Build-Abschnitt weiter,
  • docker.buildArgs hinzufügen, um FLASK_DEBUG=1 zu bestehen
  • Einstellungen synchronisieren, um Änderungen an *.py-Dateien aus der IDE in den laufenden Container zu laden

Nach der Bearbeitung sieht der Build-Abschnitt in der Datei skaffold.yaml so aus:

build:
 artifacts:
 - image: python-app
   docker:
     buildArgs:
       FLASK_DEBUG: "1"
     dockerfile: Dockerfile
   sync:
     infer:
     - '**/*.py'

Kubernetes-Konfigurationsdatei ändern

  1. Standardnamen ändern
  • Datei „deployment.yaml“ öffnen
  • Wählen Sie den Image-Namen aus, der derzeit als dockerfile-image festgelegt ist
  • Klicken Sie mit der rechten Maustaste und wählen Sie „Alle Vorkommen ändern“ aus.
  • Geben Sie den neuen Namen als python-app ein.

5. Der Entwicklungsprozess

Mit der hinzugefügten Geschäftslogik können Sie Ihre Anwendung jetzt bereitstellen und testen. Im folgenden Abschnitt wird die Verwendung des Cloud Code-Plug-ins beschrieben. Dieses Plug-in lässt sich unter anderem in Skaffold einbinden, um Ihren Entwicklungsprozess zu optimieren. Wenn Sie in den folgenden Schritten ein Deployment in GKE vornehmen, erstellen Cloud Code und Skaffold automatisch das Container-Image, übertragen es per Push in eine Container Registry und stellen dann die your-Anwendung in GKE bereit. Das geschieht im Hintergrund und abstrahiert die Details außerhalb des Entwicklungsablaufs.

Kubernetes-Cluster hinzufügen

  1. Cluster hinzufügen

62a3b97bdbb427e5.png

  1. Wählen Sie Google Kubernetes Engine aus:

9577de423568bbaa.png

  1. Projekt auswählen.

c5202fcbeebcd41c.png

  1. Wählen Sie „Python-Cluster“ aus. die bei der Ersteinrichtung erstellt wurde.

719c2fc0a7f9e84f.png

  1. Der Cluster wird jetzt in der Liste der Kubernetes-Cluster unter Cloud Code angezeigt. Von hier aus können Sie den Cluster aufrufen und untersuchen.

7e5f50662d4eea3c.png

In Kubernetes bereitstellen

  1. Wählen Sie unten im Cloud Shell-Editor den Bereich „Cloud Code“ aus.

d99a88992e15fea9.png

  1. Wählen Sie im daraufhin eingeblendeten Steuerfeld Run on Kubernetes aus.

Wenn Sie dazu aufgefordert werden, wählen Sie „Ja“ aus, um den aktuellen Kubernetes-Kontext zu verwenden.

bfd65e9df6d4a6cb.png

Dieser Befehl startet einen Build des Quellcodes und führt dann die Tests aus. Die Ausführung des Builds und der Tests dauert einige Minuten. Diese Tests umfassen Einheitentests und einen Validierungsschritt, mit dem die für die Bereitstellungsumgebung festgelegten Regeln geprüft werden. Dieser Validierungsschritt ist bereits konfiguriert und stellt sicher, dass Sie vor Bereitstellungsproblemen eine Warnung erhalten, auch wenn Sie noch in der Entwicklungsumgebung arbeiten.

  1. Wenn Sie den Befehl zum ersten Mal ausführen, wird oben auf dem Bildschirm eine Eingabeaufforderung angezeigt, in der Sie gefragt werden, ob Sie den aktuellen Kubernetes-Kontext verwenden möchten. Wählen Sie „Yes“ (Ja) aus. den aktuellen Kontext akzeptieren und nutzen.
  2. Als Nächstes wird eine Eingabeaufforderung angezeigt, in der Sie gefragt werden, welche Container Registry verwendet werden soll. Drücken Sie die Eingabetaste, um den angegebenen Standardwert zu übernehmen
  3. Wählen Sie das Feld „Output“ (Ausgabe) aus. , um den Fortschritt und Benachrichtigungen anzuzeigen. Wählen Sie im Drop-down-Menü die Option „Kubernetes: Run/Debug“ aus.

9c87ccbf5d06f50a.png

  1. Wählen Sie „Kubernetes: Run/Debug – Detail“ aus. im Drop-down-Menü „Kanal“ rechts, um zusätzliche Details und Logs aufzurufen, die live aus den Containern gestreamt werden

804abc8833ffd571.png

Wenn der Build und die Tests abgeschlossen sind, enthalten die Logs auf dem Tab „Output“ (Ausgabe) die URL http://localhost:8080 in „Kubernetes: Run/Debug“. Ansicht.

  1. Bewegen Sie den Mauszeiger im Cloud Code-Terminal auf die erste URL in der Ausgabe (http://localhost:8080) und wählen Sie dann in der angezeigten Kurzinfo „Webvorschau öffnen“ aus.
  2. In einem neuen Browsertab wird die folgende Meldung angezeigt: Hello, World!

Heiße Aufladung

  1. Öffnen Sie die Datei app.py.
  2. Begrüßungsnachricht in Hello from Python ändern

Sie sehen sofort, dass der Watcher im Output-Fenster in der Ansicht Kubernetes: Run/Debug die aktualisierten Dateien mit dem Container in Kubernetes synchronisiert.

Update initiated
Build started for artifact python-app
Build completed for artifact python-app

Deploy started
Deploy completed

Status check started
Resource pod/python-app-6f646ffcbb-tn7qd status updated to In Progress
Resource deployment/python-app status updated to In Progress
Resource deployment/python-app status completed successfully
Status check succeeded
...
  1. Wenn Sie zur Ansicht Kubernetes: Run/Debug - Detailed wechseln, werden Sie feststellen, dass Dateiänderungen erkannt werden und die App dann erstellt und noch einmal bereitgestellt wird.
files modified: [app.py]
Syncing 1 files for gcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Copying files:map[app.py:[/app/app.py]]togcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Watching for changes...
[python-app] * Detected change in '/app/app.py', reloading
[python-app] * Restarting with stat
[python-app] * Debugger is active!
[python-app] * Debugger PIN: 744-729-662
  1. Aktualisieren Sie den Browsertab, in dem Sie vorherige Ergebnisse gesehen haben, um die aktualisierten Ergebnisse zu sehen.

Debugging

  1. Rufen Sie die Debug-Ansicht auf und beenden Sie den aktuellen Thread 647213126d7a4c7b.png. Wenn Sie dazu aufgefordert werden, können Sie nach jeder Ausführung eine Bereinigung durchführen.
  2. 70d6bd947d04d1e6.png
  3. Klicken Sie im Menü unten auf Cloud Code und wählen Sie Debug on Kubernetes aus, um die Anwendung im debug-Modus auszuführen.

b9465c6825caf685.png

  • In der Ansicht Kubernetes Run/Debug - Detailed des Fensters Output sehen Sie, dass Skaffold diese Anwendung im Debug-Modus bereitstellt.
  1. Wenn Sie dies zum ersten Mal ausführen, werden Sie in einer Eingabeaufforderung gefragt, wo sich die Quelle im Container befindet. Dieser Wert bezieht sich auf die Verzeichnisse im Dockerfile.

Drücken Sie die Eingabetaste, um die Standardeinstellung zu übernehmen

fccc866f32b5ed86.png

Es dauert einige Minuten, bis die Anwendung erstellt und bereitgestellt ist. Wenn die Debug-Sitzung getrennt wird, führen Sie die Schritte für „Debug on Kubernetes“ noch einmal aus aus den "Development Sessions" .

  1. Nach Abschluss des Prozesses. Sie sehen, dass ein Debugger angehängt ist, auf dem Tab "Output" (Ausgabe) Attached debugger to container "python-app-8476f4bbc-h6dsl" successfully. angezeigt wird und die URL http://localhost:8080 aufgeführt ist.
Port forwarding pod/python-app-8bd64cf8b-cskfl in namespace default, remote port 5678 -> http://127.0.0.1:5678
  1. Die Farbe der unteren Statusleiste wechselt von Blau zu Orange, was darauf hinweist, dass der Debug-Modus aktiviert ist.

b2abd61a129ed76.png

  1. Beachten Sie in der Ansicht Kubernetes Run/Debug, dass ein Debug-fähiger Container gestartet wird.
**************URLs*****************
Forwarded URL from service python-app: http://localhost:8080
Debuggable container started pod/python-app-8bd64cf8b-cskfl:python-app (default)
Update succeeded
***********************************

Haltepunkte verwenden

  1. Öffnen Sie die Datei app.py.
  2. Suchen Sie die Anweisung return message.
  3. Fügen Sie dieser Zeile einen Haltepunkt hinzu, indem Sie auf den leeren Bereich links neben der Zeilennummer klicken. Ein roter Indikator wird angezeigt, um darauf hinzuweisen, dass der Haltepunkt eingerichtet ist.
  4. Laden Sie Ihren Browser neu. Der Debugger stoppt den Prozess am Haltepunkt und ermöglicht es Ihnen, die Variablen und den Status der Anwendung zu untersuchen, die remote in GKE ausgeführt wird.
  5. Klicken Sie auf den Abschnitt VARIABLES
  6. Klicken Sie auf „Lokales“. Dort finden Sie die Variable "message".
  7. Doppelklicken Sie auf den Variablennamen „message“. und ändern Sie im Pop-up-Menü den Wert in einen anderen Wert, z. B. "Greetings from Python".
  8. Klicken Sie im Steuerfeld zur Fehlerbehebung auf die Schaltfläche „Weiter“ 607c33934f8d6b39.png.
  9. Sehen Sie sich die Antwort in Ihrem Browser an. Sie enthält jetzt den aktualisierten Wert, den Sie gerade eingegeben haben.
  10. „Fehlerbehebung“ beenden indem Sie die Stopp-Schaltfläche 647213126d7a4c7b.png drücken. Entfernen Sie den Haltepunkt, indem Sie noch einmal auf den Haltepunkt klicken.

6. Bereinigen

Glückwunsch! In diesem Lab haben Sie eine neue Python-Anwendung von Grund auf erstellt und so konfiguriert, dass sie effektiv mit Containern funktioniert. Anschließend haben Sie Ihre Anwendung in einem Remote-GKE-Cluster bereitgestellt und entsprechende Fehler behoben. Dabei folgten Sie dem Entwicklerablauf, der auch in herkömmlichen Anwendungspaketen verwendet wird.

So bereinigen Sie nach Abschluss des Labs:

  1. Die im Lab verwendeten Dateien löschen
cd ~ && rm -rf ~/music-service
  1. Löschen Sie das Projekt, um alle zugehörigen Infrastrukturen und Ressourcen zu entfernen.

Letzte Aktualisierung: 22.03.2023