处理大文件上传到 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." 我犹豫是否这样做有几个原因:
我的客户端代码将严重依赖于我的云提供商。我喜欢 AWS(很棒的体验),但我喜欢保持某种云不可知论。我不希望我的移动和 Web 应用程序必须知道我的 AWS 设置的详细信息。如果我选择在以后离开 s3(不太可能但有可能),我希望这是一个无缝过渡。显然,这适用于网络应用程序,因为我总是可以快速重新部署。但是,我不得不担心手机。用户可能不会更新,如果有的用户上传到s3,有的用户上传到其他服务,一切都会变得复杂很多。
关于确定要使用哪个存储桶和区域的业务逻辑需要存在于客户端,或者我需要公开端点以确定每个用户使用哪个存储桶和区域。然后,在我开始上传到 s3 之前,我必须向我的服务器发出请求以找出参数。我希望能够更改存储桶或将用户重新路由到其他区域,因此我不喜欢这种紧密耦合或额外的请求。
安全是一个大问题。通过我的服务器上传和处理文件时,我可以利用 AWS IAM 正确确保这些文件仅来自我的服务器。我认为我必须向有问题的用户授予 "all-write" 权限。如果我在 JavaScript 中使用 AWS IAM 凭证,我看不出您如何确保用户不会获得对我的存储桶的无限制写入权限。所有客户端 javascript,都可以被用户读取。此外,我不知道如何处理验证。在我的服务器上,我可以扫描文件并确定是否上传到 s3。如果我直接从客户端上传,则必须将此处理转移到 lambda 函数中。我同意这一点,但在处理发生之前,用户有可能检索到该对象。然后,我必须构建某种锁定系统以防止在处理之前访问。
所以,底线是我不知道从这里去哪里。我已经破解了一些解决方案,但我对其中任何一个都不满意。我很想了解其他初创公司和企业如何解决此类问题。你会推荐什么?你会如何反驳我的论点?如果我遗漏了什么,请原谅我,我仍然是一个 AWS 新手。
- 如果您担心更改 post 服务,我建议您使用 API,这样您就可以更改服务的后备存储。移动或 Web 客户端将调用该服务,然后您的 api 会将文件放在需要的位置。 api 你有更多的控制权,你可以创建一个 signed s3 url 发送给客户端,让他们继续上传。
- 一个api,和1一样,也解决了这个问题,客户端不需要做所有的工作。
- 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)
我正在使用 Ruby 的 AWS SDK 将大文件从用户上传到 s3。
服务器是一个带有 POST /images 端点接受 multipart/form-data 的 sinatra 应用程序。我在用户上传时遇到了明显的延迟。这是意料之中的,因为它正在同步向 s3 发出请求。我想使用 Sidekiq 之类的东西将其转移到后台作业,但我不确定我是否喜欢该解决方案。
我在网上看到有人提倡在客户端直接上传到s3。有些人甚至称之为 "best practice." 我犹豫是否这样做有几个原因:
我的客户端代码将严重依赖于我的云提供商。我喜欢 AWS(很棒的体验),但我喜欢保持某种云不可知论。我不希望我的移动和 Web 应用程序必须知道我的 AWS 设置的详细信息。如果我选择在以后离开 s3(不太可能但有可能),我希望这是一个无缝过渡。显然,这适用于网络应用程序,因为我总是可以快速重新部署。但是,我不得不担心手机。用户可能不会更新,如果有的用户上传到s3,有的用户上传到其他服务,一切都会变得复杂很多。
关于确定要使用哪个存储桶和区域的业务逻辑需要存在于客户端,或者我需要公开端点以确定每个用户使用哪个存储桶和区域。然后,在我开始上传到 s3 之前,我必须向我的服务器发出请求以找出参数。我希望能够更改存储桶或将用户重新路由到其他区域,因此我不喜欢这种紧密耦合或额外的请求。
安全是一个大问题。通过我的服务器上传和处理文件时,我可以利用 AWS IAM 正确确保这些文件仅来自我的服务器。我认为我必须向有问题的用户授予 "all-write" 权限。如果我在 JavaScript 中使用 AWS IAM 凭证,我看不出您如何确保用户不会获得对我的存储桶的无限制写入权限。所有客户端 javascript,都可以被用户读取。此外,我不知道如何处理验证。在我的服务器上,我可以扫描文件并确定是否上传到 s3。如果我直接从客户端上传,则必须将此处理转移到 lambda 函数中。我同意这一点,但在处理发生之前,用户有可能检索到该对象。然后,我必须构建某种锁定系统以防止在处理之前访问。
所以,底线是我不知道从这里去哪里。我已经破解了一些解决方案,但我对其中任何一个都不满意。我很想了解其他初创公司和企业如何解决此类问题。你会推荐什么?你会如何反驳我的论点?如果我遗漏了什么,请原谅我,我仍然是一个 AWS 新手。
- 如果您担心更改 post 服务,我建议您使用 API,这样您就可以更改服务的后备存储。移动或 Web 客户端将调用该服务,然后您的 api 会将文件放在需要的位置。 api 你有更多的控制权,你可以创建一个 signed s3 url 发送给客户端,让他们继续上传。
- 一个api,和1一样,也解决了这个问题,客户端不需要做所有的工作。
- 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)