Ich habe Millionen von Dateien in einem Amazon S3-Bucket und möchte diese Dateien mit möglichst geringen oder keinen Kosten in andere Buckets und Ordner verschieben. Alle Eimer befinden sich in derselben Zone.
Wie könnte ich das machen?
Ich habe Millionen von Dateien in einem Amazon S3-Bucket und möchte diese Dateien mit möglichst geringen oder keinen Kosten in andere Buckets und Ordner verschieben. Alle Eimer befinden sich in derselben Zone.
Wie könnte ich das machen?
Antworten:
Millionen sind eine große Zahl - darauf komme ich später zurück.
Unabhängig von Ihrer Vorgehensweise muss der zugrunde liegende Mechanismus direkt von einem Bucket in einen anderen kopiert werden. Auf diese Weise (da sich Ihre Buckets in derselben Region befinden) fallen für die Bandbreite keine Gebühren an. Jeder andere Ansatz ist einfach ineffizient (z. B. Herunterladen und erneutes Hochladen der Dateien).
Das Kopieren zwischen Buckets wird mithilfe von 'PUT-Kopie' durchgeführt - das ist eine PUT-Anforderung, die den Header 'x-amz-copy-source' enthält. Ich glaube, dies wird als COPY-Anforderung eingestuft. Dadurch werden die Datei und standardmäßig die zugehörigen Metadaten kopiert. Sie müssen ein 'x-amz-acl' mit dem richtigen Wert einfügen, wenn Sie die ACL gleichzeitig festlegen möchten (andernfalls wird standardmäßig private verwendet). Ihre COPY-Anfragen werden in Rechnung gestellt (0,01 USD / 1.000 Anfragen). Sie können die nicht benötigten Dateien nach dem Kopieren löschen (DELETE-Anforderungen werden nicht berechnet). (Ein Punkt, über den ich nicht ganz klar bin, ist, ob für eine COPY-Anforderung auch die Gebühr für eine GET-Anforderung anfällt oder nicht, da das Objekt zuerst aus dem Quellen-Bucket abgerufen werden muss. Andernfalls beträgt die Gebühr zusätzlich 0,01 USD / 10.000 USD Anfragen).
Die oben genannten Gebühren sind anscheinend unvermeidbar - für eine Million Objekte sehen Sie ungefähr 10 US-Dollar (oder 11 US-Dollar). Da Sie die Dateien letztendlich tatsächlich im Ziel-Bucket erstellen müssen, können andere Ansätze (z. B. gezippte Dateien, Amazon Import / Export usw.) diese Kosten nicht umgehen. Trotzdem lohnt es sich möglicherweise, sich an Amazon zu wenden, wenn Sie mehr als ein paar Millionen Objekte übertragen möchten.
In Anbetracht des oben genannten (unvermeidbaren Preises) muss als Nächstes die Zeit untersucht werden, was ein wichtiger Faktor beim Kopieren von "Millionen von Dateien" sein wird. Für alle Tools, die die direkte Kopie zwischen Eimern ausführen können, wird dieselbe Gebühr erhoben. Leider benötigen Sie eine Anforderung pro Datei (zum Kopieren), eine Anforderung zum Löschen und möglicherweise eine Anforderung zum Lesen der ACL-Daten (wenn Ihre Dateien unterschiedliche ACLs aufweisen). Die beste Geschwindigkeit kommt von dem, was die parallelsten Operationen ausführen kann.
Es gibt einige Kommandozeilenansätze, die durchaus sinnvoll sein könnten:
Es gibt einige Möglichkeit ist , dass s3fs funktionieren könnte - es ganz parallel ist, unterstützt jedoch Kopien zwischen dem gleichen Eimer - NICHT unterstützt Kopien zwischen verschiedenen Eimern, aber vielleicht bewegt sich zwischen verschiedenen Eimern unterstützen.
Ich würde mit s3cmd-modification beginnen und nachsehen, ob Sie damit Erfolg haben, oder mich an Amazon wenden, um eine bessere Lösung zu finden.
aws s3 sync s3://source s3://destination
rein?
Altes Thema, aber das ist für jeden, der das gleiche Szenario untersucht. Zusammen mit der Zeit, die ich gebraucht habe, für mehr als 20.000 Objekte. Läuft unter AWS Linux / Centos, wobei jedes Objekt größtenteils aus Bildern sowie einigen Videos und verschiedenen Mediendateien besteht.
Verwenden der AWS CLI-Tools zum Kopieren der Dateien von Bucket A nach Bucket B.
A. Erstellen Sie den neuen Bucket
$ aws s3 mb s3://new-bucket-name
B. Synchronisieren Sie den alten mit dem neuen Eimer
$ aws s3 sync s3://old-bucket-name s3://new-bucket-name
Mehr als 20.000 Objekte werden kopiert ...
Gestartet um 17:03 Uhr
17.06 Uhr beendet
Gesamtzeit für mehr als 20.000 Objekte = ca. 3 Minuten
Sobald der neue Bucket richtig konfiguriert ist, dh Berechtigungen, Richtlinien usw. und Sie möchten den alten Bucket entfernen.
C. Entfernen / Löschen Sie den alten Eimer
$ aws s3 rb --force s3://old-bucket-name
Ich bin nicht sicher, ob dies der beste Ansatz ist, aber die AWS-Verwaltungskonsole verfügt über eine Funktion zum Ausschneiden, Kopieren und Einfügen. sehr einfach zu bedienen und effizient.
Ich würde mir vorstellen, dass Sie inzwischen wahrscheinlich eine gute Lösung gefunden haben, aber für andere, die auf dieses Problem stoßen (wie ich es gerade getan habe), habe ich ein einfaches Dienstprogramm speziell zum Spiegeln eines S3-Buckets auf einen anderen in Handarbeit gemacht Eine sehr zeitgleiche und dennoch CPU- und speichereffiziente Methode.
Es ist auf Github unter einer Apache-Lizenz hier: https://github.com/cobbzilla/s3s3mirror
Wenn Sie es versuchen möchten, lassen Sie es mich bitte wissen, wenn Sie Feedback haben.
--cross-account-copy
Option ( -C
kurz), um dies zu tun. Beachten Sie, dass beim kontenübergreifenden Kopieren die ACLs nicht kopiert werden. Der Eigentümer des Ziel-Buckets hat vollständige Berechtigungen für die kopierten Daten.
Die AWS-CLI bietet die Möglichkeit, einen Bucket in einen anderen in parallelen Prozessen zu kopieren. Entnommen aus https://stackoverflow.com/a/40270349/371699 :
Mit den folgenden Befehlen wird die AWS-CLI angewiesen, 1.000 Threads zum Ausführen von Jobs (jeweils eine kleine Datei oder ein Teil einer mehrteiligen Kopie) zu verwenden und 100.000 Jobs vorauszusehen:
aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000
Nachdem Sie diese ausgeführt haben, können Sie den einfachen Synchronisierungsbefehl wie folgt verwenden:
aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path
Auf einer m4.xlarge-Maschine (in AWS-4-Kernen, 16 GB RAM) stieg die Synchronisations- / Kopiergeschwindigkeit für meinen Fall (3-50 GB Dateien) von 9,5 MB / s auf 700 + MiB / s, was einer Geschwindigkeitssteigerung entspricht 70x über der Standardkonfiguration.
Wählen Sie im verlorenen Bucket die Datei (en) aus, die Sie in einen anderen Bucket kopieren möchten.