我在工作中继承了一个项目。它本质上是一个利基内容存储库,我们使用S3来存储内容。该项目严重过时,我正在彻底更新。
对于某些未知和未记录的原因,内容存储在模式为web_cl_000000$DB_ID$CONTENT_NAME
的AWS S3存储桶中。因此,一个特定文件夹可以命名为web_cl_0000003458zyxwv
。这没有任何意义,需要一些转换逻辑来构建一个URL来提供内容!
我可以使用boto3
库编写一个Python脚本来逐项重命名,但是想知道是否有更快的方法。该桶中大约有4M项目,这需要相当长的时间。
答案 0 :(得分:4)
这是不可能的,因为文件夹是从对象键中/
分隔符之间的字符串派生的错觉。
Amazon S3具有扁平结构,没有您在典型文件系统中看到的层次结构。但是,为了简化组织,Amazon S3控制台支持将文件夹概念作为对对象进行分组的方法。 Amazon S3通过使用对象的键名称前缀来实现此目的。(强调添加)
http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html
控制台通过允许您创建"来为幻觉做出贡献。一个文件夹,但所有实际做的是创建一个0字节的对象,其中/
作为其最后一个字符,控制台将显示为文件夹,是否有其他具有该前缀的对象,使其更容易上传某些组织手动对象。
但允许在S3中重命名文件夹的任何工具或技术实际上都会使用修改后的名称制作每个对象的副本,然后删除旧对象,因为S3实际上不支持重命名或移动 - 对象在S3,包括它们的密钥和元数据,实际上是不可变的。任何改变"在API级别处理复制/覆盖或复制然后删除。
值得注意的是,S3应该能够轻松地每秒支持100个这样的请求,所以对于异步请求或多线程代码,甚至是每个处理键空间分片的几个进程,你应该能够做到整个事情几个小时后。
另请注意,新密钥在请求中的较少排序(更随机),在这样的批量写入操作期间,您难以推送S3。发送请求以便新密钥具有词汇顺序将是最有可能出现503 Slow Down
错误的情况......在这种情况下,您只需退回并重试...但是如果新密钥如果没有订购,S3可以更轻松地容纳大量请求。