处理大文件上传到s3的推荐方法是什么?

时间:2017-07-12 21:39:29

标签: amazon-web-services amazon-s3 sinatra aws-sdk

我使用AWS SDK for Ruby将大型文件从用户上传到s3。

服务器是一个sinatra应用程序,其POST / images端点接受multipart / form-data。我在用户上传时遇到明显的延迟。这是可以预料到的,因为它同步向s3发出请求。我想用Sidekiq之类的东西把它转移到后台工作,但我不确定我喜欢那个解决方案。

我在网上看到,有些人正在推广直接上传到客户端的s3。有些人甚至将此称为“最佳实践”。"我出于以下几个原因犹豫不决:

  1. 我的客户端代码将严重依赖我的云提供商。我喜欢AWS(很棒的体验),但我喜欢保持与云无关。我不希望我的移动和网络应用程序必须知道我的AWS设置的详细信息。如果我选择在以后退出s3(不太可能但是看似合理),我希望这是一个无缝过渡。显然,这适用于Web应用程序,因为我总是可以快速重新部署。但是,我不得不担心手机。用户可能无法更新,如果某些用户上传到s3而某些用户正在上传到其他服务,则一切都会变得更加复杂。

  2. 关于确定要使用哪个存储桶和区域的业务逻辑要么存在于客户端,要么我需要公开端点以确定每个用户使用哪个存储桶和区域。然后,在我开始上传到s3之前,我必须向我的服务器发出请求以找出参数。我希望能够更换存储桶或将用户重新路由到其他地区,因此我不喜欢这种紧密耦合或附加请求。

  3. 安全是一个巨大的问题。通过我的服务器上传和处理文件时,我可以利用AWS IAM正确确保这些文件仅来自我的服务器。我相信我必须授予"全写"对用户有特权的问题。如果我在JavaScript中使用AWS IAM凭据,我看不出如何确保用户无法获得对我的存储桶的无限写入权限。所有客户端javascript,都可以由用户阅读。另外,我不知道如何处理验证。在我的服务器上,我可以扫描文件并确定是否上传到s3。如果我直接从客户端上传,我将不得不将此处理转移到lambda函数。我没关系,但在处理发生之前,用户可能会检索到该对象。然后,我必须构建某种锁定系统,以防止在处理之前访问。

  4. 所以,底线是我不知道从哪里开始。我已经破解了一些解决方案,但我对其中的任何解决方案都不感兴趣。我很想知道其他创业公司和企业是如何解决这类问题的。你会推荐什么?你会如何反驳我的论点?请原谅我,如果我错过了什么,我仍然是一个相对AWS的新手。

2 个答案:

答案 0 :(得分:1)

  1. 如果您担心更改帖子服务,我建议您使用API​​,这样您就可以更改服务的支持存储空间。移动或Web客户端会调用该服务,然后您的api会将文件放在需要的位置。 api你有更多的控制权,你可以创建一个signed s3 url发送给客户端,让他们仍然进行上传。
  2. api,就像1中一样,也解决了这个问题,客户端不需要做所有的工作。
  3. Use Simple Token Services and Temporary Security Credentials.

答案 1 :(得分:0)

我同意strongjz,您应该使用API​​从服务器端上传文件。

Cloudinary向云端提供API for uploading images和视频。

根据我对使用Cloudinary的经验所知,它是适合您的解决方案。

所有图片,视频和所需元数据均由Cloudinary在Cloudinary所拥有的Amazon S3存储桶中存储和管理。

视频的默认最大文件大小限制为40MB。这可以针对付费计划进行定制。

例如在Ruby中:

Cloudinary::Uploader.upload("sample_spreadsheet.xls", :resource_type => 
:raw)