Elastic IP Kosten stoppen: Disassociate und Release richtig anwenden

Die EC2-Instanz ist gestoppt, aber die AWS-Rechnung zeigt weiterhin stündliche Gebühren für eine Elastic IP — das ist ein klassischer Kostenfallen-Moment, den fast jeder AWS-Nutzer irgendwann erlebt. Das Problem liegt nicht darin, dass die Instanz läuft, sondern darin, wie AWS Elastic IPs abrechnet: Eine reservierte, aber nicht aktiv genutzte öffentliche IP kostet Geld, unabhängig vom Instanzstatus.

TL;DR: Elastic IP Kosten stoppen

SituationWird berechnet?Aktion erforderlich
EIP einer laufenden Instanz zugewiesenNein (kostenlos)Keine
EIP zugewiesen, Instanz gestopptJaDisassociate + Release
EIP alloziert, keiner Instanz zugewiesenJaRelease
EIP freigegeben (released)Nein

Wie Elastic IP Abrechnung funktioniert

AWS stellt öffentliche IPv4-Adressen aus einem begrenzten Pool bereit. Wenn eine Elastic IP alloziert, aber nicht einer laufenden Instanz zugewiesen ist, hält AWS diese Adresse für dich reserviert — ohne sie produktiv zu nutzen. Genau dafür fällt die stündliche Gebühr an. Der Instanzstatus (running, stopped, terminated) ist dabei sekundär; entscheidend ist, ob die EIP an eine laufende Instanz gebunden ist.

Seit Februar 2024 berechnet AWS öffentliche IPv4-Adressen auch dann, wenn sie einer laufenden Instanz zugewiesen sind — das ist eine Änderung gegenüber dem früheren Modell. Prüfe die aktuelle Preisseite für IPv4-Adressen, da sich die Konditionen geändert haben und weiter ändern können.

Eine Elastic IP ist wie ein gemieteter Parkplatz: Ob dein Auto gerade dort steht oder nicht — du zahlst die Miete, solange du den Platz hältst.

Zustandsübergänge einer Elastic IP

Bevor du CLI-Befehle ausführst, ist es wichtig zu verstehen, in welchem Zustand sich deine EIP befindet und welche Übergänge möglich sind.

stateDiagram-v2 [*] --> Alloziert : allocate-address Alloziert --> ZugewiesenLaufend : associate-address
(Instanz läuft) Alloziert --> Freigegeben : release-address ZugewiesenLaufend --> ZugewiesenGestoppt : Instanz wird gestoppt ZugewiesenGestoppt --> ZugewiesenLaufend : Instanz wird gestartet ZugewiesenLaufend --> Alloziert : disassociate-address ZugewiesenGestoppt --> Alloziert : disassociate-address Alloziert --> Freigegeben : release-address Freigegeben --> [*]
  1. Alloziert, nicht zugewiesen: Die EIP existiert in deinem Konto, ist aber keiner Ressource zugeordnet. Gebühren fallen an.
  2. Zugewiesen, Instanz gestoppt: Die EIP ist einer Instanz zugewiesen, die Instanz läuft aber nicht. Gebühren fallen an.
  3. Zugewiesen, Instanz läuft: Aktive Nutzung. Prüfe die aktuelle IPv4-Preisseite für den geltenden Tarif.
  4. Freigegeben: Die EIP ist aus deinem Konto entfernt. Keine Gebühren mehr. Die IP-Adresse kehrt in den AWS-Pool zurück.

Der kritische Punkt: Vom Zustand 'Zugewiesen, Instanz gestoppt' kommst du nicht direkt zu 'Freigegeben'. Du musst zuerst disassoziieren, dann freigeben.

Der korrekte Ablauf: Disassociate, dann Release

Zwei Schritte sind notwendig. Wer nur einen davon ausführt, zahlt weiter.

