2009-09-23 3 views
14

У меня есть файл, содержащийся в ключе в моем ведре S3. Я хочу создать новый ключ, который будет содержать тот же файл. Можно ли обойтись без скачивания этого файла? Я ищу решение в Python (и, желательно, библиотеке boto).Как клонировать ключ в Amazon S3 с помощью Python (и boto)?

ответ

2

S3 позволяет объекту копировать объект. Операция CopyObject создает копию объекта, когда вы указываете ключ и ведро исходного объекта, а также ключ и ведро целевого адресата. Не уверен, что boto имеет компактную реализацию.

4

Просмотр исходного кода boto Я обнаружил, что объект Key имеет метод «копирования». Спасибо за ваше предложение об операции CopyObject.

+0

Помощь по методу копирования в модуле boto.s3.key: 'копия (самость, dst_bucket, dst_key, метаданные = None, reduced_redundancy = False, preserve_acl = False, encrypt_key = False)' метод Бото. s3.key.Key instance Скопируйте этот ключ в другое ведро. –

14

Где ведро назначения ведро:

bucket.copy_key(new_key,source_bucket,source_key) 
+1

Это действительно читает ключ и помещает его в новое ведро - это не то, что вы хотите. Сожалею. –

+0

Я не верю, что это точно. Это лучший ответ ИМО. Метод 'copy_key' передает заголовок' x-amz-copy-source' в запросе PUT, который сообщает S3 копировать напрямую из региона в регион, не загружая его на ваш компьютер. – sergiopereira

+0

Вот их документы: http://boto.cloudhackers.com/en/latest/ref/s3.html#boto.s3.bucket.Bucket.copy_key – creimers

2

Хотя никто не просил, я думал, что это может быть уместным, чтобы показать, как сделать это с simples3:

>>> b.copy("my_bucket/file.txt", "file_copy.txt", acl="public") 

Я не уверен, что Boto здесь, но стоит отметить, что разрешения (ACL) будут не скопировать на S3, он будет сброшен на «частный», если ничего не указано. Чтобы скопировать ACL, вы должны сначала попросить об этом.

+0

Я второй комментарий относительно разрешений (после обнаружения ошибки) 'dest_bucket .copy_key (key.name, src_bucket_name, key.name, preserve_acl = True) ' – nsof

0

Обратите внимание, что метод «copy» на объекте Key имеет параметр «preserve_acl» (по умолчанию False), который скопирует ACL источника в объект назначения.

9
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 
Смежные вопросы