处理带元数据的文件上传的建议(S3和Node / Express)

时间:2016-02-19 19:41:02

标签: node.js amazon-web-services amazon-s3 lambda architecture

我正在使用在AWS上托管的node / express构建一个接受照片上传的服务。照片将存储在S3中,但仅限于具有特定权限的用户(应用程序已定义)。访问将通过节点服务器创建的签名S3 URL进行控制。

上传照片的客户将是iOS,Android和现代浏览器。

为了最大限度地提高可扩展性,我打算让客户端将照片直接上传到S3,这样我的服务器就不需要处理这些请求了。这要求客户在上传照片之前从服务器获取已签名的上传URL。我面临的挑战是照片可以与我存储在数据库中的用户定义的元数据配对(例如照片标题,注释等)。我正在努力避免孤立的照片或元数据。如果我要求客户端首先将元数据上传到数据库,那么照片可能无法上传,反之亦然。

我可以使用哪些选项来完成这项工作?这是我到目前为止所提出的:

  1. 将照片标题存储为S3 {{}}上的user-defined metadata。这可能有效但有局限性(仅限US-ASCII文本和全部小写)。
  2. 将照片上传端点移至AWS Lambda方法。现在Lambda支持访问VPC中的资源,Lambda方法可以在将照片流式传输到S3后处理将照片元数据写入数据库。由于Lambda将在我的应用程序服务器之外运行,因此我不需要担心应用程序服务器上的负载。
  3. 处理应用程序服务器上的照片上传,如果出现问题则担心缩放。我有一个类似的服务器在共享托管环境中运行ASP.NET,并遇到并发连接限制问题,但可能只是共享托管。我假设我可以在AWS上配置负载均衡器,以根据需要调整实例。
  4. 要求客户首先将照片上传到S3,然后在针对节点服务器的第二个事务中上传字幕。最坏情况是用户的标题丢失。
  5. 您会推荐哪些其他选择?

    提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

上传状态为"待定"的元数据或类似的东西。然后根据您的问题上传图片。在您的存储桶上有一个lambda触发器,用于更新状态。

对于奖励分数,一个定时的lambda函数清除旧记录" pending"状态。