Gelöschte S3-Dateien wiederherstellen: Versionierung und Wiederherstellung erklärt

Eine Datei versehentlich aus S3 gelöscht — das passiert in der Produktion öfter als man zugeben möchte. Wenn S3-Versionierung aktiviert war, ist die Datei nicht wirklich weg. Sie ist nur hinter einem sogenannten Delete-Marker versteckt. Dieser Artikel zeigt, wie man gelöschte S3-Objekte mit aktivierter Versionierung findet und wiederherstellt.

TL;DR: Gelöschte S3-Dateien mit Versionierung wiederherstellen

SchrittAktionErgebnis
1Versionierung prüfenSicherstellen, dass Versioning aktiv war
2Delete-Marker identifizierenVersionsliste abrufen, Marker-ID finden
3Delete-Marker löschenObjekt erscheint wieder als aktuell
4Alternativ: Alte Version kopierenExplizit eine bestimmte Version wiederherstellen

Wie S3-Versionierung und Delete-Marker funktionieren

Wenn S3-Versionierung aktiviert ist, löscht ein normaler DELETE-Aufruf das Objekt nicht physisch. Stattdessen legt S3 einen sogenannten Delete-Marker an — ein spezielles Versionsobjekt ohne Inhalt, das als neueste Version gilt. Alle GET-Anfragen ohne explizite Versions-ID sehen diesen Marker und erhalten einen 404-Fehler, obwohl alle früheren Versionen noch vorhanden sind.

Das ist der Kern, den viele falsch verstehen: Das Objekt ist nicht gelöscht. Es ist verborgen. Den Delete-Marker zu entfernen ist gleichbedeutend mit dem Rückgängigmachen des Löschvorgangs.

