我们每晚都会从系统生成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?
谢谢
答案 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)。