Ich bin ziemlich zufrieden mit s3cmd, aber es gibt ein Problem: Wie kopiere ich alle Dateien von einem S3-Bucket in einen anderen? Ist es überhaupt möglich?
BEARBEITEN: Ich habe einen Weg gefunden, Dateien zwischen Buckets mit Python mit boto zu kopieren:
from boto.s3.connection import S3Connection
def copyBucket(srcBucketName, dstBucketName, maxKeys = 100):
conn = S3Connection(awsAccessKey, awsSecretKey)
srcBucket = conn.get_bucket(srcBucketName);
dstBucket = conn.get_bucket(dstBucketName);
resultMarker = ''
while True:
keys = srcBucket.get_all_keys(max_keys = maxKeys, marker = resultMarker)
for k in keys:
print 'Copying ' + k.key + ' from ' + srcBucketName + ' to ' + dstBucketName
t0 = time.clock()
dstBucket.copy_key(k.key, srcBucketName, k.key)
print time.clock() - t0, ' seconds'
if len(keys) < maxKeys:
print 'Done'
break
resultMarker = keys[maxKeys - 1].key
Die Synchronisierung ist fast so einfach wie das Kopieren. Für Schlüssel sind Felder für ETag, Größe und zuletzt geändert verfügbar.
Vielleicht hilft das auch anderen.
copy
amazon-s3
amazon-web-services
Jan Deinhard
quelle
quelle
Antworten:
s3cmd sync s3://from/this/bucket/ s3://to/this/bucket/
Für verfügbare Optionen verwenden Sie bitte:
$s3cmd --help
quelle
s3cmd sync s3://sample_bucket/ s3://staging_bucket/
hat es für mich gut funktioniert.AWS CLI scheint die Arbeit perfekt zu machen und hat den Vorteil, ein offiziell unterstütztes Tool zu sein.
http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html
quelle
Die Antwort mit den meisten positiven Stimmen, während ich dies schreibe, ist folgende:
Es ist eine nützliche Antwort. Aber manchmal ist die Synchronisierung nicht das, was Sie brauchen (sie löscht Dateien usw.). Es hat lange gedauert, bis ich diese Alternative ohne Skripte gefunden hatte, um einfach mehrere Dateien zwischen Buckets zu kopieren. (OK, in dem unten gezeigten Fall ist es nicht zwischen Buckets. Es ist zwischen Nicht-wirklich-Ordnern, aber es funktioniert zwischen Buckets gleich gut.)
Erläuterung des obigen Befehls:
Meiner Meinung nach ist meine Anforderung nicht rekursiv. Ich möchte einfach mehrere Dateien. In diesem Zusammenhang weist rekursiv s3cmd cp jedoch nur an, mehrere Dateien zu verarbeiten. Großartig.
Es ist eine seltsame Art, sich das Problem vorzustellen . Beginnen Sie mit der rekursiven Auswahl aller Dateien. Schließen Sie als Nächstes alle Dateien aus. Warte was?
jetzt reden wir. Geben Sie das Dateipräfix (oder Suffix oder ein beliebiges Muster) an, das Sie einschließen möchten.
s3://sourceBucket/ s3://targetBucket/
Dieser Teil ist intuitiv genug. Obwohl es technisch gesehen gegen das dokumentierte Beispiel aus der s3cmd-Hilfe zu verstoßen scheint, das angibt, dass ein Quellobjekt angegeben werden muss:
s3cmd cp s3://BUCKET1/OBJECT1 s3://BUCKET2[/OBJECT2]
quelle
s3cmd sync --max-delete=0 s3://from s3://to
?--no-delete-removed
was noch mehr auf den Punkt scheint.Sie können dazu auch die Weboberfläche verwenden:
Das ist es.
quelle
Ich musste einen sehr großen Bucket kopieren, also passte ich den Code in der Frage in eine Multithread-Version an und stellte ihn auf GitHub.
https://github.com/paultuckey/s3-bucket-to-bucket-copy-py
quelle
Es ist tatsächlich möglich. Das hat bei mir funktioniert:
quelle
boto.s3.key
Objekt, siehe hier . Dies ist jedoch eine gute Möglichkeit, eine Datei direkt zu kopieren / zu verschieben, ohne sich um Details mit Unterordnern kümmern zu müssen .Danke - Ich verwende eine leicht modifizierte Version, in der ich nur Dateien kopiere, die nicht existieren oder eine andere Größe haben, und am Ziel überprüfe, ob der Schlüssel in der Quelle vorhanden ist. Ich fand das etwas schneller, um die Testumgebung vorzubereiten:
quelle
Ich habe ein Skript geschrieben, das einen S3-Bucket sichert: https://github.com/roseperrone/aws-backup-rake-task
Ich benutze dies in einer Rechenaufgabe (für eine Rails-App):
quelle
Der Code von mdahlman hat bei mir nicht funktioniert, aber dieser Befehl kopiert alle Dateien in Bucket1 in einen neuen Ordner (Befehl erstellt auch diesen neuen Ordner) in Bucket 2.
quelle
s3cmd wird nicht nur mit Präfixen oder Platzhaltern cp, aber Sie können das Verhalten mit 's3cmd ls sourceBucket' und awk skripten, um den Objektnamen zu extrahieren. Verwenden Sie dann 's3cmd cp sourceBucket / name destBucket', um jeden Objektnamen in der Liste zu kopieren.
Ich verwende diese Batch-Dateien in einer DOS-Box unter Windows:
s3list.bat
s3copy.bat
quelle
Sie können auch s3funnel verwenden, das Multithreading verwendet:
https://github.com/neelakanta/s3funnel
Beispiel (ohne die angezeigten Zugriffsschlüssel- oder Geheimschlüsselparameter):
s3funnel Quell-Bucket-Namensliste | s3funnel dest-Bucket-Name Kopie - Source-Bucket Source-Bucket-Name - Threads = 10
quelle