首页 > 解决方案 > 将大文件从多个端点上传到云存储的架构

问题描述

我正在开发一个提供上传到云存储的桌面应用程序。存储提供商有一种简单的方法来上传文件。您获得 accessKeyId 和 secretAccessKey 并准备上传。我正在尝试提出上传文件的最佳方式。

选项 1.使用访问密钥打包每个应用程序实例。这样文件可以直接上传到云端,无需中间人。不幸的是,在上传到云端之前,我无法执行任何逻辑。例如..如果每个用户都有 5GB 的可用存储空间,我无法在存储提供商处验证此限制。我还没有找到任何提供者这样做。我可能会在上传之前向我自己的服务器发送一个请求以进行验证,但由于密钥是在应用程序中硬编码的,我相信这是一个简单的漏洞利用。

选项 2.将每个上传的文件发送到服务器,在那里可以执行约束逻辑并将文件转发到最终的云存储。这种方法在服务器上存在瓶颈。例如,如果 100 个用户开始上传(或下载)1 GB 文件,并且服务器的带宽速度为 1000Mb/s,则每个用户的上传速度仅为 10Mb/s = 1.25MB/s。

选项 2 似乎是要走的路,因为我可以控制谁可以上传并且密钥不会公开共享。我正在寻找最小化带宽瓶颈的技巧。推荐什么方法来处理同时上传大文件到云存储?我正在考虑部署许多低 cpu 和低内存实例并使用流而不是先缓冲整个文件然后再发送。

标签: file-uploadservercloud-storage

解决方案


我相信要求架构验证和改进超出了本论坛的范围,但我会咬一口。另外,有些方面还不清楚。我假设您的意思是您会将文件上传到 S3 之类的东西,但您会根据用户支付的费用限制用户可以上传的数量。

您可以使用选项 1。直接上传到存储提供商,但首先使用您的服务器进行验证。您需要能够:

  • 识别每个用户。一个简单的 UUID 可能会解决问题,或者成为完整的用户/通行证。
  • 拥有一个跟踪每个客户使用情况的数据库。
  • 使用您自己的私钥加密桌面应用程序和您的服务器之间的通信。也就是说,除了HTTPS。如果您不清楚公钥加密的工作原理,您应该查一下。
  • 为每个提供者使用临时访问密钥并找到解决方法。

这些会增加你的成本。虽然没有选项 2 那么多。

您的应用将在上传之前对您的服务器进行 API 调用,以确定上传是否有效。任何不是好的答案(或缺少答案)都意味着上传失败。这也意味着您在架构中引入了单点故障,并且您最好确保您的服务器始终处于运行状态并且只要您仍有用户可用,否则您将违反惠顿定律。我的建议,在这里无服务器。

您将使用临时 access_key/secret_key 对来上传文件。桌面应用程序会将文件直接上传到您正在处理的任何提供商,但它将使用每 12 小时更改一次的密钥/秘密对。每个用户都有自己的一对,您需要确保用户只能访问他们自己的文件。否则他们将能够访问每个人的文件,而你将违反惠顿定律。这样,即使他们以某种方式弄清楚秘密是什么,他们最多只能访问 12 小时,之后您将更改密钥并将其切断。

应用程序和您的服务器之间的所有通信都使用公钥加密技术进行加密。私钥存储在您的服务器上,用户获取公钥。这样,您可以在需要时轻松更新加密密钥,因为公钥是公开的。请记住,这提供了加密,而不是身份验证。

您可以通过更改用于直接与服务器提供商通信的 access_key/secret_key 对以及用于与您的服务器通信的私钥来轻松地使用户的访问无效。

您的服务器应跟踪每个用户的文件,并验证服务器端数据库中的内容与存储中的内容相同。定期做。每天,每周,每 2 小时,任何适合您的方式。如果发现不一致,请进行调查。也许他们正试图作弊。或者您的应用程序可能存在错误。这意味着您必须能够在存储级别识别哪个文件属于哪个用户。这就像将用户的所有文件存储在具有其 UUID 的目录中一样简单。不要在那里使用姓名或电子邮件。除了在您的数据库中,任何个人身份数据都不应存储在其他任何地方。即使在那里,也只有在需要时才应该加密。

所以,它是这样的:

  1. 桌面应用程序向您的服务器发送一条消息,要求上传文件。像“我需要上传一个 3.7 GB 的文件”之类的东西。消息在使用该用户的公钥发送之前被加密。
  2. 您的服务器获取消息,对其进行解密,检查可用空间,在其数据库中查找适当的提供程序并检索该提供程序的最新 access_key/secret_key。
  3. 您的服务器发送类似“ALL_GOOD,上传到 provider_AWS_S3,使用与 THIS_SECRET_KEY 配对的 THIS_ACCESS_KEY”的内容。消息使用私钥加密。
  4. 桌面应用程序使用提供的密钥将文件直接上传到 S3。

下载和其他操作应该以类似的方式进行。

无服务器的绝佳用例(AWS 上的 Lambda、Google 函数等),它应该可以降低成本并提供更多的冗余和“正常运行时间”。

可以进行改进,但也存在缺陷。例如,在上传之前加密文件客户端会增加额外的安全层。但是这篇文章已经太长了。

你去吧。那将是3000美元:)。


推荐阅读