直接从网址上传文件到S3 Bucket

时间:2015-02-11 15:50:39

标签: c# asp.net amazon-web-services amazon-s3 download

我们需要将视频文件存储移至AWS S3。旧位置是一个cdn,所以我只有每个文件的url(1000多个文件,> 1TB总文件大小)。直接在存储服务器上运行上载工具不是一种选择。

我已经创建了一个工具,可以下载文件,将文件上传到S3存储桶并使用新的HTTP网址更新数据库记录,并且除了需要永久工作外,还能正常工作。

下载文件需要一些时间(考虑每个文件接近千兆字节),上传文件需要更长的时间。

是否可以将视频文件直接从cdn上传到S3,这样我可以将处理时间缩短一半?有点像读取文件块然后在读取下一个块时将其放入S3。

目前我使用System.Net.WebClient下载文件,并使用AWSSDK上传。

PS:互联网速度没问题,我在1GBit网络连接的服务器上运行应用程序。

2 个答案:

答案 0 :(得分:5)

不,没有办法指示S3代表您从非S3 URL获取资源并将其保存在存储桶中。

S3支持的唯一“获取”操作是PUT/COPY操作,其中S3支持从一个存储桶中提取对象并将其存储在另一个存储桶(或同一存储桶)中,甚至跨区域,甚至跨越区域帐户,只要您的用户具有足够的权限,可以在事务的两端进行必要的操作。在这种情况下,S3在内部处理所有数据传输。

否则,获取远程对象并将其存储在S3中的唯一方法是下载资源,然后将其上传到S3 - 但是,没有什么能阻止您同时执行这两项操作。

要做到这一点,你需要编写一些代码,大概使用异步I / O或线程,这样你就可以同时接收下载数据流并上传它,可能是对称的块,使用S3的{ {3}}功能,允许您编写单个块(每个最小5MB),在最终请求时,S3将验证并合并为最多5TB的单个对象。分段上传支持并行上传块,并允许您的代码在不重新启动整个作业的情况下重试任何失败的块,因为S3不必按线性顺序上传或接收各个块。

如果原点支持Multipart Upload,您甚至不一定需要接收“流”,您可以发现对象的大小,然后按范围GET块进行分段并将其分段上传。使用线程或异步I / O并行处理多个范围来执行此操作,并且您可能能够比单个下载中的单个下载更快地复制整个对象 ,具体取决于因素限制你的下载速度。

我使用这种技术从AWS外部将多GB文件上传到S3时,实现了45到75 Mbits / sec的聚合速度。

答案 1 :(得分:1)

我在this question中回答过,这是要点:

obj = Aws::S3::Object.new(bucket_name: 'target-bucket', key: 'target-key')
obj.upload_stream do |write_stream|
  IO.copy_stream(URI.open('http://example.com/file.ext'), write_stream))
end