我有一个包含在S3存储桶中的密钥中的文件。我想创建一个新的密钥,它将包含相同的文件。有没有可能不下载该文件? 我正在寻找Python解决方案(最好是boto库)。如何使用Python(和boto)在Amazon S3中克隆密钥?
回答
S3允许按对象复制对象。 当您指定源对象的密钥和存储桶以及目标目标的密钥和存储桶时,CopyObject操作会创建一个对象的副本。 不确定boto是否具有紧凑的实现。
浏览boto的源代码我发现Key对象有一个“复制”方法。感谢您关于CopyObject操作的建议。
凡斗是斗目的地:
bucket.copy_key(new_key,source_bucket,source_key)
这实际上读取密钥并将其放入新存储区 - 这不是您想要的。抱歉。 – 2010-03-10 16:05:19
我不相信这是准确的。这是IMO的最佳答案。 'copy_key'方法在PUT请求中传递'x-amz-copy-source'头,它告诉S3直接从区域复制到区域,而不需要下载到你的机器上。 – sergiopereira 2015-08-15 19:20:10
这里是他们的文档:http://boto.cloudhackers.com/en/latest/ref/s3.html#boto.s3.bucket.Bucket.copy_key – creimers 2016-03-25 00:45:04
虽然没人问,我想这可能是相关的,以显示如何使用simples3
做到这一点:
>>> b.copy("my_bucket/file.txt", "file_copy.txt", acl="public")
我不知道是什么博托在这里做,但值得注意的是,权限(ACL)而不是被S3复制,如果没有其他指定,它将被重置为“私有”。要复制ACL,你必须首先要求它。
我第二次评论这个权限(遇到一个bug后)'dest_bucket .copy_key(key.name,src_bucket_name,key.name,preserve_acl = True)' – nsof 2014-09-01 14:18:39
请注意,Key对象上的'copy'方法具有“preserve_acl”参数(默认为False),该参数将将源ACL复制到目标对象。
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
帮助对方法副本模块boto.s3.key: '拷贝(个体,dst_bucket,dst_key,元数据=无,reduced_redundancy =假,preserve_acl =假,encrypt_key =假)的Boto'方法。 s3.key.Key实例 将此密钥复制到另一个存储桶。 – 2012-05-25 07:31:34