不带 CORS 直接上传到 S3(非浏览器)
Posted
技术标签:
【中文标题】不带 CORS 直接上传到 S3(非浏览器)【英文标题】:Direct upload to S3 without CORS (non-browser) 【发布时间】:2013-04-25 16:50:12 【问题描述】:我们正在 AWS 上开发一个 API,使用 EC2、SQS 和 S3 的组合。我们的前端服务器驻留在 EC2 上,我们将所有用户提交的数据存储在 S3 上。我们不想将我们的 S3 存储暴露给最终用户,因此所有提交最初都通过 EC2。我们所有的最终用户都知道我们的 API 端点,他们向其发布数据(通常是原始文本,目前最大约 1MB),并从中获取结果。
不过,我们怀疑这种模式不太可能扩大规模,因为我们获得了更多用户并且提交的数据越来越多。所以我们一直在寻找管理用户输入的替代方法。其中最吸引人的似乎是CORS,其中S3 now supports,它允许最终用户直接上传到S3,而无需最初缓冲到EC2。但是我们正在开发一个 API 而不是 Web 应用程序,而且似乎 CORS 总是需要某种基于浏览器的 javascript 来执行实际的上传。我们最终可能会为大型上传提供某种浏览器 UI,但我们现在希望向开发人员提供的只是我们的 API 端点。
所以基本上我们想知道是否有任何其他可能的解决方案我们可以看看。目前对我们来说最重要的事情是避免公开我们的后端存储,以便只公开我们的 API url(这也很重要,因为我们希望保留将后端存储换成 S3 以外的东西的可能性未来)。我们还研究了允许用户使用自己的 S3 帐户提交的可能性,某些 API 确实可以这样做,但不要觉得这是一个没有吸引力的选项。
【问题讨论】:
你能多描述一下工作流程吗?用户 POST(然后是什么)......有处理和后来的 GET。只需更多地描述工作流程,因为它与典型的处理批次(如果是)和用户身份验证有关。还有什么堆栈,php任何花絮 @DrewPierce 谢谢。是的,目前它通常是一个 POST,然后由我们的分析引擎进行处理,然后由后续的 GET 检索结果。我们使用 SQS 对输入和输出进行入队/出队(没有数据进入 SQS。它只是告诉处理引擎有关新提交到 S3 的信息)。我们的用户身份验证都由我们的 API 管理平台单独处理,这只是一个调用。哦,我们没有使用“流行”语言……好吧,它是 Common Lisp :) 实际上,目前一切都像魅力一样,但我们没有规模,这就是我们所关心的. 您可以使用 HTTP PUT 从您的 API 或浏览器上的 JavaScript 客户端将文件上传到 S3。 CORS 解决了阻止 JavaScript 客户端向 S3 发送 HTTP 请求的跨域问题,但它不会阻止您的 API 发出正常的 PUT 请求。 @FedericoRaggi 谢谢,但关键是目前我们特别希望只公开我们的 API 端点(api.example.com 的形式)。我们一直在处理 EC2 上这些端点的客户端 POST,然后将它们放到我们的 S3 存储中。但是对于大量或大量的上传,这可能不会非常有效。这就是为什么我们查看 CORS 以寻找可能的直接上传。但这迫使我们支持某种上传 UI,这不是我们想要依赖的一切。因此我的问题。 亚马逊支持 POST 用于像您这样的基于浏览器的上传场景。您提到用户已经使用 POST 请求将他们的数据上传到您的 API 端点,因此希望您可以修改您今天拥有的内容以针对 Amazon 的 S3 而不是您的 API 工作。我相信亚马逊允许您将策略对象作为 POST 请求的一部分传递,因此您无需公开您的 S3 存储桶或为每个用户分配单独的存储桶。以下是亚马逊关于基于浏览器上传的文档的链接:docs.aws.amazon.com/AmazonS3/2006-03-01/dev/UsingHTTPPOST.html 【参考方案1】:鉴于您正在寻找公开 S3 的替代解决方案...
就个人而言 - 我只是从网站转储到 S3 并确保网站本身可以扩展。 (为简单起见,去掉队列部分)....但鉴于您确实提到了查看 SQS,我添加了以下内容。
-
使用非常简单的 API 创建一个小型网站,用于转储您的文件
到 SQS
创建一个服务于 SQS 的小型服务 创建一个
可重复安装(使用 userdata / chef / cloudformation
选择您的口味)服务和网站
为网站注册启动配置、ELB 和扩展组 - 选择您的
缩放参数
注册启动配置和扩展组
服务 - 选择您的缩放参数
通过 IAM 和角色配置文件向 Web 服务器提供访问权限以写入 SQS 队列
通过 IAM 和角色配置文件提供对要读取的服务的访问权限
SQS 队列
提供对服务的访问权限以写入 S3
这将为您提供跨 Web 服务、队列、写入服务和 S3 的可扩展性。
【讨论】:
以上是关于不带 CORS 直接上传到 S3(非浏览器)的主要内容,如果未能解决你的问题,请参考以下文章
使用签名的 url 将文件从 angularjs 直接上传到 amazon s3