【问题标题】:What is the correct way to set up S3 for loading content in the browser?设置 S3 以在浏览器中加载内容的正确方法是什么?
【发布时间】:2019-03-25 05:37:06
【问题描述】:

我想要执行以下操作:用户在浏览器中键入一些文本,然后在按下“保存”按钮后,文本应保存在文件夹中的文件(例如:content.txt)中(例如: /username_text) 在 S3 存储桶的根目录上。

另外,我希望用户能够在访问同一页面时从 S3 加载内容并继续处理该文件。然后,如果他/她完成了,再次将文件保存到 S3。

可能值得一提,但我计划将 NodeJS 用于我的后端...

我现在的问题是:设置这个存储和检索的最佳方式是什么?我是否创建一个 API 网关 + Lambda 函数来通过它获取和发布文件?或者我是否例如使用 Node 中的 aws-sdk 直接从 S3 推送和拉取文件?或者有更好的方法吗?

我看了以下两个指南:

  1. Using AWS S3 Buckets in a NodeJS App – Codebase – Medium

  2. Image Upload and Retrieval from S3 Using AWS API Gateway and Lambda

【问题讨论】:

  • 我已经编辑了我的答案以涵盖您是否应该通过 API GW 与浏览器进行操作的问题。在我原来的答案中错过了它。

标签: amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

欢迎来到 StackOverflow!

我认为您对不那么重要的事情过于担心了。 S3 只不过是一个存储系统。您本可以决定将这些文件的内容存储在 DynamoDB、RDS 等上。如果将其内容存储在这些真实的数据库中,您会怎么做?您会获取数据并将其显示给用户,不是吗?

这就是你需要用 S3 做的事情! S3 是您场景中的明智选择,因为您的“文件”可能会变得非常大,而 S3 是存储文件的好地方。但是,显然,您实际上并没有存储文件(想想 .pdf、.mp4、.mov 等),您实际上只是在存储人类可读的文本。

所以这是解决问题的一种方法:

获取文件内容

  1. 用户登录
  2. 您根据某个令牌获取用户的个人信息。您可以将所有元数据存储在 DynamoDB 中,在给定 user_id 的情况下,从该用户获取所有“文件”。这些“文件”(仅限元数据)将是 S3 上实际文件的存储桶和密钥。
  3. 您使用 S3 中的 getObject API 根据您的查询获取文件,并以 RESTful 方式向用户显示文件的正文。您的回复应如下所示:

    { “内容”:“一些内容” }

保存文件内容

  1. 用户登录
  2. 用户在表单中写入任何内容并提交。在您的 Lambda 函数中,您获取此表单的内容并对其进行处理。此请求应如下所示:

    { “file_id”:“一些 id”, "user_id": "一些ID", “内容”:“一些内容” }

  3. 如果 file_id 存在,则更新 S3 中的内容。否则,在 S3 中上传一个新文件,然后在 DynamoDB 中创建一个新条目。当然,您必须处理提交更改的用户是否确实拥有该文件,但如果您使用的是 UUID,这应该不是太大的问题,但仍然值得检查以防 ID 泄露以某种方式。

这样,您无需担心上传/下载文件,因为这些是 CPU 密集型任务,因此您可以降低成本并在函数中使用很少的 RAM(128MB 应该绰绰有余) ,毕竟,您现在只提供文本。这不仅会简化您的设计方式,还会使 API Gateway 和代码中的事情变得更简单,因为您不必处理二进制类型。您最多可以在提供某些内容时将缓冲区从 S3 转换为字符串,但这应该完全没问题。

编辑

关于您是否应该从浏览器上传它的问题,我建议您查看answer,其中我介绍了通过 API 网关与从浏览器上传的优缺点。

【讨论】:

  • 哇!平台上的第一个问题和如此广泛的答案!真的:谢谢一百万。你说得对,我太担心 S3 的不重要的东西,它应该主要用于存储非人类可读的文件(又名图像/视频)。也感谢您的澄清!
  • 我很高兴您在第一个问题和回答中获得了积极的体验 :)
  • S3 是您用例的绝佳选择。我只是说你太在意那些不那么重要的东西,因为你在想“文件”而不是“文本”。由于用户的输入可能是大量文本,因此将其存储在 S3 中是正确的方法。
猜你喜欢
  • 2022-06-19
  • 2021-06-06
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
相关资源
最近更新 更多