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

时间:2013-05-07 21:07:00

标签: php amazon-s3 fuse s3fs

我正在开发一个托管在Amazon Web Services上的项目。服务器设置包含两个EC2实例,一个Elastic Load Balancer和一个Web应用程序所在的额外Elastic Block Store。该项目假设使用S3存储用户上传的文件。为了这个问题,我将调用S3存储桶static.example.com

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

这些是我使用的mount命令:

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上使用RioFS打开的问题已经解决。虽然我决定使用S3 REST API而不是尝试将存储桶作为卷安装,但似乎RioFS这些天可能是一个可行的选择。

2 个答案:

答案 0 :(得分:51)

  

你有没有在本地linux文件系统上安装S3存储桶?

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

  1. 它不会隐藏错误。文件系统只有一些错误代码可以发送给您以指示问题。 S3库将为您提供来自亚马逊的确切错误消息,以便您了解正在发生的事情,记录,处理角落案例等。
  2. 库将使用更少的内存。文件系统层将缓存大量随机的东西,你再也不会使用它们了。库使您可以控制决定要缓存的内容而不是缓存内容。
  3. 扩张。如果您需要做任何花哨的事情(在文件上设置ACL,生成签名链接,版本控制,生命周期,更改持久性等),那么您将不得不转储文件系统抽象并使用库。
  4. 计时和重试。一些请求随机出错并可以重试。有时您可能想要重试很多次,有时您会很快出错。文件系统不会为您提供精细控制,但库将为您提供。
  5. 底线是FUSE下的S3是leaky abstraction。 S3没有(或需要)目录。文件系统不是为数十亿个文件构建的。他们的权限模型不兼容。你试图将它变成文件系统,从而浪费了很多S3的力量。

    用于与S3交谈的两个随机PHP库:

    https://github.com/KnpLabs/Gaufrette

    https://aws.amazon.com/sdkforphp/ - 如果你扩展到仅使用S3,或者如果你需要做上面提到的任何花哨的请求,这个是有用的。

答案 1 :(得分:2)

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

通过这种方式,如果应用程序必须对文件进行任何转换,那么在本地驱动器上进行转换会更加容易。系统,然后通过CloudFront强制请求转换后的文件从源中提取。

e.g。如果您的用户正在为化身上传图像,并且化身图像需要多次迭代以获得大小和数量。裁剪,您的应用可以在本地卷上创建这些,但该文件的所有公共请求都将通过cloudfront origin-pull请求进行。这样,您可以最大程度地保持原始文件(或文件的优化版本)的灵活性,任何后续用户请求都可以从云前端拉出现有版本,或者云端将请求路由回应用程序并创建任何必要的迭代。

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

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