Zwei Lifecycle-Richtlinien, die jeder S3-Bucket haben sollte

07.03.2024

Jonathan Merlevede

Abgebrochene Mehrteil-Uploads und abgelaufene Löschmarker: was sind sie und warum Sie sich wegen der schlechten AWS-Standarde darum kümmern müssen.

Es kann Elemente in Ihren Buckets geben, die Sie nicht sehen, die jedoch die S3-Kosten und die Leistung negativ beeinflussen. Dieser Beitrag erklärt, was diese unsichtbaren Objekte sind und was Sie tun können, um sie zu entfernen, da AWS sie aus Gründen der Rückwärtskompatibilität und möglicherweise auch aufgrund perverser Anreize standardmäßig nicht für Sie entfernt.

Zusammenfassung: Die betreffenden Objekte sind Teile abgebrochener Multipart-Uploads und abgelaufene Objekterlöschmarker. Ich denke, jeder Bucket sollte eine Lebenszyklusp Anne haben, um sie zu entfernen. Wenn Sie nicht wissen, was diese Objekte sind und daran interessiert sind zu erfahren, lesen Sie weiter.

Abgebrochene, unvollständige Multipart-Uploads

Was sind Multipart-Uploads?

Das Hochladen kleiner Objekte in AWS S3 ist mit nur einer PutObject-Operation möglich. Für größere Objekte verwenden wir Multipart-Uploads, und der Ablauf ist komplexer:

  • Führen Sie die CreateMultiPartUpload-Operation durch. Sie geben einen Objekt-Schlüssel an; AWS gibt Ihnen eine Upload-ID zurück.

  • Führen Sie UploadPart-Operationen durch, eine für jeden Teil. Sie geben AWS den Objekt-Schlüssel, die Upload-ID, eine „Teilnummer“ und einen Teil der Datei an, die Sie hochladen möchten.

  • Führen Sie die CompleteMultiPartUpload-Operation durch. Sie geben den Objekt-Schlüssel und die Upload-ID an; AWS erstellt dann Ihr Objekt als Verkettung aller Teile, die Sie hochgeladen haben.

All dies wird normalerweise von Ihrem Upload-Tool oder Ihrer Bibliothek verarbeitet. Wenn Sie beispielsweise die AWS CLI verwenden, um Dateien hochzuladen (unter Verwendung von aws s3 cp), werden Multipart-Uploads standardmäßig für Dateien größer als 8MiB verwendet.

Was ist problematisch an Multipart-Uploads?

Wenn Sie einen Upload nie abschließen, bleiben die hochgeladenen Teile dauerhaft in Ihrem Bucket. Diese Teile werden in Ihrem Bucket gespeichert; Sie zahlen dafür, dass Sie sie haben, während Sie sie nicht sehen.

Um dies zu veranschaulichen, erstellen wir eine 5GiB-Testdatei und beginnen mit dem Hochladen in die Cloud mithilfe von aws s3 cp:

bucket=yourbucketnamekey=tmp/testfiledd if=/dev/urandom of=/tmp/testfile bs=1G count=5aws s3 cp /tmp/testfile "s3://$bucket/$key" &[1] 71717

Nachdem Sie den Upload eine Weile laufen gelassen haben, beenden Sie den Upload abrupt:

kill -9 71717

Sie können sehen, dass der Multipart-Upload weiterhin existiert:

