Wie kann ich Dateien mit minimalen Kosten zwischen zwei S3-Buckets verschieben?

44

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?

Daniel Cukier
quelle

Antworten:

53

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:

  • Die s3cmd-Modifikation (diese spezifische Pull-Anforderung) enthält parallele cp- und mv-Befehle und sollte eine gute Option für Sie sein.
  • Die AWS-Konsole kann die Kopie direkt ausführen - ich kann jedoch nicht für die Parallelität sprechen.
  • Das aws- Skript von Tim Kay kann die Kopie erstellen - aber es ist nicht parallel - Sie müssen es skripten, um die gewünschte vollständige Kopie auszuführen (wahrscheinlich nicht die beste Option in diesem Fall - obwohl es ein großartiges Skript ist).
  • CloudBerry S3 Explorer , Bucket Explorer und CloudBuddy sollten alle in der Lage sein, die Aufgabe auszuführen, obwohl ich nicht weiß, wie sich die Effizienz der einzelnen Komponenten zusammensetzt. Ich glaube jedoch, dass die Multithread-Funktionen der meisten von ihnen den Kauf der Software erfordern.
  • Erstellen Sie mit einem der verfügbaren SDKs ein eigenes Skript.

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.

cyberx86
quelle
Bucket Explorer scheint für mich gut zu funktionieren (derzeit werden Dateien zwischen zwei Eimern verschoben)
Noodles
3
Wo passt das aws s3 sync s3://source s3://destinationrein?
Olivier Lalonde
7

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
user1360528
quelle
Lebensretter. Ich kopiere mehr als 300 GB. Ein Tipp: Wenn Sie aus Eimern in derselben Region kopieren, ist dies viel schneller als in einer anderen Region (und ich lese, es ist billiger).
Marcelo Agimóvel
Ich hatte ein Problem mit Ihrer Methode: Der Datenschutz für Dateien wurde auf PRIVAT gesetzt, auch wenn die meisten Objekte öffentlich sind. Was ist passiert?
Marcelo Agimóvel
5

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.

Itikos Kleinos
quelle
6
Mit einer Million Dateien wird das wahrscheinlich nicht gut funktionieren.
James
@ James kann schmerzlich bestätigen;)
Rob
3

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.

Cobbzilla
quelle
Ich hatte eine großartige Erfahrung mit s3s3mirror. Ich konnte es auf einem m1.small EC2-Knoten einrichten und 1,5 Millionen Objekte in ca. 2 Stunden kopieren. Das Setup war etwas schwierig, da ich mit Maven und Java nicht vertraut war, aber es waren nur ein paar apt-get-Befehle unter Ubuntu erforderlich, um alles zu installieren. Ein letzter Hinweis: Wenn Sie (wie ich) Bedenken haben, ein unbekanntes Skript auf einem großen, wichtigen s3-Bucket auszuführen, erstellen Sie einen speziellen Benutzer mit Lesezugriff auf den Copy-from-Bucket und verwenden Sie diese Anmeldeinformationen. Keine Chance auf versehentliches Löschen.
Micah
Kann dies auf Buckets zwischen verschiedenen Konten angewendet werden?
Oliver Burdekin
@OliverBurdekin ja es gibt eine --cross-account-copyOption ( -Ckurz), 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.
Cobbzilla
Danke @rfcreader Wie kann ich die Kosten dafür abschätzen? Ich kenne den AWS-Kostenrechner, habe aber keine Ahnung, was dieser Prozess in Bezug auf die Anzahl der get-put-Anfragen usw. beinhaltet. Ich stelle mir vor, dass es ziemlich einfach ist, diese Metriken mithilfe der CLI zu zählen. Wenn Sie jedoch mehr wissen, wenden Sie sich an uns. AWS-Support schlägt "Antragsteller zahlt" vor. Ha!
Oliver Burdekin
@OliverBurdekin s3s3mirror protokolliert die Anzahl der AWS-Anforderungen nach Typ (GET, COPY, DELETE usw.). Diese Statistiken werden bei der Ausführung in regelmäßigen Abständen und ein letztes Mal am Ende ausgedruckt. Sie könnten einen eingeschränkten / Testlauf durchführen, um eine kleine Teilmenge der Objekte zu kopieren. Dies sollte Ihnen ein allgemeines Gefühl dafür geben, wie viele Gesamtanforderungen erforderlich sind, um den gesamten Datensatz zu kopieren.
Cobbzilla
2

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.

Zeit zu fliegen
quelle
0

Wählen Sie im verlorenen Bucket die Datei (en) aus, die Sie in einen anderen Bucket kopieren möchten.

  • Wählen Sie unter "Aktionen" die Option "Kopieren".
  • Gehe zum Gewinnungseimer.
  • Wählen Sie unter "Aktionen" die Option "Einfügen".
John
quelle
1
Warum eine Lösung wiederholen, die andere vor einem Jahr erwähnt haben?
Benjamin