【问题标题】:How to clone a key in Amazon S3 using Python (and boto)?如何使用 Python(和 boto)克隆 Amazon S3 中的密钥?
【发布时间】:2010-11-30 16:48:29
【问题描述】:

我的 S3 存储桶中的密钥中包含一个文件。我想创建一个包含相同文件的新密钥。是否可以不下载该文件? 我正在寻找 Python 中的解决方案(最好是 boto 库)。

【问题讨论】:

    标签: python amazon-s3 boto


    【解决方案1】:

    S3 允许逐个对象复制。 当您指定源对象的键和存储桶以及目标目标的键和存储桶时,CopyObject 操作会创建对象的副本。 不确定 boto 是否有紧凑的实现。

    【讨论】:

      【解决方案2】:

      浏览boto的源码发现Key对象有一个“复制”的方法。感谢您对 CopyObject 操作的建议。

      【讨论】:

      • 帮助boto.s3.key模块中的方法复制:copy(self, dst_bucket, dst_key, metadata=None, reduced_redundancy=False, preserve_acl=False, encrypt_key=False)boto.s3.key.Key实例的方法将此Key复制到另一个桶。
      【解决方案3】:

      其中bucket是目标bucket:

      bucket.copy_key(new_key,source_bucket,source_key)
      

      【讨论】:

      • 这实际上读取了密钥并将其放入新存储桶中 - 这不是您想要的。对不起。
      • 我不认为这是准确的。这是国际海事组织的最佳答案。 copy_key 方法在 PUT 请求中传递 x-amz-copy-source 标头,这告诉 S3 直接从一个区域复制到另一个区域,而不是下载到您的机器上。
      • 这是他们的文档:boto.cloudhackers.com/en/latest/ref/…
      【解决方案4】:

      虽然没有人问,但我认为展示如何使用 simples3 执行此操作可能是相关的:

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

      我不确定 Boto 在这里做了什么,但值得注意的是权限 (ACL)不会被 S3 复制,如果没有指定其他内容,它将被重置为“私有” .要复制 ACL,您必须先请求它。

      【讨论】:

      • 我支持这个关于权限的评论(在遇到错误之后)dest_bucket.copy_key(key.name, src_bucket_name, key.name, preserve_acl=True)
      【解决方案5】:

      请注意,Key 对象上的“复制”方法有一个“preserve_acl”参数(默认为 False),它将源的 ACL 复制到目标对象。

      【讨论】:

        【解决方案6】:
        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
        

        【讨论】:

          猜你喜欢
          • 2013-04-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-22
          相关资源
          最近更新 更多