将文件从Amazon S3复制到另一台FTP的最佳方法是什么?

时间:2015-11-16 17:55:35

标签: ruby-on-rails ruby amazon-s3 upload ftp

我们每晚都会从系统生成CSV文件的报告,并将这些文件备份到Amazon S3。 然后我们需要将这些文件(通常是1-5个文件,文件不超过5MB)从Amazon S3存储复制到另一个FTP。

最好的方法是什么?该系统是用Ruby On Rails编写的。使用CRON每晚都会生成CSV文件。

我可以从我的笔记本电脑上传一个文件,如下所示:

  def upload_to_ftp
    Net::SFTP.start('FTP_IP', 'username', :password => 'password') do |sftp|
      sftp.upload!("/Users/my_name/Downloads/report.csv", "/folder_on_the_ftp/report.csv")
    end
    render :nothing => true
  end

但是如何上传一些文件不是来自本地硬盘,而是来自Amazon S3?

谢谢

1 个答案:

答案 0 :(得分:1)

也许我没有足够的想象力,但我认为您需要将其下载到您的服务器,然后将其上传到FTP。

你只是从S3读书而失踪;使用ruby-aws-sdk很简单,请看这里:http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html

但是如果文件大于5MB,则可以使用IO流。

据我所知Net:SFTP #upload!接受IO流作为输入。这是等式的一个方面。

然后使用ruby-aws-sdk使用流式读取下载CSV(再次参考:http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/S3Object.html)。所以在一个线程中写入' buffer' (源自' IO')的类的实例:

s3 = AWS::S3.new
obj = s3.buckets['my-bucket'].objects['key']
obj.read do |chunk|
  buffer.write(chunk)
end

在另一个主题中,使用'缓冲区'运行上传。对象作为来源。

请注意,我自己还没有使用过此解决方案,但这应该可以让您入手。

另请注意,您将缓冲传入的数据。除非您使用临时文件并且服务器上有足够的磁盘空间,否则您需要限制存储在'缓冲区中的数据量。 (即只有在你低于对象的最大大小时才调用#write)。

这是Ruby;它并不像它有一流的并发支持。

我个人要么从相同的代码上传到S3和SFTP,要么不可能,请下载整个CSV文件,然后将其上传到SFT。只有在优化时才需要切换到流。 (只是我的$ .0002)。