【问题标题】:API Gateway GET / PUT large files into S3API Gateway GET / PUT 大文件到 S3
【发布时间】:2017-08-15 12:08:18
【问题描述】:

this AWS documentation 之后,我能够在我的 API 网关上创建一个新端点,该端点能够操作 S3 存储库上的文件。我遇到的问题是文件大小 (AWS having a payload limitation of 10MB)。

我想知道,如果不使用 lambda 解决方法 (this link would help with that),是否可以上传和获取大于 10MB 的文件(如果需要,即使是二进制文件),因为这是使用 S3 服务作为代理- 还是不管限制?

我试过PUTting和GETting大于10MB的文件,每个响应都是典型的"message": "Timeout waiting for endpoint response"

看起来Lambda 是唯一的方法,只是想知道是否有其他人解决了这个问题,使用 S3 作为代理。

谢谢

【问题讨论】:

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


    【解决方案1】:

    您可以创建一个 Lambda 代理函数,该函数将返回一个带有 S3 预签名 URL 的重定向链接。

    生成预签名 S3 URL 的示例 JavaScript 代码:

    var s3Params = {
        Bucket: test-bucket,
        Key: file_name,
        ContentType: 'application/octet-stream',
        Expires: 10000
    };
    
    s3.getSignedUrl('putObject', s3Params, function(err, data){
       ...
    }
    

    然后您的 Lambda 函数会向您的客户端返回重定向响应,例如,

    {
        "statusCode": 302,
        "headers": { "Location": "url" }
    }
    

    您或许可以从这个documentation 中找到您需要的更多信息。

    【讨论】:

    • 虽然不理想(我希望使用 API 作为 Amazon S3 代理来实现这一点),但似乎无法绕过这个限制。这个答案让我想到了我将使用的东西 - AWS 的预签名 URL (docs.aws.amazon.com/AmazonS3/latest/dev/…),谢谢。
    • 但是有了redirect,是不是初始请求的payload还是太大的问题呢?我的意思是 PUT 仍将通过 API 网关,这将引导您到 Lambda,它会将您重定向到直接 S3 上传。但它会失败,因为 API 网关的有效负载太大,还是我误解了什么?我实际上已经实现了它,它适用于小文件的重定向,但对于大文件,问题仍然存在(它甚至没有通过我的 API 网关......)
    • @konse 客户端首先必须发出一个 GET 请求来检索同样不理想的 URL。
    【解决方案2】:

    如果您有大文件,请考虑将它们从您的客户端直接上传到 S3。您可以创建 API 端点以返回 signed URL 供客户端用于上传(实施访问控制)您的私有内容。

    您也可以考虑使用multi-part uploads 来处理更大的文件以加快上传速度。

    【讨论】:

    • 感谢您的建议,但您不需要 Lambda 来运行您的建议吗? (返回签名的网址)?我在问题中发布的 URL 已经表明了这一点,我的查询是在没有 lambda 的情况下进行。
    • 是的。为此,您需要计算服务。其他方法很少。如果您使用 AWS cognito 进行身份验证或有一个端点从后端调用 Amazon STS 以生成临时访问令牌(这个更类似于签名 url),您可以从浏览器客户端访问 S3 中的私有资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2016-11-20
    • 2018-04-15
    • 2020-11-30
    • 2018-08-24
    • 1970-01-01
    • 2012-04-23
    相关资源
    最近更新 更多