【问题标题】:What's the best way to copy files from Amazon S3 to another FTP?将文件从 Amazon S3 复制到另一个 FTP 的最佳方法是什么?
【发布时间】:2016-02-17 22:07:08
【问题描述】:

每天晚上,我们都会从系统生成 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 上传一些文件?

谢谢

【问题讨论】:

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


    【解决方案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)。所以在一个线程中写入“缓冲​​区”(从“IO”派生的类的实例):

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

    在另一个线程中使用“缓冲区”对象作为源运行上传。

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

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

    这是红宝石;好像它没有一流的并发支持。

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

    【讨论】:

    • 感谢 Marcin 的回答。考虑到直接上传到两台服务器 - S3 + FTP ,这听起来有点复杂。我想避免这种情况,但毕竟它可能更有效。
    • 我想了很多,也许这就是你可能会感兴趣的:stackoverflow.com/questions/23939179/… 如果这是为了方便访问文件,这应该很简单。另一方面,如果您出于安全原因复制到 ftp 以进行额外备份,请不要:blog.cloudsecurityalliance.org/2010/05/24/…
    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2017-06-29
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多