graph LR A["EIP zugewiesen
Instanz gestoppt"] -->|"Schritt 1: disassociate-address
(eipassoc-...)"| B["EIP alloziert
nicht zugewiesen"] B -->|"Schritt 2: release-address
(eipalloc-...)"| C["EIP freigegeben
Keine Kosten"] style A fill:#f5a623,color:#000 style B fill:#f5a623,color:#000 style C fill:#7ed321,color:#000
  1. Schritt 1 — Disassociate: Trennt die Verbindung zwischen EIP und Instanz. Die EIP existiert danach noch in deinem Konto, ist aber keiner Ressource mehr zugewiesen.
  2. Schritt 2 — Release: Gibt die EIP vollständig frei. Sie verlässt dein Konto und kehrt in den AWS-Pool zurück. Ab diesem Moment entstehen keine Kosten mehr.

Elastic IP Kosten stoppen: Schritt-für-Schritt per AWS CLI

Schritt 1: Alle Elastic IPs im Konto auflisten

Zuerst verschaffst du dir einen Überblick über alle allozierten EIPs und ihren aktuellen Zuweisungsstatus. Ohne diese Übersicht weißt du nicht, welche IPs überhaupt Kosten verursachen — insbesondere in Konten mit mehreren Regionen oder alten, vergessenen Ressourcen.

aws ec2 describe-addresses \
  --region us-east-1 \
  --query 'Addresses[*].{PublicIP:PublicIp,AllocationId:AllocationId,AssociationId:AssociationId,InstanceId:InstanceId,Domain:Domain}' \
  --output table

Achte auf Zeilen, bei denen AssociationId oder InstanceId leer ist — das sind EIPs, die bereits jetzt Kosten verursachen, ohne genutzt zu werden. Zeilen mit einer AssociationId, aber einer gestoppten Instanz, sind der häufigste Fall dieses Problems.

Schritt 2: Instanzstatus prüfen

Bevor du disassoziierst, bestätige, dass die zugehörige Instanz tatsächlich gestoppt ist. Dieser Schritt verhindert, dass du versehentlich eine produktive Instanz von ihrer öffentlichen IP trennst.

aws ec2 describe-instances \
  --instance-ids i-0123456789abcdef0 \
  --region us-east-1 \
  --query 'Reservations[*].Instances[*].{InstanceId:InstanceId,State:State.Name,PublicIp:PublicIpAddress}' \
  --output table

Schritt 3: EIP von der Instanz disassoziieren

Verwende die AssociationId aus Schritt 1 (Format: eipassoc-...), nicht die AllocationId. Das ist ein häufiger Fehler — beide IDs sehen ähnlich aus, aber disassociate-address erwartet die Association ID.

aws ec2 disassociate-address \
  --association-id eipassoc-0123456789abcdef0 \
  --region us-east-1

Kein Output bedeutet Erfolg. Prüfe danach erneut mit describe-addresses, ob das Feld AssociationId jetzt leer ist.

Schritt 4: EIP freigeben

Jetzt, da die EIP nicht mehr zugewiesen ist, kannst du sie mit der AllocationId freigeben. Nach diesem Befehl ist die IP-Adresse weg — sie kehrt in den AWS-Pool zurück und kann nicht wiederhergestellt werden.

aws ec2 release-address \
  --allocation-id eipalloc-0123456789abcdef0 \
  --region us-east-1

Schritt 5: Bestätigung

Verifiziere, dass die EIP nicht mehr in deinem Konto erscheint.

aws ec2 describe-addresses \
  --region us-east-1 \
  --output table

Wenn die EIP in der Ausgabe nicht mehr auftaucht, entstehen ab sofort keine weiteren Gebühren für diese Adresse.

IAM-Berechtigungen für diese Operationen

Falls du diese Schritte über einen IAM-Benutzer oder eine Rolle ausführst, sind mindestens diese Berechtigungen erforderlich:

🔽 IAM Policy anzeigen
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeAddresses",
        "ec2:DescribeInstances",
        "ec2:DisassociateAddress",
        "ec2:ReleaseAddress"
      ],
      "Resource": "*"
    }
  ]
}

