【问题标题】:AWS S3 Muitipart Upload via API Gateway or Lambda通过 API Gateway 或 Lambda 上传 AWS S3 Muitipart
【发布时间】:2018-11-09 14:23:44
【问题描述】:

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

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

有什么想法吗?这些值得深入研究吗?或者对于这个用例来说,无服务器是不行的?

因此,在与 Amazon 进一步跟进之后,在多部分 API 中使用预签名 URL 是有可能的,但这不是很实用。涉及的步骤将包括以下内容:

  1. 创建一个新文件,并将其拆分为多个部分。
  2. 生成预签名 URL 以启动多艺术上传。
  3. 使用预签名 URL 启动上传。
  4. 使用部件号为每个部件生成预签名 URL。
  5. 使用 URL 发送 PutPart 请求。跟踪为部件号返回的 Etag。
  6. 将所有部分和相应的 ETAG 组合成请求正文。
  7. 生成预签名 URL 以完成 MP 上传。
  8. 通过使用预先签名的完整分段上传 URL 发送请求来完成分段上传。

会接受安吉洛的回答,因为它确实指出了这个方向,从技术上讲,这似乎是可能的

【问题讨论】:

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


    【解决方案1】:

    您或许可以使用预签名的网址进行上传。在这种情况下,客户端将访问您的 API,该 API 将执行任何必要的验证,然后生成一个预签名的 S3 url,该 url 返回给客户端。然后客户端直接上传到s3。

    你可以在这里看到一些信息:https://sanderknape.com/2017/08/using-pre-signed-urls-upload-file-private-s3-bucket/

    【讨论】:

    • 有趣的方法。我唯一能看到的是,如果返回的方法只支持 POST,那么分段上传也需要 PUT(和 DELETE 用于中止)。我会试试看它是否有效。
    猜你喜欢
    • 1970-01-01
    • 2019-02-14
    • 2016-11-20
    • 2021-02-04
    • 2017-04-13
    • 2021-10-23
    • 2019-10-20
    • 2021-04-20
    • 1970-01-01
    相关资源
    最近更新 更多