我有一个允许用户上传文件的webapp(称之为myapp.com)。该webapp将部署在Amazon EC2实例上。我想通过基于s3桶的域(即uploads.myapp.com)将这些文件提供给webapp消费者。
当用户上传文件时,我可以轻松地将它们放入本地ec2实例上名为“site_uploads”的文件夹中。但是,由于我的ec2实例存储空间有限,上传量很大,ec2文件系统会很快填满。
如果ec2实例可以挂载并且s3 bucket作为“site_upload”目录,那将是很好的。因此,上传到EC2“site_upload”目录会自动最终上传到uploads.myapp.com(我的webapp可以使用模板标签来确保此上传内容的链接基于该s3支持的域名)。这也为我提供了可扩展的文件服务,因为文件请求命中s3而不是我的ec2实例。此外,它使我的webapp可以轻松地执行缩放/调整本地出现在“site_upload”但实际上是在s3上的图像。
我正在研究s3fs,但从评论来看,它看起来并不像一个完全出炉的解决方案。我正在寻找一种非商业解决方案。
仅供参考,webapp是用django编写的,而不是过多地改变了细节。
答案 0 :(得分:5)
我没有使用EC2,但我确实将我的S3存储桶永久安装在我的Linux服务器上。我这样做的方式是Jungledisk。它不是非商业解决方案,但它非常便宜。
首先我正常设置jungledisk。然后我确保安装了保险丝。大多数情况下,您只需要使用密钥等创建配置文件。然后在你的fstab上添加一行代码。
jungledisk /path/to/mount/at fuse noauto,allow_other,config=/path/to/jungledisk/config/file.xml 0 0
然后安装,你很高兴。
答案 1 :(得分:2)
对于上传,您的用户可upload directly to S3,如here所述。
这样您就不需要安装S3了。
在提供文件时,您也可以直接通过将文件标记为公用来实现,我更喜欢将网站命名为“files.mydomain.com”或“images.mydomain.com”,指向s3。 / p>
答案 2 :(得分:2)
我使用s3fs,但没有现成的发行版。我已经在这里为那些想要它的人提供了我的构建。
配置文档不可用,所以我在我的fstab中得到了这个文件:
s3fs#{{bucket name}} {{/ path / to / mount / point}} fuse allow_other,accessKeyId = {{key}},secretAccessKey = {{secret key}} 0 0
答案 3 :(得分:2)
这是我用于Ubuntu系统的一点点剪辑,我还没有测试过,所以它显然需要适应M $系统。您还需要安装s3-simple-fuse。如果最终把你的工作放在最后,我建议使用fabric来运行相同的命令。
import os, subprocess
'''
Note: this is for Linux with s3cmd installed and libfuse2 installed
Run: 'fusermount -u mount_directory' to unmount
'''
def mountS3(aws_access_key_id, aws_secret_access_key, targetDir, bucketName = None):
#######
if bucketName is None:
bucketName = 's3Bucket'
mountDir = os.path.join(targetDir, bucketName)
if not os.path.isdir(mountDir):
os.path.mkdir(mountDir)
subprocess.call('s3-simple-fuse %s -o AWS_ACCESS_KEY_ID=%s,AWS_SECRET_ACCESS_KEY=%s,bucket=%s'%(mountDir, aws_access_key_id, aws_secret_access_key, bucketName)
答案 4 :(得分:0)
我建议使用单独安装的EBS卷。我试过为一些电影文件做同样的事情。访问S3很慢,S3有一些限制,如无法重命名文件,没有真正的目录结构等。
您可以在RAID5配置中设置EBS卷,并根据需要添加空间。