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

dvd*_*dmn 6 c# asp.net download amazon-s3 amazon-web-services

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

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

下载文件需要一些时间(考虑每个文件接近1 GB)并上传它需要更长的时间.

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

目前我使用System.Net.WebClient下载文件和AWSSDK进行上传.

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

Mic*_*bot 7

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

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

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

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

如果源支持HTTP范围请求,您甚至不一定需要接收"流",您可以发现对象的大小,然后GET按范围分块并多部分上传它们.使用线程或异步I/O并行处理多个范围来执行此操作,并且您可能能够比单个单片下载更快地复制整个对象,具体取决于限制下载速度的因素.

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


kin*_*no1 7

我在这个问题中已经回答了这个问题,要点如下:

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

不过,这并不是从 S3 中“直接”拉取的。至少这不会下载每个文件,然后串行上传,而是“通过”客户端进行流式传输。如果您在与您的存储桶位于同一区域的 EC2 实例上运行上述内容,我相信这就是最“直接”的,并且与直接拉取一样快。

  • 这不是从 URL _直接_ 上传。 (2认同)