EC2-Arbeitsspeicher in CloudWatch überwachen: Warum der CloudWatch Agent zwingend notwendig ist
Du öffnest die CloudWatch-Konsole, suchst nach RAM-Auslastung deiner EC2-Instanz — und findest nichts. Kein Memory-Metrik, kein Swap, kein Filesystem. Das ist kein Bug und kein fehlendes Feature: Es ist eine bewusste Architekturentscheidung von AWS, die viele Engineers beim ersten Mal überrascht und die du verstehen musst, bevor du EC2-Arbeitsspeicher überwachen kannst.
TL;DR: EC2-Speicherüberwachung auf einen Blick
| Aspekt | Detail |
|---|---|
| Standardmäßige CloudWatch-Metriken | Nur Hypervisor-seitige Metriken: CPU, Netzwerk, Disk-I/O (EBS-Ebene) |
| Warum kein RAM per Default? | AWS hat keinen Zugriff auf das Gastbetriebssystem — der Hypervisor sieht nur zugewiesenen, nicht genutzten Speicher |
| Lösung | CloudWatch Agent auf der Instanz installieren und konfigurieren |
| Metrik-Namespace | CWAgent (benutzerdefinierter Namespace) |
| Benötigte IAM-Berechtigung | Managed Policy CloudWatchAgentServerPolicy an die Instance Role anhängen |
| Kosten | Custom Metrics werden pro Metrik und pro Datenpunkt abgerechnet — aktuelle Preise in der AWS-Dokumentation prüfen |
Warum CloudWatch EC2-Arbeitsspeicher nicht nativ anzeigt
AWS betreibt EC2 auf einem Hypervisor (Nitro oder Xen, je nach Instanztyp). Der Hypervisor sieht, wie viel RAM einer Instanz zugewiesen wurde — aber er sieht nicht, wie viel davon das Gastbetriebssystem tatsächlich nutzt. Das ist der entscheidende Unterschied: Zugewiesener Speicher ist eine Hypervisor-Ressource. Genutzter Speicher ist eine Betriebssystem-Ressource.
Stell dir vor, du vermietest ein Lagerhaus. Du weißt, wie groß es ist — aber du weißt nicht, wie voll es innen ist, ohne selbst hineinzugehen. AWS ist der Vermieter. Der CloudWatch Agent ist der Mitarbeiter, der drinnen steht und zählt.
CloudWatch-Standardmetriken wie CPUUtilization kommen direkt vom Hypervisor und sind ohne zusätzliche Konfiguration verfügbar. Metriken wie mem_used_percent oder disk_used_percent existieren nur innerhalb des Gastbetriebssystems — und AWS hat aus Sicherheits- und Isolationsgründen keinen direkten Zugriff darauf. Genau hier kommt der CloudWatch Agent ins Spiel: Er läuft als Prozess innerhalb der Instanz, liest OS-Metriken und schickt sie aktiv an CloudWatch.
- Hypervisor-Ebene: AWS Nitro/Xen sieht CPU-Zyklen, Netzwerkpakete und EBS-I/O — diese Daten fließen automatisch in CloudWatch.
- Gastbetriebssystem-Ebene: RAM-Nutzung, Swap, Dateisystem-Füllstand — diese Daten existieren nur innerhalb der Instanz.
- CloudWatch Agent: Läuft als Daemon auf der Instanz, liest OS-Metriken über Standard-Kernel-Schnittstellen und publiziert sie in den
CWAgent-Namespace. - IAM Instance Role: Der Agent benötigt Schreibrechte auf CloudWatch, um Metriken hochzuladen — ohne korrekte Role schlägt der Upload still fehl.
EC2-Arbeitsspeicher überwachen: CloudWatch Agent installieren und konfigurieren
Schritt 1: IAM Instance Role vorbereiten
Bevor der Agent auch nur einen Datenpunkt senden kann, muss die EC2-Instance Role die nötigen Berechtigungen haben. Die verwaltete Policy CloudWatchAgentServerPolicy enthält alle erforderlichen Rechte für den normalen Agentenbetrieb. Ohne diese Policy schreibt der Agent Fehler ins lokale Log, aber CloudWatch zeigt schlicht keine Metriken — kein Alarm, keine Fehlermeldung in der Konsole.
# Managed Policy an eine bestehende Instance Role anhängen
aws iam attach-role-policy \
--role-name MeineEC2InstanceRole \
--policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
Prüfe anschließend, ob die Policy korrekt angehängt wurde:
aws iam list-attached-role-policies \
--role-name MeineEC2InstanceRole \
--query 'AttachedPolicies[?PolicyName==`CloudWatchAgentServerPolicy`]'
Schritt 2: CloudWatch Agent installieren
AWS stellt den Agent über SSM Parameter Store und direkte Paketquellen bereit. Der einfachste Weg auf Amazon Linux 2 / Amazon Linux 2023 ist der Paketmanager:
# Amazon Linux 2 / Amazon Linux 2023
sudo yum install -y amazon-cloudwatch-agent
# Ubuntu / Debian
sudo apt-get install -y amazon-cloudwatch-agent
Alternativ kann der Agent über AWS Systems Manager Distributor auf eine Flotte von Instanzen ausgerollt werden — sinnvoll ab mehr als einer Handvoll Instanzen.
Schritt 3: Agent konfigurieren
Der Agent liest seine Konfiguration aus einer JSON-Datei. Der Wizard ist der schnellste Einstieg, aber für reproduzierbare Deployments sollte die Konfiguration versioniert und über SSM Parameter Store verteilt werden.
# Interaktiven Konfigurationsassistenten starten
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
Für eine direkte, nicht-interaktive Konfiguration: Erstelle die Datei /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json mit folgendem Inhalt:
🔽 Beispiel-Konfiguration anzeigen (Speicher + Disk)
{
"metrics": {
"namespace": "CWAgent",
"metrics_collected": {
"mem": {
"measurement": [
"mem_used_percent"
],
"metrics_collection_interval": 60
},
"disk": {
"measurement": [
"disk_used_percent"
],
"resources": [
"/"
],
"metrics_collection_interval": 60
}
},
"append_dimensions": {
"InstanceId": "${aws:InstanceId}"
}
}
}
Die Dimension InstanceId wird automatisch zur Laufzeit aufgelöst — kein Hardcoding nötig. Der Namespace CWAgent ist der Standard; er kann überschrieben werden, aber dann müssen alle Alarme und Dashboards entsprechend angepasst werden.
Schritt 4: Agent starten und Status prüfen
Der Agent wird über ein eigenes Steuerskript verwaltet, nicht direkt über systemd — obwohl er intern systemd nutzt. Das Steuerskript ist der dokumentierte Weg:
# Agent mit der erstellten Konfiguration starten
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a fetch-config \
-m ec2 \
-s \
-c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
# Betriebsstatus prüfen
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a status
Die Ausgabe des Status-Befehls zeigt "status": "running" wenn alles korrekt läuft. Wenn der Status stopped zeigt, ist die erste Anlaufstelle das Agent-Log:
sudo tail -f /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log
Schritt 5: Metriken in CloudWatch verifizieren
Nach dem Start dauert es typischerweise eine bis zwei Minuten, bis die ersten Datenpunkte in CloudWatch erscheinen. Prüfe direkt über die CLI, ob Metriken ankommen — das ist schneller als das Warten auf die Konsole:
aws cloudwatch list-metrics \
--namespace CWAgent \
--metric-name mem_used_percent \
--region us-east-1
Wenn die Ausgabe leer ist, liegt das Problem entweder an der IAM-Policy (Schritt 1), an der Agent-Konfiguration oder daran, dass der Agent nicht läuft. Leere Ausgabe bedeutet: CloudWatch hat noch keine Daten empfangen — nicht, dass die Metrik nicht existiert.
Typischer Fehler in der Praxis: Stille IAM-Fehler beim EC2-Arbeitsspeicher überwachen
Das klassische Muster sieht so aus: Agent installiert, Konfiguration erstellt, Agent läuft — aber in CloudWatch erscheinen keine Metriken. Die Konsole zeigt keinen Fehler. Kein Alarm schlägt an. Nichts.
Die erste Vermutung ist meist ein Konfigurationsfehler in der JSON-Datei. Also wird die Konfiguration geprüft, der Agent neugestartet — immer noch nichts. Dann wird die Netzwerkkonnektivität verdächtigt: Kann die Instanz den CloudWatch-Endpunkt erreichen?
Die eigentliche Ursache: Die EC2-Instance Role hat keine CloudWatchAgentServerPolicy angehängt. Der Agent versucht, Metriken per cloudwatch:PutMetricData hochzuladen, erhält einen AccessDenied-Fehler — und schreibt diesen Fehler ins lokale Agent-Log, nicht in CloudWatch. In der CloudWatch-Konsole sieht man schlicht gar nichts.
Der Agent-Log zeigt in diesem Fall Einträge wie:
E! [outputs.cloudwatch] E! WriteToCloudWatch, error: AccessDeniedException:
User: arn:aws:sts::123456789012:assumed-role/MeineEC2InstanceRole/i-0abc123def456789
is not authorized to perform: cloudwatch:PutMetricData
Sobald die Policy angehängt und der Agent neugestartet ist, erscheinen die Metriken innerhalb von Minuten. Das Lesen des Agent-Logs ist bei fehlenden Metriken immer der erste Diagnoseschritt — nicht die CloudWatch-Konsole.
CloudWatch-Alarm für hohe Speicherauslastung erstellen
Metriken ohne Alarme sind nur halbe Arbeit. Ein Alarm auf mem_used_percent ist schnell erstellt — wichtig ist, die korrekte Dimension InstanceId anzugeben, sonst greift der Alarm auf alle Instanzen im Namespace:
aws cloudwatch put-metric-alarm \
--alarm-name 'EC2-HighMemoryUsage-i-0abc123def456789' \
--metric-name mem_used_percent \
--namespace CWAgent \
--statistic Average \
--period 300 \
--threshold 85 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 2 \
--dimensions Name=InstanceId,Value=i-0abc123def456789 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:MeinAlarmTopic \
--region us-east-1
Konfiguration zentral über SSM Parameter Store verwalten
Für mehr als eine Instanz ist das manuelle Kopieren der Konfigurationsdatei nicht skalierbar. Der CloudWatch Agent unterstützt das Laden der Konfiguration direkt aus dem SSM Parameter Store — der empfohlene Weg für Fleet-Deployments.
# Konfiguration in SSM Parameter Store speichern
aws ssm put-parameter \
--name '/cloudwatch-agent/config' \
--type String \
--value file:///opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json \
--region us-east-1
# Agent auf Instanz mit SSM-Konfiguration starten
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a fetch-config \
-m ec2 \
-s \
-c ssm:/cloudwatch-agent/config
Damit kann dieselbe Konfiguration über SSM Run Command oder State Manager auf alle Instanzen ausgerollt werden, ohne SSH-Zugriff auf jede einzelne Maschine.
Nächste Schritte und weiterführende Ressourcen
Der CloudWatch Agent ist der einzige dokumentierte Weg, OS-seitige Metriken wie EC2-Arbeitsspeicher in CloudWatch zu publizieren. Wer darüber hinaus Log-Dateien zentralisieren will, kann denselben Agent nutzen — die logs-Sektion der Konfiguration ermöglicht das Streamen beliebiger Logdateien in CloudWatch Logs ohne zusätzliche Software.
- AWS-Dokumentation: CloudWatch Agent installieren und konfigurieren
- CloudWatch Agent Konfigurationsdatei-Referenz
- Verwandter Beitrag: EC2 Auto Scaling basierend auf benutzerdefinierten CloudWatch-Metriken
- Verwandter Beitrag: CloudWatch Logs Insights für strukturierte Log-Analyse
Glossar: Schlüsselbegriffe zur EC2-Speicherüberwachung
| Begriff | Bedeutung |
|---|---|
| CloudWatch Agent | Software-Daemon, der auf EC2-Instanzen läuft und OS-seitige Metriken sowie Logs an CloudWatch sendet |
| Custom Metrics / Benutzerdefinierte Metriken | Metriken, die nicht vom AWS-Hypervisor stammen, sondern von Anwendungen oder dem CloudWatch Agent publiziert werden; werden separat abgerechnet |
| CWAgent Namespace | Standard-Namespace, unter dem der CloudWatch Agent Metriken in CloudWatch ablegt |
| Instance Role | IAM-Rolle, die einer EC2-Instanz zugewiesen ist und deren Berechtigungen für AWS-API-Aufrufe definiert |
| SSM Parameter Store | AWS-Dienst zur zentralen Verwaltung von Konfigurationsdaten; wird für Fleet-weite Agent-Konfigurationen empfohlen |
Kommentare
Kommentar veröffentlichen