Ich habe eine Datei in einem Schlüssel in meinem S3-Bucket enthalten. Ich möchte einen neuen Schlüssel erstellen, der dieselbe Datei enthält. Ist es möglich ohne diese Datei herunterzuladen? Ich suche eine Lösung in Python (und vorzugsweise Boto-Bibliothek).Wie klont man einen Schlüssel in Amazon S3 mit Python (und Boto)?
Antwort
S3 ermöglicht Objekt für Objektkopie. Die CopyObject-Operation erstellt eine Kopie eines Objekts, wenn Sie den Schlüssel und den Bucket eines Quellobjekts sowie den Schlüssel und den Bucket eines Zielziels angeben. Nicht sicher, ob Boto eine kompakte Implementierung hat.
Durchsuchen von Botos Quellcode Ich fand, dass das Key-Objekt eine "Kopieren" -Methode hat. Vielen Dank für Ihren Vorschlag zum CopyObject-Vorgang.
Wo Eimer ist das Ziel Schaufel:
bucket.copy_key(new_key,source_bucket,source_key)
Das liest tatsächlich den Schlüssel und legt es in den neuen Bucket - was nicht das ist, was Sie wollen. Es tut uns leid. –
Ich glaube nicht, dass das genau ist. Dies ist die beste Antwort IMO. Die 'copy_key'-Methode übergibt den' x-amz-copy-source' -Header in einer PUT-Anfrage, die S3 anweist, direkt von Region zu Region zu kopieren, ohne sie auf Ihren Rechner zu laden. – sergiopereira
Hier sind sie docs: http://boto.cloudhackers.com/en/latest/ref/s3.html#boto.s3.bucket.Bucket.copy_key – creimers
Obwohl niemand fragte, dachte ich, es relevant sein könnte, um zu zeigen, wie dies zu tun mit simples3
:
>>> b.copy("my_bucket/file.txt", "file_copy.txt", acl="public")
Ich bin nicht sicher, was Boto macht hier, aber es ist erwähnenswert, dass die Berechtigungen (ACL) nicht von S3 kopiert werden, wird es auf "private" zurückgesetzt, wenn nichts anderes angegeben ist. Um die ACL zu kopieren, müssen Sie zuerst danach fragen.
Ich zweite diesen Kommentar in Bezug auf die Berechtigungen (nach dem Auftreten eines Fehlers) 'dest_bucket .copy_key (Schlüssel.Name, Name_des_Src_Buches, Schlüssel.Name, Erhalt_Schl = Wahr) ' – nsof
Beachten Sie, dass die Methode 'copy' für das Objekt Key einen Parameter 'preserve_acl' (standardmäßig False) aufweist, der die ACL der Quelle in das Zielobjekt kopiert.
from boto.s3.key import Key
#Get source key from bucket by name
source_key = source_bucket.get_key(source_key_name)
#Copy source key to a new bucket with a new key name (can be the same as source)
#Note: source_key is Key
source_key.copy(dest_bucket_name,dest_key_name)
#The signature of boto's Key class:
def copy(self, dst_bucket, dst_key, metadata=None,
reduced_redundancy=False, preserve_acl=False,
encrypt_key=False, validate_dst_bucket=True)
#set preserve_acl=True to copy the acl from the source key
-Hilfe-Methode Kopie in Modul boto.s3.key: 'Kopie (self, dst_bucket, dst_key, Metadaten = None, reduced_redundancy = False, preserve_acl = False, ENCRYPT_KEY = False)' Methode von Boto. s3.key.Key-Instanz Kopieren Sie diesen Schlüssel in einen anderen Bucket. –