Aktualisieren
Wie von alberge (+1) hervorgehoben, bietet die hervorragende AWS-Befehlszeilenschnittstelle heutzutage den vielseitigsten Ansatz für die Interaktion mit (fast) allen Dingen von AWS - sie deckt mittlerweile die APIs der meisten Dienste ab und bietet auch S3-Befehle auf höherer Ebene für den Umgang mit Ihren Anwendungsfall speziell, siehe AWS CLI-Referenz für S3 :
- sync - Synchronisiert Verzeichnisse und S3-Präfixe. Ihr Anwendungsfall fällt unter Beispiel 2 (mehr feinkörnige Nutzungs mit
--exclude
, --include
und Präfix Handling usw. ist ebenfalls verfügbar):
Der folgende Synchronisierungsbefehl synchronisiert Objekte unter einem bestimmten Präfix und Bucket mit Objekten unter einem anderen angegebenen Präfix und Bucket, indem s3-Objekte kopiert werden. [...]
aws s3 sync s3://from_my_bucket s3://to_my_other_bucket
Der Vollständigkeit halber möchte ich erwähnen, dass die S3-Befehle der unteren Ebene auch weiterhin über den Unterbefehl s3api verfügbar sind , mit dem jede SDK-basierte Lösung direkt in die AWS-CLI übersetzt werden kann, bevor die Funktionen der höheren Ebene schließlich übernommen werden.
Erste Antwort
Das Verschieben von Dateien zwischen S3 Eimer kann mittels der erreicht werden PUT Object - Copy API (gefolgt von DELETE Object ):
Diese Implementierung der PUT-Operation erstellt eine Kopie eines Objekts, das bereits in Amazon S3 gespeichert ist. Ein PUT-Kopiervorgang entspricht dem Ausführen eines GET und anschließend eines PUT. Durch Hinzufügen des Anforderungsheaders x-amz-copy-source kopiert die PUT-Operation das Quellobjekt in den Ziel-Bucket. Quelle
Für alle vorhandenen AWS SDKs stehen entsprechende Beispiele zur Verfügung, siehe Kopieren von Objekten in einem einzigen Vorgang . Natürlich wäre hier eine auf Skripten basierende Lösung die naheliegende erste Wahl. Daher kann das Kopieren eines Objekts mit dem AWS SDK für Ruby ein guter Ausgangspunkt sein. wenn Sie stattdessen Python bevorzugt, kann das gleiche über erreicht werden boto und natürlich sieht Methode copy_key()
innerhalb Boto der S3 API - Dokumentation .
PUT Object
Kopiert nur Dateien, daher müssen Sie eine Datei DELETE Object
nach einem erfolgreichen Kopiervorgang explizit über noch löschen. Dies sind jedoch nur noch wenige Zeilen, sobald das gesamte Skript für den Bucket und die Dateinamen vorhanden ist (es gibt auch entsprechende Beispiele) siehe z. B. Löschen eines Objekts pro Anforderung ).
Die neue offizielle AWS CLI unterstützt nativ die meisten Funktionen von
s3cmd
. Ich hatte zuvors3cmd
das Ruby AWS SDK verwendet, um solche Dinge zu tun, aber die offizielle CLI funktioniert hierfür hervorragend.http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
quelle
aws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1
nohup aws s3 sync s3://my-bucket-in-eu-west1 s3://my-bucket-in-eu-central1 --source-region=eu-west-1 --region=eu-central-1 &
ausführenZum Verschieben / Kopieren von einem Bucket in einen anderen oder denselben Bucket verwende ich das s3cmd-Tool und funktioniert einwandfrei. Zum Beispiel:
quelle
Ich habe Tage damit verbracht, mein eigenes benutzerdefiniertes Tool zu schreiben, um die dafür erforderlichen Kopien zu parallelisieren, aber dann bin ich auf die Dokumentation gestoßen, wie der AWS S3 CLI-Synchronisierungsbefehl zum Synchronisieren von Buckets mit massiver Parallelisierung verwendet werden kann . Die folgenden Befehle weisen die AWS-CLI an, 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:
Nachdem Sie diese ausgeführt haben, können Sie den einfachen Synchronisierungsbefehl wie folgt verwenden:
Auf einem m4.xlarge-Computer (in AWS - 4 Kerne, 16 GB RAM) stieg die Synchronisierungs- / Kopiergeschwindigkeit für meinen Fall (3-50 GB Dateien) von etwa 9,5 MB / s auf 700 + MiB / s, was einer Geschwindigkeitssteigerung von entspricht 70x über der Standardkonfiguration.
Update: Beachten Sie, dass S3CMD im Laufe der Jahre aktualisiert wurde und diese Änderungen jetzt nur wirksam werden, wenn Sie mit vielen kleinen Dateien arbeiten. Beachten Sie auch, dass S3CMD unter Windows (nur unter Windows) im Gesamtdurchsatz stark eingeschränkt ist und nur etwa 3 Gbit / s pro Prozess erreichen kann, unabhängig von der verwendeten Instanzgröße oder den verwendeten Einstellungen. Andere Systeme wie S5CMD haben das gleiche Problem. Ich habe mit dem S3-Team darüber gesprochen und sie prüfen es.
quelle
.NET Beispiel wie gewünscht:
mit Client ist so etwas wie
Es gibt vielleicht einen besseren Weg, aber es ist nur ein kurzer Code, den ich geschrieben habe, um einige Dateien zu übertragen.
quelle
Wenn Sie einen Unix-Host in AWS haben, verwenden Sie s3cmd von s3tools.org. Richten Sie Berechtigungen so ein, dass Ihr Schlüssel als Lesezugriff auf Ihren Entwicklungs-Bucket erfolgt. Dann renne:
quelle
s3cmd cp
, die--skip-existing
Option nicht akzeptiert , Sie sie jedochs3cmd sync
stattdessen mit vorhandenem ÜberspringenFür mich hat der folgende Befehl gerade funktioniert:
quelle
Hier ist eine Ruby-Klasse, um dies durchzuführen: https://gist.github.com/4080793
Anwendungsbeispiel:
quelle
Eigentlich verwende ich seit kurzem nur die Aktion Kopieren + Einfügen in der AWS s3-Oberfläche. Navigieren Sie einfach zu den Dateien, die Sie kopieren möchten, klicken Sie auf "Aktionen" -> "Kopieren" und navigieren Sie dann zum Zielbereich und zu "Aktionen" -> "Einfügen".
Es überträgt die Dateien ziemlich schnell und es scheint eine weniger komplizierte Lösung zu sein, die keine Programmierung erfordert, oder übertriebene Lösungen wie diese.
quelle
Wir hatten genau dieses Problem mit unseren ETL-Jobs bei Snowplow , also haben wir unseren parallelen Dateikopiercode (Ruby, der auf Fog basiert ) in sein eigenes Ruby-Juwel namens Sluice extrahiert :
https://github.com/snowplow/sluice
Sluice übernimmt auch das Löschen, Verschieben und Herunterladen von S3-Dateien. alle parallelisiert und mit automatischem erneuten Versuch, wenn eine Operation fehlschlägt (was überraschend oft der Fall ist). Ich hoffe es ist nützlich!
quelle
Ich weiß, dass dies ein alter Thread ist, aber für andere, die dort ankommen, ist mein Vorschlag, einen geplanten Job zu erstellen, um Inhalte aus dem Produktionsbereich in den Entwicklungsbereich zu kopieren.
Sie können verwenden Wenn Sie .NET verwenden, kann Ihnen dieser Artikel helfen
https://edunyte.com/2015/03/aws-s3-copy-object-from-one-bucket-or/
quelle
Für neue Version aws2.
quelle