Wie lösche ich eine versionierte Eimer in der AWS-S3 mithilfe der CLI?
Habe ich versucht, sowohl die s3cmd
:
$ s3cmd -r -f -v del s3://my-versioned-bucket/
Und die AWS CLI:
$ aws s3 rm s3://my-versioned-bucket/--recursive
Aber diese beiden Befehle einfach hinzufügen DELETE
Marker S3. Der Befehl zum entfernen der Eimer auch nicht funktioniert (von der AWS CLI):
$ aws s3 rb s3://my-versioned-bucket/--force
Cleaning up. Please wait...
Completed 1 part(s) with ... file(s) remaining
remove_bucket failed: s3://my-versioned-bucket/A client error (BucketNotEmpty) occurred when calling the DeleteBucket operation: The bucket you tried to delete is not empty. You must delete all versions in the bucket.
Ok... wie? Es gibt keine Informationen in Ihre Dokumentation für diese. S3Cmd sagt, es ist ein 'vollwertiges' S3 command-line-tool, aber es macht kein Verweis auf Versionen anderen als seine eigenen. Gibt es eine Möglichkeit, dies zu tun, ohne über die web-Schnittstelle, die wird ewig dauern und erfordert mich zu halten, meinen laptop auf?
- Soweit ich weiß, würden Sie brauchen, um zu Durchlaufen und die Objekt-Versionen und löschen Sie Sie in Chargen von 1000...
- Wenn es sample-Java-code für dieses irgendwo, das wäre toll. AWS-Dokumentation, es ist wirklich schrecklich...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen Weg, es zu tun ist, Durchlaufen der Versionen und löschen Sie Sie. Ein bisschen schwierig auf die CLI, aber wie Sie schon erwähnten, Java, das wäre einfacher:
Können Sie auch batch löschen fordert Effizienz, wenn nötig.
first/1
, ...,first/9
usw. ... aber ein Kollege und ich gerade endete das löschen aller Versionen über das web-interface und Cyberduck. Danke für die Hilfe, wenn ich Sie brauchte es aber!Lief ich in die gleiche Einschränkung der AWS CLI. Ich fand die einfachste Lösung zu sein, um die Verwendung von Python und boto3:
Einer früheren version dieser Antwort verwendet boto aber, dass die Lösung hatte performance-Probleme mit großen zahlen Tasten wie Kichert hingewiesen.
Mit
boto3
es sogar noch einfacher als mit der vorgeschlagenenboto
Lösung zum löschen aller Versionen eines Objekts in einem S3-bucket:Funktioniert auch bei sehr großen Mengen von Objekt-Versionen, obwohl es einige Zeit dauern, in diesem Fall.
Löschen Sie alle Objekte in der Version s3-bucket.
Aber ich weiß nicht, wie das löschen von bestimmten Objekten.
Alternativ ohne
jq
:Ich lief in Probleme mit Abe ' s Lösung als
list_buckets
generator wird verwendet, um eine massive Liste genanntall_keys
und ich verbrachte eine Stunde, ohne es jemals Abschluss. Dieser tweak scheint besser zu funktionieren für mich, ich hatte fast eine million Objekte in meinem Eimer und zählen!Ich hoffe, dies hilft jemand anderes die Begegnung mit dieser S3 Alptraum!
$()
statt``
können Sie einbetten Variablen für bucket-Namen und-Schlüssel-Wert.Hier ist ein Einzeiler kann man nur schneiden und einfügen in die Kommandozeile zum löschen aller Versionen und löschen von Marken (es erfordert von aws-tools, ersetzen yourbucket-name-Sicherung, mit Ihrem Eimer Namen)
dann könnten Sie verwenden:
aws s3 rb s3://bucket-name --force
Bei weitem die einfachste Methode, die ich gefunden habe, ist das CLI tool
s3wipe
. Es ist vorgesehen, wie ein docker-container, so dass Sie können es verwenden, etwa so:Beispiel
Hier ist ein Beispiel, wo ich bin, das löschen aller versionierten Objekte in einen Eimer und dann löschen Sie den Eimer:
, Wie es funktioniert
Es ist ein bisschen zu entpacken hier, aber das oben ist wie folgt:
docker run -it --rm mikelorant/s3wipe
- läufts3wipe
container interaktiv und löscht es nach jeder Ausführung--id
&--key
- vorbei an unseren access key und access-id inaws configure get default.aws_access_key_id
- ruft unsere Schlüssel-idaws configure get default.aws_secret_access_key
- ruft unsere zentrale Geheimnis--path s3://bw-tf-backends-aws-example-logs
- Eimer, den wir löschen wollen--delbucket
- löscht Eimer einmal geleertReferenzen
https://gist.github.com/wknapik/191619bfa650b8572115cd07197f3baf
E. g.
empty_bucket.sh --bucket foo
Dies löscht alle Versionen eines Objekts und löschen von Markierungen in einem Eimer in Chargen von 1000. Danach werden die Eimer können gelöscht werden, mit
aws s3 rb s3://foo
.Erfordert bash, awscli und jq.
Dieses bash-Skript finden Sie hier: https://gist.github.com/weavenet/f40b09847ac17dd99d16
gearbeitet, da ist für mich.
Habe ich gespeichert als Skript: delete_all_versions.sh und dann einfach ran:
./delete_all_versions.sh my_foobar_bucket
... und das funktioniert ohne Fehler.
Nicht brauchen, python oder boto oder nichts.
Fand ich die anderen Antworten entweder unvollständig oder erfordern externe Abhängigkeiten installiert werden (wie boto), so ist hier eine, die inspiriert ist von denen, aber geht ein wenig tiefer.
Dokumentiert, wie in Arbeiten mit Löschen Marker, bevor eine versionierte Eimer kann entfernt werden, alle seine Versionen müssen komplett gelöscht werden, die ein 2-Schritt-Prozess:
gelöscht, aber nicht tatsächlich löschen Sie
Hier ist die Reine CLI-Lösung, die für mich gearbeitet (inspiriert durch die anderen Antworten):
Sobald dies geschehen ist, werden die folgenden arbeiten:
Nicht sicher, wie es wird-tarif mit 1000+ Objekte aber, wenn jemand berichten kann, das wäre genial.