Mam plik zawarty w kluczu w moim wiadrze S3. Chcę utworzyć nowy klucz, który będzie zawierał ten sam plik. Czy można to zrobić bez pobierania tego pliku? Szukam rozwiązania w Pythonie (a najlepiej w bibliotece).Jak sklonować klucz w Amazon S3 przy użyciu Pythona (i boto)?
Odpowiedz
S3 umożliwia kopiowanie obiektów według obiektów. Operacja CopyObject tworzy kopię obiektu po określeniu klucza i segmentu źródłowego obiektu oraz klucza i segmentu docelowego miejsca docelowego. Nie jestem pewien, czy Boto ma kompaktową implementację.
Przeglądając kod źródłowy boto, stwierdziłem, że obiekt Key ma metodę "copy". Dziękujemy za sugestie dotyczące operacji CopyObject.
Gdzie jest wiadro wiadro docelowy:
bucket.copy_key(new_key,source_bucket,source_key)
To faktycznie odczytuje klucz i umieszcza go w nowym wiadrze - co nie jest tym, czego potrzebujesz. Przepraszam. –
Nie wierzę, że to jest dokładne. To najlepsza odpowiedź IMO. Metoda 'copy_key' przekazuje nagłówek' x-amz-copy-source' w żądaniu PUT, które mówi S3, aby kopiował bezpośrednio z regionu do regionu, bez pobierania na twój komputer. – sergiopereira
Oto ich dokumenty: http://boto.cloudhackers.com/en/latest/ref/s3.html#boto.s3.bucket.Bucket.copy_key – creimers
Chociaż nikt nie zapytał, pomyślałem, że może to być istotne, aby pokazać jak to zrobić z simples3
:
>>> b.copy("my_bucket/file.txt", "file_copy.txt", acl="public")
Nie jestem pewien, co Boto robi to tutaj, ale warto zauważyć, że uprawnienia (ACL) będą , a nie kopiowane przez S3, zostanie ono zresetowane na "prywatne", jeśli nic innego nie zostanie określone. Aby skopiować listę ACL, musisz najpierw o nią poprosić.
I sekundę ten komentarz odnośnie uprawnień (po napotkaniu błędu) 'dest_bucket .copy_key (key.name, src_bucket_name, key.name, preserve_acl = True) ' – nsof
Należy zauważyć, że metoda "copy" obiektu Key ma parametr "preserve_acl" (domyślnie False), który skopiuje listę ACL źródła do obiektu docelowego.
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
Pomoc na metodzie egzemplarzu w module boto.s3.key: 'kopia (self, dst_bucket, dst_key metadane = None, reduced_redundancy = False, preserve_acl = False, encrypt_key = False)' metoda boto. s3.key.Key instance Skopiuj ten klucz do innego zasobnika. –