DescribeAddresses und DescribeInstances sind Read-Operationen und erfordern "Resource": "*" — eine Einschränkung auf spezifische ARNs ist für diese Describe-Aktionen nicht möglich. DisassociateAddress und ReleaseAddress können in manchen Umgebungen über Bedingungen weiter eingeschränkt werden; prüfe die AWS Service Authorization Reference für aktuelle Details.

Erfahrungsbericht: Warum 'gestoppt' nicht 'kostenlos' bedeutet

Das Szenario sieht immer gleich aus: Eine Testinstanz wird gestoppt, weil sie gerade nicht gebraucht wird. Der Entwickler denkt, damit sind alle Kosten gestoppt. Vier Wochen später zeigt das Billing Dashboard eine unerwartete Zeile für 'Elastic IP - IdleAddress'.

Die Fehldiagnose: 'Die Instanz ist gestoppt, also sollte nichts laufen.' Die tatsächliche Ursache: Die EIP ist noch der gestoppten Instanz zugewiesen. AWS berechnet die reservierte Adresse, nicht die Instanzlaufzeit.

Der Fix ist trivial — zwei CLI-Befehle. Aber der Schaden entsteht in den Wochen davor, weil das Billing-Alert-Threshold nicht niedrig genug gesetzt war. Richte für solche Fälle einen AWS Budgets Alert ein, der bei unerwarteten EC2-Nebenkosten (wie 'EC2-Other') anschlägt, bevor die nächste Monatsrechnung kommt.

Alle nicht genutzten Elastic IPs im Konto finden

In größeren Konten lohnt es sich, systematisch nach nicht zugewiesenen EIPs zu suchen. Dieser Befehl filtert direkt auf EIPs ohne aktive Zuweisung:

aws ec2 describe-addresses \
  --region us-east-1 \
  --filters 'Name=domain,Values=vpc' \
  --query 'Addresses[?AssociationId==`null`].{PublicIP:PublicIp,AllocationId:AllocationId}' \
  --output table

Führe diesen Befehl in jeder Region aus, in der du Ressourcen betreibst. Vergessene EIPs aus alten Projekten tauchen häufig in Regionen auf, die nicht mehr aktiv genutzt werden.

Nächste Schritte und weiterführende Ressourcen

Wenn du regelmäßig EC2-Instanzen für Tests oder Entwicklung startest und stoppst, solltest du folgende Punkte in deinen Workflow integrieren:

  • Richte AWS Budgets mit einem Alert für EC2-Kosten ein, um unerwartete Gebühren frühzeitig zu erkennen.
  • Prüfe mit AWS Cost Explorer die Kostenkategorie 'EC2-Other' — dort erscheinen EIP-Gebühren getrennt von Instanzlaufzeiten.
  • Nutze AWS Trusted Advisor (im kostenpflichtigen Support-Plan) oder den kostenlosen EC2 Global View, um nicht genutzte Elastic IPs kontoübergreifend zu identifizieren.
  • Offizielle Dokumentation: Elastic IP Addresses — AWS EC2 User Guide

Glossar

BegriffBedeutung
Elastic IP (EIP)Statische, öffentliche IPv4-Adresse, die du in deinem AWS-Konto allozieren und Ressourcen zuweisen kannst.
Allocation IDEindeutige ID einer allozierten EIP im Format eipalloc-.... Wird für release-address benötigt.
Association IDID der Verbindung zwischen einer EIP und einer Ressource im Format eipassoc-.... Wird für disassociate-address benötigt.
DisassociateTrennt die EIP von einer Ressource. Die EIP bleibt im Konto alloziert und verursacht weiterhin Kosten.
ReleaseGibt die EIP vollständig frei. Sie verlässt das Konto und verursacht keine Kosten mehr.

Kommentare

Beliebte Posts aus diesem Blog

EC2 ohne Internetzugang im eigenen VPC – Internet Gateway und Route Table korrekt einrichten

EC2 SSH Verbindungs-Timeout: Security Group Inbound-Regeln richtig konfigurieren