如何在Rails应用程序中使用S3在存储桶之间复制文件?

4

我目前正在开发一款rails应用程序,旨在将视频从一个s3存储桶复制/移动到另一个存储桶。然而,在我的rails应用程序中,我不断收到代理错误502。在mongrel日志中,它说“无法分配内存”。一旦发生此错误,应用程序就会停止运行,我们必须重新启动。

4个回答

7
似乎你的代码将整个资源读入内存中,导致应用程序内存不足。一种天真的做法(根据你的描述,你已经在做类似的事情了)是下载文件并重新上传:只需将其下载到本地文件而不是内存中。但是,亚马逊工程师已经提前考虑到这种情况,并提供可以处理此特定情况的API。
如果你正在使用像 RightAWS gem 这样的东西,你可以像下面这样使用它的 S3Interface:
# With s3 being an S3 object acquired via S3Interface.new
# Copies key1 from bucket b1 to key1_copy in bucket b2:
s3.copy('b1', 'key1', 'b2', 'key1_copy')

如果你正在使用裸露的S3 HTTP接口,请查看亚马逊对象复制文档,以了解仅使用HTTP从一个存储桶复制一个对象到另一个存储桶的解决方案。


我可以通过向 s3.copy(...) 传递参数来指定新文件的权限吗? - deb

0

尝试流式传输文件,而不是将整个文件加载到内存中,然后再处理它。

例如,如果您正在使用aws-s3 gem,请不要使用:

data = open(file)
S3Object.store file_name, data, BUCKET

请使用以下内容:
S3Object.store file_name, open(file), BUCKET

不确定如何“流式下载”文件。


0

boto 运作良好。请参见此线程。使用boto,您可以直接将对象从一个存储桶复制到另一个存储桶,而无需将它们下载到本地计算机,然后再上传到另一个存储桶。


0

你可以使用 fog gem 直接将 bucket 复制到另一个 bucket。

s3 = Fog::Storage.new(your_aws_credentials)

s3.copy_object('source-bucket', 'source/path', 'dest-bucket', 'dest/path')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接