如何将 S3 存储桶挂载到 EC2 实例并使用 PHP 写入该实例?

2022-08-30 10:11:34

我正在处理一个托管在亚马逊网络服务上的项目。服务器设置由两个 EC2 实例、一个弹性负载均衡器和一个 Web 应用程序所在的额外弹性块存储组成。该项目应该使用S3来存储用户上传的文件。出于这个问题的考虑,我将调用 S3 存储桶static.example.com

我尝试过使用(https://code.google.com/p/s3fs/wiki/FuseOverAmazon),(https://github.com/skoobe/riofs)和(https://code.google.com/p/s3ql/)。 将挂载文件系统,但不让我写入存储桶(我在 SO:如何使用 FUSE 以适当的权限挂载 S3 卷时问了这个问题)。 将挂载文件系统,并允许我从shell写入存储桶,但是使用PHP保存的文件不会出现在存储桶中(我在GitHub上打开了一个项目问题)。 将挂载存储桶,但存储桶中已有的文件不会出现在文件系统中。s3fsRioFSs3qls3fsRioFSs3ql

这些是我使用的挂载命令:

s3fs static.example.com -ouse_cache=/tmp,allow_other /mnt/static.example.com
riofs -o allow_other http://s3.amazonaws.com static.example.com /mnt/static.example.com
s3ql mount.s3ql s3://static.example.com /mnt/static.example.com

我也尝试过使用这个S3类:https://github.com/tpyo/amazon-s3-php-class/ 和这个FuelPHP特定的S3包:https://github.com/tomschlick/fuel-s3。我能够让FuelPHP软件包列出可用的存储桶和文件,但是将文件保存到存储桶失败(但没有出错)。

您是否曾经在本地 Linux 文件系统上挂载过 S3 存储桶,并使用 PHP 将文件成功写入存储桶?您使用了哪些工具?如果您使用了上述工具之一,那么您使用的是哪个版本?

编辑我被告知,我在 GitHub 上打开的问题已得到解决。尽管我决定使用 S3 REST API,而不是尝试将存储桶挂载为卷,但现在这似乎是一个可行的选择。RioFSRioFS


答案 1

您是否曾经在本地 Linux 文件系统上挂载过 S3 存储桶?

不。测试很有趣,但我不会让它靠近生产系统。使用库与 S3 进行通信要好得多。原因如下:

  1. 它不会隐藏错误。文件系统只有几个错误代码可以发送给您以指示问题。S3库将为您提供来自亚马逊的确切错误消息,以便您了解正在发生的事情,记录它,处理角落案例等。
  2. 库将使用较少的内存。文件系统层将缓存许多随机的东西,你许多人永远不会再使用。库使您可以控制要缓存的内容和不缓存的内容。
  3. 扩张。如果你需要做任何花哨的事情(在文件上设置ACL,生成签名链接,版本控制,生命周期,更改持久性等),那么你将不得不转储你的文件系统抽象并使用库。
  4. 计时和重试。某些部分请求随机出错,可以重试。有时您可能想要重试很多,有时您宁愿快速出错。文件系统不能给你精细的控制,但库会给你。

底线是 FUSE 下的 S3 是一个泄漏的抽象。S3 没有(或不需要)目录。文件系统不是为数十亿个文件构建的。它们的权限模型不兼容。您试图通过将其硬塞入文件系统来浪费S3的大量功能。

两个随机的 PHP 库,用于与 S3 通信:

https://github.com/KnpLabs/Gaufrette

https://aws.amazon.com/sdkforphp/ - 如果您扩展到仅使用S3之外,或者如果您需要执行上述任何花哨的请求,则此请求非常有用。


答案 2

通常,将文件写入 EBS 卷,然后强制文件的后续公有请求通过 CloudFront CDN 进行路由是有利的。

这样,如果应用程序必须对文件执行任何转换,则在本地驱动器和系统上执行转换操作要容易得多,然后强制通过 CloudFront 从源中拉取对转换后文件的请求。

例如,如果您的用户正在为头像上传图像,并且头像图像需要多次迭代大小和裁剪,则您的应用程序可以在本地卷上创建这些,但对该文件的所有公共请求都将通过 cloudfront origin-pull 请求进行。通过这种方式,您可以最大程度地灵活地保留原始文件(或文件的优化版本),并且任何后续用户请求都可以从云前端边缘拉取现有版本,或者云前端会将请求路由回应用程序并创建任何必要的迭代。

上述情况的一个基本例子是WordPress,除了保留原始图像(受文件大小限制和/或插件转换)之外,它还会为上传的任何图形图像创建多个大小/裁剪版本。支持CDN的WordPress插件,例如W3 Total Cache重写请求以拉取CDN,因此该应用程序只需要创建唯一的第一个请求迭代。添加浏览器缓存 URL 版本控制 (http://domain.tld/file.php?x123) 可进一步优化和利用 CDN 功能。

如果您担心 EBS 卷文件大小或 inode 的快速扩展,您可以对很少请求的文件或过期的文件自动执行修剪过程。


推荐