amazon s3 重命名和覆盖文件、建议和风险

Posted

技术标签:

【中文标题】amazon s3 重命名和覆盖文件、建议和风险【英文标题】:amazon s3 renaming and overwriting files, recommendations and risks 【发布时间】:2012-05-11 00:18:03 【问题描述】:

我有一个包含两种文件名的存储桶:

    [Bucket]/[file] [Bucket]/[folder]/[file]

例如,我可以:

    MyBucket/bar MyBucket/foo/bar

我想将所有[Bucket]/[folder]/[file] 文件重命名为[Bucket]/[file] 文件(从而覆盖/丢弃[Bucket]/[file] 文件)。 因此,与前面的示例一样,我希望 MyBucket/foo/bar 变为 MyBucket/bar(并覆盖/删除原来的 MyBucket/bar)。

我尝试了两种方法:

    使用 s3cmd 的移动命令:s3cmd mv s3://MyBucket/foo/bar s3://MyBucket/bar 使用亚马逊的 php 开发工具包:rename(s3://MyBucket/foo/bar, s3://MyBucket/bar)

这两种方法似乎都有效,但是 - 考虑到我必须对数千个文件进行批处理,我的问题是:

    首选哪种方法? 还有其他更好的方法吗? 我必须在移动/重命名之前删除旧文件吗?(没有它似乎可以正常工作,但我可能不知道其中的风险)

谢谢。

【问题讨论】:

您好!我还尝试在单个存储桶中移动和覆盖文件夹(及其驻留文件),我注意到您有:rename(s3://MyBucket/foo/bar, s3://MyBucket/bar)。这在 PHP 中是如何工作的?还是该行仅在 EC2 上逐字运行? @AndyBarlow,我在eyalarubas.com/log/2012/10/16/… 上写了一篇关于它的帖子。如果您有更多问题,请与我联系。 【参考方案1】:

自从我大约 5 个月前提出这个问题以来,我有一些时间来获得一些见解;所以我会自己回答:

据我所见,在性能方面没有重大差异。我可以想象从 PHP 中调用 s3cmd 的成本可能会很高,因为每个请求都会调用一个外部进程;但话又说回来 - 亚马逊的 SDK 使用 cURL 来发送它的请求,所以没有太大的区别。

我注意到的一个区别是,Amazon 的 SDK 倾向于抛出 cURL 异常(看似随机且很少发生),但 s3cmd 根本没有崩溃。我的脚本在成千上万个文件上运行,因此我不得不学习处理这些 cURL 异常的艰难方法。 我的理论是,当服务器上存在通信冲突时(例如,当两个进程尝试使用相同的资源时),cURL 会崩溃。我正在开发服务器上,有时多个进程同时使用 cURL 访问 S3;这些是 cURL 表现出这种行为的唯一情况。

结论: 使用s3cmd 可能更稳定,但使用 SDK 可以提供更多功能并更好地与您的 PHP 代码集成;只要您记得处理 SDK 抛出 cURL 异常的罕见情况(我会说每 1000 个请求 1 个,当多个进程同时运行时)。

【讨论】:

【参考方案2】:

由于 s3cmd 和 SDK 这两种方法最终都会发出相同的 REST 调用,因此您可以放心地选择最适合您的方法。

当你移动一个文件时,如果目标存在,它总是被替换,那么,如果你不想要这种行为,你需要检查目标文件名是否已经存在,以便执行与否移动操作。

【讨论】:

以上是关于amazon s3 重命名和覆盖文件、建议和风险的主要内容,如果未能解决你的问题,请参考以下文章

如何重命名 Amazon S3 存储桶中的文件? [复制]

Amazon S3 重定向和 Cloudfront

Amazon s3:如何在每个新用户名之后命名一个新文件夹?

Amazon S3 避免覆盖同名对象

如何在 spark scala 中重命名 S3 文件而不是 HDFS

Amazon S3 策略只允许上传而不是覆盖 [重复]