2016-04-28 81 views
2

我在工作中继承了一个项目。它本质上是一个利基内容存储库,我们使用S3来存储内容。该项目严重过时,我正在进行全面更新。重命名AWS存储桶项目文件夹名称的顶级解决方案?

对于某些未知和未记录的原因,内容存储在模式为web_cl_000000$DB_ID$CONTENT_NAME的AWS S3存储桶中。因此,可以将一个特定文件夹命名为web_cl_0000003458zyxwv。这是没有意义的,并且需要一些转换逻辑来构建URL以提供内容!

我可以使用boto3库编写一个Python脚本来逐项重命名,但想知道是否有更快的方法。这个桶中大约有4M物品,这需要相当长的时间。

回答

3

这是不可能的,因为这些文件夹是来自对象键中的/分隔符之间的字符串的错觉。

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可以更容易地适应大量的请求。

+0

我不能说我对你的回应感到惊讶,因为这基本上是我通过阅读文档所理解的。我希望我错了。看起来最好的解决方案是将存储桶/文件夹名称保存为遗留实体的db字段,并使用更为理智的命名方案继续前进。 – Jason

相关问题