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

What is the recommended way to handle large file uploads to s3?

我正在使用 Ruby 的 AWS SDK 将大文件从用户上传到 s3。

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

我在网上看到有人提倡在客户端直接上传到s3。有些人甚至称之为 "best practice." 我犹豫是否这样做有几个原因:

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

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

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

所以,底线是我不知道从这里去哪里。我已经破解了一些解决方案,但我对其中任何一个都不满意。我很想了解其他初创公司和企业如何解决此类问题。你会推荐什么?你会如何反驳我的论点?如果我遗漏了什么,请原谅我,我仍然是一个 AWS 新手。

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

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

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

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

您所有的图像、视频和所需的元数据都由 Cloudinary 在 Cloudinary 拥有的 Amazon S3 存储桶中存储和管理。

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

例如 Ruby:

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