正如我的问题标题所说,我想知道这是否是一种好的做法,
我知道我可以将它安装在 EC2 实例中,但我想知道,当我添加更多实例来扩展我的应用程序时,这是否会导致一些问题;您有这方面的经验吗?
我正在使用 S3 允许通过 PHP 脚本上传文件,所以基本上的问题是:
使用 mount 是一种好的做法吗?或者有更好的方法来处理用户文件上传?
提前致谢
答案1
如果您使用 S3 来存储用户上传的数据,尤其是在分布式环境中,一个重要的考虑因素是 S3 是“最终一致的”(尽管有些区域是先读后写一致的)。其结果是,您可能成功上传了一个文件,但如果您随后立即检查它是否存在,可能会发现它不存在。这个问题在更新或删除等场景中更为明显,因为即使先读后写一致性也无济于事。
无论您采用哪种方法,上述内容都适用于您上传到 S3 的数据。事实上,S3 的大多数问题都是如此 - 最成问题的可能不是存储数据的方法,而是 S3 的局限性。
S3fs 使用 S3 API - 就像 PHP(或其他)SDK 一样。此外,S3 旨在处理相当高级别的并发性 - 因此(除了一致性问题)将其安装在多个实例上应该不会有问题(请记住它不是传统的文件系统 - 锁定等问题在 S3 端处理)。
也就是说,每种实现方式都有一些潜在的优点和缺点:
S3fs:
- 不支持部分/分块下载(据我所知) - 所以您必须下载完整文件才能阅读其中的任何部分 - 如果您只是使用它来存储(和服务)上传,这可能不是问题。
- 用 C++ 编写可能提高性能
- 您的应用程序将从 s3fs 的任何更新中受益
- 实现缓存(完整文件和文件信息) - 有可能稍微提高速度并降低成本
- 仅限于 fuse 公开的功能
SDK:
- 展示 S3 提供的全套功能 - 根据您的使用情况,这可能足以让您使用 SDK
- 可能与您的应用程序更紧密地集成 - 返回的错误等可能会让您的应用程序做出更明智(因此更精确)的选择
- 任何可能的优势都需要进行编码——你的应用程序必须利用它们,并及时了解 S3 未来的变化
- 代码更加复杂,开销更大
就“安全”而言,您可能指的是“防止数据损坏”或“防止未经授权的访问”。就前者而言,SDK 可能有助于处理最终一致性(以更详细的错误形式),但底层存储是相同的,我预计差异很小。关于访问控制 - 您可以使用 IAM 创建一个受限帐户,但该帐户仍然需要对您的 S3 文件的读/写访问权限。两者都应该足够安全,无论哪种情况,您的系统都需要受到攻击才能访问您的 S3 存储桶 - 但是我建议使用 S3fs(因为凭据通常存储在 webroot 之外,并且根本无法通过 PHP 访问)安全性会稍微好一些。
个人意见:如果只有一个上传目录(例如一个网站使用它),并且访问相当简单(只需要上传文件并偶尔更新/删除),我倾向于使用 s3fs。如果您需要更复杂的访问(例如部分下载、多个存储桶等)或将 S3 SDK 用于其他目的,那么我也会坚持使用 SDK 进行上传。
答案2
我更喜欢通过 PHP 库上传到 S3。这比在每台服务器上安装 S3 更简单。
看看这个例子:http://aws.amazon.com/code/126
对于我的一个项目,我使用了这个库:http://undedesigned.org.za/2007/10/22/amazon-s3-php-class. 对我来说效果非常好。
答案3
您可以允许用户从浏览器直接上传到 s3,而无需上传到您的服务器(然后上传到 s3。)
以下是一些很好的建议:https://leonid.shevtsov.me/post/demystifying-s3-browser-upload/
文件上传后,如果您需要处理文件(zip、转码等),则可以使用 S3fs