graph TD A["Objekt vorhanden
Version: xyz789"] --> B["DELETE ohne VersionId"] B --> C["Delete-Marker erstellt
Version: abc123 (IsLatest)"] C --> D["GET-Anfrage → 404"] C --> E["Wiederherstellung:
Delete-Marker löschen"] E --> F["Version xyz789
ist wieder aktuell"] F --> G["GET-Anfrage → 200 OK"]
  1. Normaler Zustand: Das Objekt hat eine oder mehrere Versionen. GET liefert die neueste.
  2. Nach dem Löschen: Ein Delete-Marker wird als neueste Version eingefügt. GET liefert 404.
  3. Wiederherstellung: Der Delete-Marker wird gelöscht. Die vorherige Version wird wieder zur aktuellen.

Schritt 1: Versionierung des Buckets prüfen

Bevor man mit der Suche nach alten Versionen beginnt, muss sichergestellt sein, dass Versionierung zum Zeitpunkt des Löschens aktiv war. War sie es nicht, gibt es keine Versionen — und damit keine Möglichkeit zur Wiederherstellung über diesen Weg.

aws s3api get-bucket-versioning \
  --bucket mein-bucket-name

Die Ausgabe sollte "Status": "Enabled" zeigen. Lautet der Status Suspended, wurden nach der Suspendierung keine neuen Versionen mehr erstellt — Objekte, die davor existierten, haben aber möglicherweise noch Versionen.

Schritt 2: Delete-Marker und Versionen des Objekts auflisten

Jetzt werden alle Versionen des gelöschten Objekts abgerufen. Der Delete-Marker ist dabei als "IsDeleteMarker": true gekennzeichnet und hat die höchste Versionsnummer in der Liste.

aws s3api list-object-versions \
  --bucket mein-bucket-name \
  --prefix pfad/zur/datei.txt

Die Ausgabe enthält zwei Abschnitte: Versions (alle echten Inhaltsversionen) und DeleteMarkers. Aus dem DeleteMarkers-Abschnitt wird die VersionId des Markers benötigt. Aus dem Versions-Abschnitt kann die gewünschte Zielversion identifiziert werden — üblicherweise die mit dem neuesten LastModified-Datum vor dem Löschereignis.

Beispielhafte Ausgabe (gekürzt):

{
  "DeleteMarkers": [
    {
      "Key": "pfad/zur/datei.txt",
      "VersionId": "abc123XYZDeleteMarkerVersionId",
      "IsLatest": true,
      "LastModified": "2024-06-01T10:00:00.000Z"
    }
  ],
  "Versions": [
    {
      "Key": "pfad/zur/datei.txt",
      "VersionId": "xyz789PreviousVersionId",
      "IsLatest": false,
      "LastModified": "2024-05-31T09:00:00.000Z"
    }
  ]
}

Schritt 3: Delete-Marker entfernen — Gelöschte S3-Dateien wiederherstellen

Der einfachste Weg zur Wiederherstellung: den Delete-Marker löschen. Dadurch wird die zuletzt vorhandene Version automatisch wieder zur aktuellen. Hierfür wird die VersionId des Markers aus Schritt 2 benötigt.

aws s3api delete-object \
  --bucket mein-bucket-name \
  --key pfad/zur/datei.txt \
  --version-id abc123XYZDeleteMarkerVersionId

Nach diesem Befehl liefert ein normales GET auf das Objekt wieder den Inhalt der letzten echten Version. Kein Kopieren, kein Umbenennen — der Marker ist weg, das Objekt ist zurück.

Das Entfernen eines Delete-Markers ist selbst ein versionierter Vorgang. S3 erstellt dabei keinen neuen Marker — der Befehl entfernt den Marker direkt, weil die VersionId explizit angegeben wird.

Schritt 4 (Alternativ): Eine bestimmte ältere Version explizit wiederherstellen

Manchmal ist nicht die letzte Version vor dem Löschen die gewünschte — vielleicht gab es mehrere Änderungen, und man möchte eine spezifische ältere Version zurückbringen. In diesem Fall wird die gewünschte Version als neues aktuelles Objekt kopiert.

Zuerst die gewünschte Version herunterladen oder direkt in denselben Key kopieren:

aws s3api copy-object \
  --bucket mein-bucket-name \
  --copy-source mein-bucket-name/pfad/zur/datei.txt?versionId=xyz789PreviousVersionId \
  --key pfad/zur/datei.txt

Dieser Befehl erstellt eine neue Version des Objekts mit dem Inhalt der angegebenen alten Version. Der Delete-Marker bleibt dabei erhalten — er wird durch die neue Version als neueste überschrieben. Wer aufräumen möchte, kann den Marker danach separat löschen.

graph LR Start["Objekt gelöscht
Delete-Marker vorhanden"] --> Q{"Welche Version
wiederherstellen?"} Q --> A["Letzte Version
vor dem Löschen"] Q --> B["Spezifische
ältere Version"] A --> A1["delete-object
mit Marker-VersionId"] A1 --> A2["Letzte echte Version
wird wieder aktuell"] B --> B1["copy-object
mit Ziel-VersionId"] B1 --> B2["Neue Version mit
altem Inhalt erstellt"]
  1. Weg A (Delete-Marker entfernen): Geeignet, wenn die letzte Version vor dem Löschen die gewünschte ist. Schnell und sauber.
  2. Weg B (Version kopieren): Geeignet, wenn eine spezifische ältere Version gezielt wiederhergestellt werden soll.

Häufige Fehlerquelle: Permanentes Löschen vs. Delete-Marker

Hier liegt eine klassische Fehldiagnose vor. Symptom: Das Objekt ist weg, list-object-versions zeigt nichts. Erste Vermutung: Versionierung war nicht aktiv. Tatsächliche Ursache in vielen Fällen: Das Objekt wurde mit expliziter VersionId gelöscht — also ein permanentes Löschen einer spezifischen Version, nicht das Anlegen eines Delete-Markers.

Ein DELETE-Aufruf ohne VersionId auf einem versionierten Bucket → Delete-Marker wird erstellt, Daten sind wiederherstellbar.
Ein DELETE-Aufruf mit VersionId auf einem versionierten Bucket → Diese spezifische Version wird permanent entfernt, kein Marker.

Wenn list-object-versions für den betreffenden Key komplett leer ist und Versionierung aktiv war, wurde das Objekt permanent gelöscht. In diesem Fall hilft nur ein S3-Backup außerhalb der Versionierung — etwa S3 Replication in einen anderen Bucket oder AWS Backup.

IAM-Berechtigungen für die Wiederherstellung

Die oben genannten Befehle erfordern spezifische IAM-Berechtigungen. Insbesondere das Löschen eines Delete-Markers erfordert s3:DeleteObjectVersion — eine Berechtigung, die in restriktiven Umgebungen oft fehlt, weil sie mit 'permanentem Löschen' assoziiert wird, obwohl sie hier zur Wiederherstellung genutzt wird.

🔽 Minimale IAM-Policy für die Wiederherstellung (klicken zum Ausklappen)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "S3VersionRestoreAccess",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucketVersions",
        "s3:GetObjectVersion",
        "s3:DeleteObjectVersion",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::mein-bucket-name",
        "arn:aws:s3:::mein-bucket-name/*"
      ]
    }
  ]
}

