通过API Gateway或Lambda

时间:2018-05-30 16:34:02

标签: amazon-web-services aws-lambda aws-sdk aws-api-gateway

我试图在AWS中创建可重用的大型无文件服务器上传服务(我们托管了许多站点)。我想要做的是在AWS中设置API网关并使用CORS来控制哪些站点可以上传,允许站点使用客户端代码。以下是我尝试过的以及我遇到过的障碍。想知道是否有人有任何建议的解决方法?

  • 从客户端代码上传调用S3需要我在客户端土地上公开身份验证信息,这看起来很糟糕
  • API Gateway似乎不支持通过其AWS Service集成类型调用S3多点(URL固定为通用S3服务URL,并且HTTP集成类型不支持IAM)
  • 利用Lambda调用多部分API不会起作用,因为它只能接收6 MB的调用请求负载,并且为了获得5 MB的最小上传部分大小,base64将使数据更加方便超过6 MB
  • 我可以在Lambda中执行我自己的部分上传功能,将块存储在S3中,但我无法弄清楚如何在Lambda的内存和tmp存储空间中将它们合并在一起(仍然是PassThrough流做似乎不适用于AWS SDK)

有什么想法吗?这些都值得挖掘吗?或者这个用例是无服务器吗?

因此,在对亚马逊进行进一步跟进之后,可以将预签名的URL与多部分API一起使用,但这不太实用。涉及的步骤包括以下内容:

  1. 创建一个新文件,并将其拆分为多个部分。
  2. 生成预先签名的URL以启动multiart上传。
  3. 使用预先签名的网址启动上传。
  4. 使用部件号为每个部件生成预先签名的URL。
  5. 使用网址发送PutPart请求。跟踪为部件号返回的Etag。
  6. 合并所有零件和相应的ETAG以形成请求正文。
  7. 生成预先签名的URL以完成MP上传。
  8. 通过使用预先签名的完整分段上传网址发送请求来完成分段上传。
  9. 接受Angelo的答案,因为它确实指出了这个方向,从技术上讲,这似乎是可能的

1 个答案:

答案 0 :(得分:0)

您可以使用预先指定的网址进行上传。在这种情况下,客户端会点击您的API,这将执行任何必要的验证,然后生成一个返回给客户端的预先签名的URL到S3。然后客户端直接上传到s3。

您可以在此处查看一些信息:https://sanderknape.com/2017/08/using-pre-signed-urls-upload-file-private-s3-bucket/