aws s3api list-multipart-uploads --bucket $bucket
{    "Uploads": [        {            "UploadId": "gB8iBxnOiladG...",            "Key": "tmp/testfile",            "Initiated": "2023-11-17T14:31:24+00:00",            "StorageClass": "STANDARD",            "Owner": {...},            "Initiator": {...}        }    ],    "RequestCharged": null

Sie können die zugehörigen Teile mit list-parts auflisten:

id="gB8iBxnOiladG..."aws s3api list-parts --bucket "$bucket" --key "$key" --upload-id "$id"
{    "Parts": [        {            "PartNumber": 1,            "LastModified": "2023-11-17T14:39:17+00:00",            "ETag": "\"edeb946bf1303ed6350887c519041350\"",            "Size": 8388608        },        {            "PartNumber": 2,            "LastModified": "2023-11-17T14:39:17+00:00",            "ETag": "\"5c288b397c12981b40f19fde2387db5d\"",            "Size": 8388608

Was kann ich gegen abgebrochene Multipart-Uploads tun?

Wenn Sie wissen, dass ein Upload abgebrochen wurde und abgebrochen werden sollte, können Sie die hochgeladenen Teile entfernen, indem Sie den Upload mit derAbortMultipartUpload-Operation abbrechen:

aws s3api abort-multipart-upload --bucket "$bucket" --key "$key" --upload-id "$id"

Sie können überprüfen, ob die Upload-ID und damit auch die zugehörigen Teile entfernt wurden:

aws s3api list-multipart-uploads --bucket $bucket
{    "RequestCharged": null
aws s3api list-parts --bucket "$bucket" --key "$key" --upload-id "$id"
An error occurred (NoSuchUpload) when calling the ListParts operation: The specified upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed

Was kann ich wirklich gegen abgebrochene Multipart-Uploads tun?

Das oben Genannte ist sehr unpraktisch, da es erfordert, dass Sie Ihren Bucket auf abgebrochene Uploads überwachen und diese manuell abbrechen. Stattdessen sollten Sie AWS anweisen, Multipart-Uploads nach Ablauf eines bestimmten Zeitraums automatisch abzubrechen, indem Sie eine (Ablauf-) Objektlebenszyklusrichtlinie verwenden.

Sie können dies mit der CLI oder IaC-Tools wie Terraform tun, aber auch über die AWS-Konsole. Während Sie dort sind, aktivieren Sie auch das Kästchen „Abgelaufene Objekterlöschmarker löschen“; wir werden erklären, was dies im nächsten Abschnitt bewirkt.

Create lifecycle rule

Gibt es Nachteile dabei?

Die Objektablaufsteuerung durch Lebenszyklusrichtlinien ist kostenlos. Das Einzige, was zu berücksichtigen ist, ist, dass die Anzahl der Tage, die Sie in der Richtlinie festlegen, die Zeit, die ein Multipart-Upload in Anspruch nehmen kann, begrenzt. Berücksichtigen Sie dies, wenn Sie 5TiB-Objekte von einer langsamen Verbindung hochladen. Wählen Sie etwas Ungewöhnlich lang für einen einzelnen Upload, aber nicht so lang, dass es Ihre Speichergebühren beeinträchtigt, wie 14 Tage.

Abgelaufene Löschmarker

Andere unsichtbare Objekte, die oft in Buckets verweilen, werden „abgelaufene Objekterlöschmarker“ genannt. Diese Objekte existieren nur in versionierten Buckets.

Was sind Objekterlöschmarker?

Wenn Sie die Versionierung für Buckets aktivieren, wird jeder Präfix mit einem Stapel versionierter Elemente verknüpft. Das aktuellste Element ist das „neueste“ oder „aktuelle“. Es gibt zwei Typen von versionierten Elementen: Objektversionen und Löschmarker. Daten an einem Speicherort zu schreiben, fügt eine Objektversion zum Stapel hinzu; ein Objekt zu löschen, fügt einen Löschmarker hinzu. Wenn das aktuelle Element eine Objektversion ist, ist diese Objektversion als Objekt in Ihrem Bucket sichtbar; aktuelle Löschmarker bleiben unsichtbar.

Wir können dies leicht mit ein paar aws CLI-Befehlen veranschaulichen.

Bevor wir ein Objekt hochladen, existiert keine Version:

bucket=yourbucketnamekey=tmp/testfileaws s3 ls "s3://$bucket/$key" # verify that no object existsaws s3api list-object-versions --bucket "$bucket" --prefix "$key"
{    "RequestCharged": null

Nach dem Hochladen eines Objekts sehen wir das Objekt und eine einzelne Objektversion:

dd if=/dev/urandom bs=1M count=2 | aws s3 cp - s3://$bucket/$keyaws s3 ls s3://$bucket/$key
2023-11-21 00:33:09    2097152 testfile
aws s3api list-object-versions --bucket "$bucket" --prefix "$key"
{    "Versions": [        {            "ETag": "\"18f78ecf07a0c41e8ec2defa200a5029\"",            "Size": 2097152,            "StorageClass": "STANDARD",            "Key": "tmp/testfile",            "VersionId": "bUWdb14EppQR13KLVapM699xySNlo9yR",            "IsLatest": true,            "LastModified": "2023-11-20T23:33:09+00:00",            "Owner": {...}        }    ],    "RequestCharged": null

Das Löschen der Datei fügt einen Löschmarker hinzu:

aws s3 rm s3://$bucket/$keyaws s3api list-object-versions --bucket "$bucket" --prefix "$key"
{    "Versions": [        {            "ETag": "\"18f78ecf07a0c41e8ec2defa200a5029\"",            "Size": 2097152,            "StorageClass": "STANDARD",            "Key": "tmp/testfile",            "VersionId": "bUWdb14EppQR13KLVapM699xySNlo9yR",            "IsLatest": false,            "LastModified": "2023-11-20T23:33:09+00:00",            "Owner": {}        }    ],    "DeleteMarkers": [        {            "Owner": {},            "Key": "tmp/testfile",            "VersionId": "kNig7WIYhADWCr47u_nRrQ8QYdeW4eIj",            "IsLatest": true,            "LastModified": "2023-11-20T23:34:59+00:00"        }    ],    "RequestCharged": null

Die Auflistung von Objekten mit aws s3 ls ergibt ein leeres Ergebnis. Das Entfernen eines Löschmarkers würde das Objekt wiederherstellen. Sie könnten dies wie folgt tun (aber lassen Sie es vorerst):

vid="kNig7WIYhADWCr47u_nRrQ8QYdeW4eIj"aws s3api delete-object --bucket "$bucket" --key "$key" --version-id "$vid"

Was sind aktuelle und nicht aktuelle Objekterlöschmarker?

Wenn ein Löschmarker das neueste oder aktuelle Element im Versionsstapel ist, bezeichnen wir ihn als aktuellen Objekterlöschmarker. Andernfalls bezeichnen wir ihn als nicht aktuellen Objekterlöschmarker. Im obigen Beispiel ist der einzelne Löschmarker am Präfix tmp/testfile ein aktueller Löschmarker. Das Hochladen eines weiteren Objekts an denselben Ort erstellt eine neue Objektversion:

dd if=/dev/urandom bs=1M count=2 | aws s3 cp - s3://$bucket/$keyaws s3api list-object-versions --bucket "$bucket" --prefix "$key"
{    "Versions": [        {            "Key": "tmp/testfile",            "VersionId": "l3_yEX5pQZCloovHVMsbIgbzP1pqZ4iU",            "IsLatest": true,            ...        },        {            "Key": "tmp/testfile",            "VersionId": "bUWdb14EppQR13KLVapM699xySNlo9yR",            "IsLatest": false,            ...        }    ],    "DeleteMarkers": [        {            "Key": "tmp/testfile",            "VersionId": "kNig7WIYhADWCr47u_nRrQ8QYdeW4eIj",            "IsLatest": false,            ...        }    ],    "RequestCharged": null

Zu diesem Zeitpunkt ist der Löschmarker mit der Versions-ID kNig7WIYhADWCr47u_nRrQ8QYdeW4eIj immer noch vorhanden, hat jedoch „nicht aktuell“ geworden, wie durch seine Eigenschaft IsLatest mit dem Wert false angezeigt.

Was sind abgelaufene Objekterlöschmarker?

Abgelaufene Objekterlöschmarker sind Löschmarker an einem Präfix ohne nicht aktuelle Objektversionen. Wir können den Löschmarker aus unserem Beispiel in einen abgelaufenen Objekterlöschmarker verwandeln, indem wir die Objektversionen am selben Speicherort entfernen:

aws s3api delete-object --bucket $bucket --key $key \  --version-id l3_yEX5pQZCloovHVMsbIgbzP1pqZ4iUaws s3api delete-object --bucket $bucket --key $key \  --version-id bUWdb14EppQR13KLVapM699xySNlo9yRaws s3api list-object-versions --bucket "$bucket" --prefix "$key"
{    "DeleteMarkers": [        {            "Key": "tmp/testfile",            "VersionId": "kNig7WIYhADWCr47u_nRrQ8QYdeW4eIj",            "IsLatest": true,            ...        }    ],    "RequestCharged": null

Der Löschmarker mit der Versions-ID kNig7WIYhADWCr47u_nRrQ8QYdeW4eIj ist jetzt ein abgelaufener Objekterlöschmarker.

Warum sind abgelaufene Objekterlöschmarker schlecht?

Das Problem ist, dass abgelaufene Objekterlöschmarker aktuell sein können und für immer in Ihrem Bucket bleiben können, es sei denn, Sie unternehmen etwas dagegen. Verweilte Marker können Listenanforderungen verlangsamen und zu redundanten Ergebnissen bei der Auflistung von Objektversionen führen.

Wenn Sie die Versionierung für Buckets aktivieren, implementieren Sie in der Regel eine Ablaufpolitik für nicht aktuelle Elemente, da es sonst schnell prohibitively teuer werden kann. Mit einer solchen Richtlinie werden alle Löschmarker schließlich zu aktuellen, abgelaufenen. Ihre Ablaufpolitik entfernt diese nicht aus Ihrem Bucket. In unserem Beispiel wird der Löschmarker am tmp/testfile von einer Richtlinie, die nicht aktuelle Versionen ablaufen lässt, niemals automatisch entfernt.

Wie kann ich abgelaufene Objekterlöschmarker entfernen?

Sie können Löschmarker manuell entfernen:

id=kNig7WIYhADWCr47u_nRrQ8QYdeW4eIj
aws s3api delete-object --bucket $bucket --key $key --version-id $id

Wie kann ich abgelaufene Objekterlöschmarker wirklich entfernen?

Wie bei Multipart-Uploads ist der beste Weg, abgelaufene Objekterlöschmarker zu entfernen, durch eine explizite (Ablauf-)Lebenszyklusrichtlinie, die sich an abgelaufene Objekterlöschmarker richtet. Eine Möglichkeit, dies zu tun, besteht darin, ein Kontrollkästchen in der Konsole zu aktivieren (siehe Screenshot oben). (Sie sollten wahrscheinlich ein IaC-Tool verwenden.)

Gibt es hierbei Nachteile?

Im unwahrscheinlichen Fall, dass Sie ein Protokoll über die Objekte haben möchten, die in der Vergangenheit existiert haben, und wann sie entfernt wurden, aber nicht die Möglichkeit benötigen, diese Objekte wiederherzustellen, überlegen Sie, abgelaufene Objekterlöschmarker nicht zu entfernen. Was abgebrochene Multipart-Uploads betrifft, so ist das Entfernen von Löschmarkern durch Lebenszyklusrichtlinien kostenlos. Löschmarker existieren nur in versionierten Buckets, aber eine Richtlinie zu deren Entfernung ist nie schädlich.

Fazit

Wir haben gesehen, was unvollständige Multipart-Uploads sind und warum Sie die abgebrochenen abbrechen sollten. Wir haben auch gesehen, was abgelaufene Objekterlöschmarker sind, dass sie aktuell sein können und dass Sie sie entfernen sollten. AWS bricht von sich aus nichts ab oder entfernt es. Erstellen Sie daher immer eine Bucket mit einer Ablaufluftlebenszyklusrichtlinie, die Multipart-Uploads nach ein paar Tagen abbricht und abgelaufene Objekterlöschmarker entfernt.


👏 Wenn Ihnen dieser Artikel gefallen hat, vergessen Sie nicht zu klatschen🗣️ Teilen Sie Ihre Gedanken in den Kommentaren; ich werde versuchen, zu antworten🗞️ Folgen Sie mir und abonnieren Sie datamindedbe für weitere Beiträge zu Cloud-, Plattform-, Daten- und Softwareengineering👀 Für mehr über Data Minded besuchen Sie unsere Website

Latest

Portable by design: Rethinking data platforms in the age of digital sovereignty
Portable by design: Rethinking data platforms in the age of digital sovereignty
Portable by design: Rethinking data platforms in the age of digital sovereignty

Portable by design: Rethinking data platforms in the age of digital sovereignty

Build a portable, EU-compliant data platform and avoid vendor lock-in—discover our cloud-neutral stack in this deep-dive blog.

Cloud-Unabhängigkeit: Test eines europäischen Cloud-Anbieters gegen die Giganten
Cloud-Unabhängigkeit: Test eines europäischen Cloud-Anbieters gegen die Giganten
Cloud-Unabhängigkeit: Test eines europäischen Cloud-Anbieters gegen die Giganten

Cloud-Unabhängigkeit: Test eines europäischen Cloud-Anbieters gegen die Giganten

Kann ein europäischer Cloud-Anbieter wie Ionos AWS oder Azure ersetzen? Wir testen es – und finden überraschende Vorteile in Bezug auf Kosten, Kontrolle und Unabhängigkeit.

Hören Sie auf, schlechte Qualitätsdaten zu laden
Hören Sie auf, schlechte Qualitätsdaten zu laden
Hören Sie auf, schlechte Qualitätsdaten zu laden

Vermeide schlechte Daten von Anfang an

Das Erfassen aller Daten ohne Qualitätsprüfungen führt zu wiederkehrenden Problemen. Priorisieren Sie die Datenqualität von Anfang an, um nachgelagerte Probleme zu vermeiden.

Hinterlasse deine E-Mail-Adresse, um den Dataminded-Newsletter zu abonnieren.

Hinterlasse deine E-Mail-Adresse, um den Dataminded-Newsletter zu abonnieren.

Hinterlasse deine E-Mail-Adresse, um den Dataminded-Newsletter zu abonnieren.

Belgien

Vismarkt 17, 3000 Leuven - HQ
Borsbeeksebrug 34, 2600 Antwerpen


USt-IdNr. DE.0667.976.246

Deutschland

Spaces Kennedydamm,
Kaiserswerther Strasse 135, 40474 Düsseldorf, Deutschland


© 2025 Dataminded. Alle Rechte vorbehalten.


Vismarkt 17, 3000 Leuven - HQ
Borsbeeksebrug 34, 2600 Antwerpen

USt-IdNr. DE.0667.976.246

Deutschland

Spaces Kennedydamm, Kaiserswerther Strasse 135, 40474 Düsseldorf, Deutschland

© 2025 Dataminded. Alle Rechte vorbehalten.


Vismarkt 17, 3000 Leuven - HQ
Borsbeeksebrug 34, 2600 Antwerpen

USt-IdNr. DE.0667.976.246

Deutschland

Spaces Kennedydamm, Kaiserswerther Strasse 135, 40474 Düsseldorf, Deutschland

© 2025 Dataminded. Alle Rechte vorbehalten.