将 S3 存储桶直接安装到 EC2 实例是否安全?

Enr*_*ene 8 php amazon-s3 amazon-ec2

正如我的问题标题所说,我想知道这是否是一个好习惯,

我知道我可以将它安装在 EC2 实例中,但我想知道,随着我将添加更多实例来扩展我的应用程序,这是否会导致一些问题;你有这方面的经验吗?

我使用 S3 允许通过 PHP 脚本上传文件,所以基本上问题是:

使用安装是一个好习惯还是有更好的方法来处理用户文件上传?

提前致谢

cyb*_*x86 14

如果您使用 S3 来存储来自用户上传的数据,尤其是在分布式环境中,那么一个重要的考虑因素是 S3 是“最终一致”的(尽管有些区域是先读后写一致)。这样做的结果是您可能成功上传文件,但如果您随后立即检查它是否存在,可能会发现它不存在。对于更新或删除等场景,这个问题更为明显,在这种情况下,即使是写后读一致性也无济于事。

无论您采用何种方法,以上内容都适用于您上传到 S3 的内容。事实上,对于 S3 可能会遇到的大多数问题,情况都是如此——与其说是用于存储数据的方法,不如说是 S3 的局限性可能是最有问题的。

S3fs 使用 S3 API - 就像 PHP(或其他)SDK 一样。此外,S3 旨在处理相当高级别的并发性 - 因此(除了一致性问题)将其安装在多个实例上应该没有问题(请记住,它不是传统的文件系统 - 诸如锁定之类的问题,等在 S3 端处理)。

也就是说,每种实现都有一些潜在的优点和缺点:

S3FS:

  • 不支持部分/分块下载(据我所知)-因此您必须下载完整文件才能阅读其中的任何部分-如果您只是使用它来存储(和提供)上传,则可能不是问题。
  • 用 C++ 编写的可能的性能提升
  • 您的应用程序受益于 s3fs 的任何更新
  • 实现缓存(完整文件和文件信息) - 有可能提高一点速度,并降低成本
  • 仅限于熔断器暴露的功能

开发工具包:

  • 公开 S3 必须提供的全套功能 - 根据您的用例,这可能足以值得使用 SDK
  • 可能与您的应用程序更紧密地集成 - 返回的错误等可能会让您的应用程序做出更明智(因此更精确)的选择
  • 任何可能的优势都需要编码 - 您的应用程序必须利用它们并随着 S3 的未来变化保持最新
  • 代码的复杂性和开销更大

在“安全”方面,您可以指“防止数据损坏”或“防止未经授权的访问”。对于前者,SDK 可能有助于处理最终一致性(以更详细的错误的形式),但底层存储是相同的,我希望差异很小。关于访问控制 - 您可以使用 IAM 创建一个受限帐户,但该帐户仍然需要对您的 S3 文件进行读/写访问。两者都应该足够安全,在任何一种情况下,您的系统都需要受到损害才能访问您的 S3 存储桶 - 但是,我建议使用 S3fs(因为凭据通常存储在 webroot 之外,并且根本无法通过PHP)的安全性稍好一些。

个人意见:对于只有一个上传目录(例如一个使用它的站点)并且访问相当简单(只需要上传文件并偶尔更新/删除)的情况,我更喜欢 s3fs。如果您需要更复杂的访问(例如部分下载、多个存储桶等)或将 S3 SDK 用于其他目的,那么我也会坚持使用 SDK 进行上传。