Wie das AWS Toolkit bei der Fehlersuche hilft Cloud-Debugging für Container auf Amazon ECS

Autor / Redakteur: Florian Mair * / Stephan Augsten

Containerisierte Cloud-Anwendungen sind nicht frei von Fehlern. Doch wie lassen sich Container eigentlich debuggen, ohne komplexe Cloud-Architekturen auf einem lokalen Rechner replizieren zu müssen?

Firmen zum Thema

Debugging-Session für einen Amazon-ECS-Container in der PyCharm IDE.
Debugging-Session für einen Amazon-ECS-Container in der PyCharm IDE.
(Bild: JetBrains / AWS)

Container geben Entwicklern die Möglichkeit, den Code sowie die Konfigurationen und Abhängigkeiten von einer Applikation in einem Objekt zu bündeln. Zudem sind containerisierte Anwendungen meist klein, portabel und lassen sich auf verschiedensten Umgebungen ausführen, um Applikationen einfach zu betreiben und skalieren.

Kunden verwenden Container für viele Anwendungsfälle, zum Beispiel Microservices, Batch-Aufgaben, Machine Learning oder um bestehende Applikationen in die Cloud zu migrieren. Um eine große Anzahl von (Docker-)Containern zu administrieren und zu orchestrieren, existieren Container-Managementsysteme wie zum Beispiel Kubernetes und Amazon Elastic Container Service (Amazon ECS).

Falls nun ein Fehler in einem Container auftritt, helfen diese Orchestrierungstools meist nur begrenzt durch integrierte Logs und Metriken. Das lokale Debuggen des Containers ist zwar möglich, allerdings müssen dabei oft komplexe Umgebungen emuliert werden. Dies bedeutet zusätzlichen Aufwand für Entwickler und bringt potenziell neue Fehlerquellen mit sich.

Um das Debuggen von Containern, welche auf Amazon ECS ausgeführt werden, in der AWS Cloud zu vereinfachen, wurde Ende 2019 Cloud-Debugging (beta) für das AWS Toolkit for JetBrains vorgestellt. Dieses Features ermöglichen das Debuggen von Containern, die auf Amazon ECS ausgeführt werden, in den bekannten JetBrains IDEs (IntelliJ, PyCharm, WebStorm etc.).

Debuggen mit dem AWS Tookit in PyCharm

Debuggen mit dem AWS Toolkit in PyCharm.
Debuggen mit dem AWS Toolkit in PyCharm.
(Bild: AWS)

Um eine containerisierte Anwendung mit dem AWS Toolkit zu debuggen, muss diese auf Amazon ECS ausgeführt werden und das zugehörige Image auf Docker Hub oder Amazon ECS gehostet sein. Das AWS Toolkit muss für die jeweilige IDE installiert und konfiguriert werden. Die hierfür nötigen Schritte sind in der AWS Dokumentation beschrieben. Die vorangestellte Abbildung zeigt, welche Änderungen das AWS Toolkit im ECS Cluster vornimmt, wenn die Cloud-Debugging-Funktion aktiviert wird.

In diesem Beispiel wird eine RESTful API auf ECS ausgeführt. Als Endpunkt, an den der User den Request schickt, dient ein Application Load Balancer (ALB). Dieser verteilt eingehenden Datenverkehr auf einen oder mehrere Container, welche in einer Zielgruppe (auch Target Group genannt) registriert sind, außerdem überwacht der ALB den Status von Zielen und sendet Datenverkehr nur an Ziele, welche den definierten Healthcheck bestehen.

Im Normalfall wird der Unicorn API Service (gekennzeichnet mit Nummer 1) diese Anfrage beantworten. Wenn das Cloud Debugging nun aktiviert wird, erstellt AWS Toolkit automatisch einen identischen ECS Service mit dem Prefix „cloud-debug“ (gekennzeichnet mit Nummer 2). Die Zielgruppenkonfiguration des Load Balancers wird so angepasst, dass der Traffic zum neu erstellten ECS Service geleitet wird.

Dies bietet den Vorteil, dass der ursprüngliche Container und Service nicht verändert werden. Die veränderte Weiterleitung an die neue Zielgruppe ist für Anwender nicht sichtbar, allerdings führt das Wechseln der Zielgruppe zu kurzen Unterbrechungen in der Verfügbarkeit des Service. Daher sollte dieses Feature nicht in Produktivumgebungen eingesetzt werden.

Der neu erstellte Service führt zusätzlich zum regulären Container noch einen Sidecar Container aus. Dazu hat Cloud Debug eine neue Version der ECS Task Definition angelegt und den Sidecar Container, welcher ein von AWS bereitgestelltes Docker Image ausführt, hinzugefügt. Der zusätzliche Container wird benötigt, um einige Features des Cloud Debugging zu ermöglichen.

