【问题标题】:Best practices of uploading a file to S3 and metadata to RDS?将文件上传到 S3 并将元数据上传到 RDS 的最佳实践?
【发布时间】:2021-08-10 07:21:32
【问题描述】:

上下文

我正在构建一个模拟服务来学习 AWS。我希望用户能够上传声音文件(其他用户可以收听)。 为此,我需要将声音文件上传到 S3 和元数据,例如文件名、上传者名称、长度、S3 ID 到 RDS。 用户最好使用签名 URL 而不是通过首先将其上传到我的服务器并从那里上传到 S3 来将传输的数据加倍。

最好这将是事务性的,但从我收集的信息来看,没有给定的功能。为了实现这一点并最大程度地降低文件成功上传到 S3 而不是元数据到 RDS 的风险,反之亦然,我的最佳猜测如下:

我的解决方案

用词: 首先是尝试使用我在本地或服务器端生成的密钥 (uuid) 将文件上传到 S3。如果这成功了,我会向我的 API 发出请求以上传元数据,包括 RDS 的密钥。如果这不成功,我会从 S3 中删除该对象。

带代码:

uuid = get_uuid_from_server(); 
s3Client.putObject({.., key: uuid, ..}, function(err, data) {
   if (err) {
    reject(err);
   } else {
    resolve(data);
    // Upload metadata to RDS through API-call to EC2 server. Remove s3 object with key: 
       uuid if this call is unsuccessful
   }
  });

根据我的学习,我的方法很少是最佳实践,但我无法找到有关此特定问题的任何好的信息。我的上述方法/解决方案是否符合最佳实践?

额外问题:出于安全目的在服务器端而不是客户端生成文件的密钥 (uuid) 是否有益?

【问题讨论】:

  • 用户如何上传你的文件?使用 s3-presigned url 直接到 S3?还是先上传到后端,然后上传到 s3?
  • 谢谢你,Marcin,我已经编辑了帖子并添加了这些信息。

标签: amazon-web-services amazon-s3 amazon-rds


【解决方案1】:

假设客户端是网络浏览器或移动应用程序,您可以选择以下 2 种方法。

1.将您的服务器用作 S3 的代理。

您的服务器充当客户端和 S3 之间的代理,您可以完全控制上传流程、控制支持的文件类型并可以检查文件内容,例如:确保文件是正确的声音文件,之前上传到 S3。

2。使用您的服务器创建pre-signed upload URLs

在这种方法中,您的客户端首先请求服务器创建一个或多个(用于分段上传)预签名 URL。然后客户端使用这些 URL 上传到您的 S3。您的服务器可以保存这些 URL 以便以后跟踪。

要在上传成功或失败时收到通知,您可以

(1) 要求客户端在特定签名 URL 的上传完成后调用另一个 API,例如:/ack。如果一段时间后没有调用此 API,例如:1 小时,您可以使用 S3 检查并相应地删除文件。您可以这样做,因为您在上传开始时已将签名 URL 存储在您的数据库中。

(2) 使用S3 events。您可以在 S3 中配置 ObjectCreated 事件,该事件在创建对象时触发,并将所有事件发送到 SQS 中的队列,并让您​​的服务器从那里处理每个事件。这样,您就不必依赖客户端在上传完成后更新您的服务器。对于所有成功的上传,S3 会相应地通知您的服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 2019-03-28
    • 2012-09-19
    • 2012-12-12
    • 2020-07-18
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多