Ответ 1
Где ведро - это целевое ведро:
bucket.copy_key(new_key,source_bucket,source_key)
У меня есть файл, содержащийся в ключе в моем ведре S3. Я хочу создать новый ключ, который будет содержать тот же файл. Можно ли обойтись без скачивания этого файла? Я ищу решение в Python (и, желательно, boto library).
Где ведро - это целевое ведро:
bucket.copy_key(new_key,source_bucket,source_key)
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 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
Просматривая исходный код boto, я обнаружил, что объект Key имеет метод "copy". Спасибо за ваше предложение об операции CopyObject.
S3 позволяет копировать объект по объекту. Операция CopyObject создает копию объекта, когда вы указываете ключ и ведро исходного объекта, а также ключ и ведро целевого адресата. Не уверен, что boto имеет компактную реализацию.
Хотя никто и не спросил, я подумал, что может быть важно показать, как это сделать с помощью simples3
:
>>> b.copy("my_bucket/file.txt", "file_copy.txt", acl="public")
Я не уверен, что Boto делает здесь, но стоит отметить, что разрешения (ACL) не будут скопированы S3, это будет reset до "private", если ничего не указано. Чтобы скопировать ACL, вы должны сначала запросить его.
Обратите внимание, что метод "copy" в объекте Key имеет параметр "preserve_acl" (по умолчанию False), который скопирует исходный ACL в целевой объект.