AWS unterstützt das Massenlöschen von bis zu 1000 Objekten pro Anforderung mithilfe der S3-REST-API und ihrer verschiedenen Wrapper. Bei dieser Methode wird davon ausgegangen, dass Sie die zu entfernenden S3-Objektschlüssel kennen (dh, sie sind nicht für die Verarbeitung von Aufbewahrungsrichtlinien, Dateien mit einer bestimmten Größe usw. ausgelegt).
Die S3-REST-API kann angeben, dass bis zu 1000 Dateien in einer einzelnen Anforderung gelöscht werden sollen. Dies muss schneller sein als das Ausführen einzelner Anforderungen. Denken Sie daran, dass jede Anforderung eine HTTP-Anforderung (also eine TCP-Anforderung) ist. Daher ist jede Anforderung mit einem Mehraufwand verbunden. Sie müssen nur die Schlüssel der Objekte kennen und eine HTTP-Anfrage erstellen (oder einen Wrapper in der Sprache Ihrer Wahl verwenden). AWS bietet hervorragende Informationen zu dieser Funktion und ihrer Verwendung . Wählen Sie einfach die Methode, mit der Sie sich am wohlsten fühlen!
Ich gehe davon aus, dass in Ihrem Anwendungsfall Endbenutzer eine Reihe bestimmter Dateien angeben, die gleichzeitig gelöscht werden sollen. Anstatt eine Aufgabe wie "Alle Objekte löschen, die auf Bilddateien verweisen" oder "Alle Dateien löschen, die älter als ein bestimmtes Datum sind" zu starten (was meines Erachtens in S3 einfach zu konfigurieren ist).
In diesem Fall kennen Sie die Schlüssel, die Sie löschen müssen. Dies bedeutet auch, dass der Benutzer mehr Echtzeit-Feedback darüber erhalten möchte, ob seine Datei erfolgreich gelöscht wurde oder nicht. Die Verweise auf exakte Schlüssel sollten sehr schnell sein, da S3 so konzipiert wurde, dass es trotz der Verarbeitung einer extrem großen Datenmenge effizient skaliert.
Wenn nicht, können Sie asynchrone API-Aufrufe untersuchen. In diesem Blogbeitrag können Sie nachlesen, wie sie im Allgemeinen funktionieren würden, oder nach Anleitungen in der Sprache Ihrer Wahl suchen. Auf diese Weise kann die Löschanforderung einen eigenen Thread belegen, und der Rest des Codes kann ausgeführt werden, ohne dass ein Benutzer wartet. Sie können die Anforderung auch in eine Warteschlange verschieben. . . Beide Optionen erschweren jedoch unnötigerweise entweder Ihren Code (asynchroner Code kann ärgerlich sein) oder Ihre Umgebung (Sie benötigen einen Service / Daemon / Container / Server für die Verarbeitung der Warteschlange. Daher würde ich dieses Szenario nach Möglichkeit vermeiden.
Bearbeiten: Ich habe nicht den Ruf, mehr als 2 Links zu posten. Aber Sie hier Amazon Kommentare auf Anfrage Preis und Leistung sehen: http://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html Und die s3 FAQ Kommentare , die Masse deleiton ist die weit, wenn möglich.
aws s3api list-objects --output text --bucket BUCKET --query 'Contents[].[Key]' | pv -l > BUCKET.keys
Und dann Objekte entfernen (das hat ausgereicht, dass durch das Überschreiten von 1 parallelen Prozess die Ratenbeschränkungen für das Löschen von Objekten erreicht wurden):tail -n+0 BUCKET.keys | pv -l | grep -v -e "'" | tr '\n' '\0' | xargs -0 -P1 -n1000 bash -c 'aws s3api delete-objects --bucket BUCKET --delete "Objects=[$(printf "{Key=%q}," "$@")],Quiet=true"' _
_
Ende wahrscheinlich auch die Wichtigkeit betonen sollen :) Ich habe es verpasst und dann habe ich eine ganze Weile gebraucht, um zu verstehen, warum das erste Element übersprungen wird. Der Punkt ist, dassbash -c
alle Argumente als Positionsparameter übergeben werden, beginnend mit$0
, während "$ @" nur Parameter verarbeitet, die mit beginnen$1
. Der Unterstrich-Dummy wird also benötigt, um die Position von zu füllen$0
.split -l 1000
meine Schlüsseldatei in 1000 Schlüsselstapel aufgeteilt. Jetzt kann ich für jede Datei den Löschbefehl ausgeben und dann die Datei löschen. Wenn etwas schief geht, kann ich weitermachen.aws s3 ls "s3://MY_BUCKET_NAME/SOME_SUB_DIR" | awk '{print $4}'
wäre einfacher und Sie können ein hinzufügen| grep
, um das von dort nach unten zu filtern.Ich war frustriert über die Leistung der Webkonsole für diese Aufgabe. Ich fand, dass der AWS CLI- Befehl dies gut macht. Beispielsweise:
aws s3 rm --recursive s3://my-bucket-name/huge-directory-full-of-files
Bei einer großen Dateihierarchie kann dies einige Zeit in Anspruch nehmen. Sie können dies in einer
tmux
oder einerscreen
Sitzung ausführen und später erneut versuchen.quelle
aws s3 rm --recursive
Befehl Dateien einzeln löschen. Obwohl es schneller als die Webkonsole ist, könnte es beim Löschen vieler Dateien viel schneller sein, wenn es in großen Mengen gelöscht wirdEin guter Trick ist die Verwendung von Lebenszyklusregeln, um das Löschen für Sie zu erledigen. Sie können eine Regel in eine Warteschlange stellen, um das gewünschte Präfix oder die gewünschten Objekte zu löschen, und Amazon kümmert sich nur um das Löschen.
https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html
quelle
Ohne zu wissen, wie Sie die S3-Buckets verwalten, kann dies besonders nützlich sein oder auch nicht.
Das AWS CLI-Tool verfügt über eine Option namens "Sync", die besonders effektiv sein kann, um sicherzustellen, dass s3 die richtigen Objekte hat. Wenn Sie oder Ihre Benutzer S3 von einem lokalen Dateisystem aus verwalten, können Sie möglicherweise eine Menge Arbeit sparen, um mithilfe der CLI-Tools zu bestimmen, welche Objekte gelöscht werden müssen.
http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
quelle
Es wurde bereits der
s3 sync
Befehl erwähnt, jedoch ohne Beispiel und das Wort zur--delete
Option.Ich habe den schnellsten Weg gefunden, den Inhalt eines Ordners im
S3
Eimer zu löschenmy_bucket
:quelle