s3:ListBucketVersions wird auf der Bucket-Ressource (arn:aws:s3:::mein-bucket-name) benötigt, nicht auf der Objekt-Ressource. Dieser Unterschied führt häufig zu AccessDenied-Fehlern beim Ausführen von list-object-versions.

Wiederherstellung über die AWS Management Console

Wer die CLI nicht verwenden möchte oder kann, findet in der S3-Konsole eine grafische Alternative. Im Bucket-Browser muss zunächst 'Versionen anzeigen' aktiviert werden — erst dann werden Delete-Marker sichtbar. Der Marker kann dann direkt in der Konsole selektiert und gelöscht werden.

Für einzelne Objekte ist das praktisch. Bei Massenwiederherstellungen nach einem versehentlichen Bulk-Delete ist die CLI oder ein Skript die einzig skalierbare Option.

Wrap-up: Gelöschte S3-Dateien sicher wiederherstellen

Mit aktivierter S3-Versionierung ist ein versehentliches Löschen in den meisten Fällen vollständig reversibel. Der entscheidende Punkt: Ein normaler DELETE-Vorgang erzeugt nur einen Delete-Marker — die Daten sind intakt. Den Marker zu entfernen oder eine spezifische Version zu kopieren sind die zwei zuverlässigen Wiederherstellungswege.

Für die Zukunft empfiehlt sich zusätzlich die Konfiguration von MFA Delete auf kritischen Buckets, um permanente Löschvorgänge (mit VersionId) durch eine zweite Authentifizierungsebene abzusichern. Die offizielle AWS-Dokumentation zu S3-Versionierung und MFA Delete findet sich unter docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html.

Glossar

BegriffBedeutung
Delete-MarkerEin spezielles Versionsobjekt ohne Inhalt, das S3 beim Löschen eines versionierten Objekts anlegt. Macht das Objekt für normale GET-Anfragen unsichtbar.
VersionIdEine eindeutige ID, die S3 jeder Version eines Objekts zuweist, wenn Versionierung aktiviert ist.
Permanentes LöschenDas Löschen einer spezifischen Version mit expliziter VersionId. Nicht rückgängig zu machen über Versionierung.
MFA DeleteEine S3-Bucket-Konfiguration, die für permanente Löschvorgänge und das Deaktivieren der Versionierung eine Multi-Faktor-Authentifizierung erfordert.
s3:DeleteObjectVersionIAM-Berechtigung, die zum Löschen einer spezifischen Objektversion (einschließlich Delete-Marker) erforderlich ist.

Kommentare

Beliebte Posts aus diesem Blog

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

LSI vs. GSI in DynamoDB: Den richtigen Sekundärindex wählen

ElastiCache Redis einsetzen: Wann ein Caching-Layer deine RDS-Datenbank entlastet