Installation der notwendigen Komponenten

Um das Cloud Debugging für Ihren Amazon ECS Service zu aktivieren, müssen Sie folgende Schritte ausführen:

1. Installation des AWS Toolkits

Das Toolkit ist für mehrere IDEs von JetBrains verfügbar. Eine Schritt für Schritt Anleitung finden Sie in der AWS Dokumentation.

2. CloudDebugging aktivieren

Um CloudDebugging zu aktivieren, muss im AWS Explorer innerhalb des IDEs Amazon ECS mit dem zu debuggenden Cluster und Service ausgewählt werden. Über das Kontextmenü kann die Funktion "Enable Cloud Debugging" ausgewählt werden. Dieser Vorgang kann einige Minuten dauern, anschließend wird in der Build Ausgabe des IDEs die erfolgreiche Aktivierung angezeigt. Dabei muss eine IAM Rolle ausgewählt werden, diese sollte die Standard ECSTask Rolle sein, zu der zusätzlich die AWS Managed Policy „AmazonSSMManagedInstanceCore“ hinzugefügt wurde.

3. Debug Konfiguration anpassen

Um den Cloud Debugger zu konfigurieren, wird das „Debug Konfiguration bearbeiten“ Fenster im IDE geöffnet (üblicherweise zu finden unter „Ausführen / Run“). AWS ECS Service Cloud Debug (Beta) sollte vorausgewählt sein und die Auswahl des ECS Clusters und Services erlauben. Bei „Start Command“ wird der Befehl festgelegt, mit welchem die Applikation gestartet werden kann (beispielsweise python /src/app.py). Im Bereich Artifacts Mapping wird angegeben, welches lokale Verzeichnis den Applikationscode beinhaltet. Dieser Pfad wird für die Code Synchronisation verwendet.

4. Debug Session starten

Nun lässt sich die Debug Session wie gewohnt über den IDE mit der vorher angelegten Konfiguration starten.

(1) Lokale Anwendungskopie, (2) AWS Explorer, (3) Breakpoint, (4) Variablen im Breakpoint, (5) Debugging Logs, (6) Remote CLI
(1) Lokale Anwendungskopie, (2) AWS Explorer, (3) Breakpoint, (4) Variablen im Breakpoint, (5) Debugging Logs, (6) Remote CLI
(Bild: JetBrains / AWS)

Diese Abbildung gibt eine Übersicht über die Cloud-Debugging-Funktionen in PyCharm. Im AWS Explorer ist es möglich, bei der Auswahl des entsprechenden ECS Services mit dem Kontextmenü-Befehl „Start Remote Shell“ eine Kommandozeile innerhalb des Containers zu starten. Im Folgenden eine genaue Erläuterung des Debugging-Fensters.

(1) Lokale Kopie der Applikation: Hier können Code Änderungen durchgeführt werden, die dann durch das Neustarten das Stoppen und Starten in den Container synchronisiert werden

(2) AWS Explorer: Dient zum Aktivieren und Deaktivieren der Cloud-Debugging-Funktionen (Debugging, Log Streaming, Kommandozeile in Container)

(3) Breakpoint in der lokalen Kopie der Applikation: Breakpoints im lokalen Code lassen sich ohne den Restart des Debuggers nutzen.

(4) Variablen im Breakpoint: Um die Applikation zu debuggen, können die Variablen an dem gesetzten Breakpoint inspiziert werden.

(5) Debugger Console Logs: Diese Konsole gibt die Logs aus dem Debugger aus. Alternativ können Logs auch über das LogStreaming-Feature von CloudWatch geladen werden.

(6) Remote-Kommandozeile: Dieses Feature erlaubt Befehle innerhalb des Containers auszuführen. Dies kann zum Beispiel htop sein, um die laufenden Prozesse und deren Ressourcenverbrauch zu überwachen.

Fazit

Florian Mair
Florian Mair
(Bild: AWS)

Das Verwenden des AWS Toolkit für JetBrains ermöglicht das Debuggen von ECS-basierten Containern, ohne sie ressourcenintensiv lokal ausführen zu müssen. Besonders hilfreich sind dabei Funktionen wie Code-Synchronisation zwischen lokaler Umgebung und Container, die Remote Shell (für den Start einer Kommandozeile im jeweiligen Container) oder das direkte Abrufen von CloudWatch-Logs direkt in der IDE. Eine Beispielapplikation zum Verwenden von CloudDebugging mit dem AWS Toolkit findet sich auch bei GitHub.

* Florian Mair arbeitet als Solutions Architect bei Amazon Web Services. Dabei begleitet er Software-Unternehmen auf dem Weg in die Cloud und unterstützt sie dabei, ihre Applikationen zu SaaS-, sprich Software-as-a-Service-Produkten zu modernisieren.

(ID:47300592)