如何使用 Lambda 加载大文件(当预签名 URL 不是一个选项



我需要为我们的应用程序开发一个公共的API。它在AWS Lambda中运行,并使用S3作为存储。现在的问题是,这个公共的API应该能够处理文件的增加。文件可以大于6mb,因此超出了Lambda的限制。

对于我们的内部使用来说,使用预签名的URL并将文件直接加载到S3是一个很好的选择,但在公共API的情况下,这可能会让消费者感到困惑。

对于将使用API的服务来说,这还不太清楚,他们为什么要调用以接收预签名的url,将文件加载到此url,并向我们的API再做一个确认请求。

我想让消费者尽可能清楚,但不知道如何处理。

我唯一能发明的就是创建一个代理EC2实例。API url将导致此实例,它将处理请求:

  1. 如果是存储json数据的简单请求,它将直接调用将其存储在数据库中的应用程序中的端点
  2. 如果是文件upload请求,它会将文件加载到S3,然后调用应用程序端点,以便应用程序可以处理文件的加载请求并返回响应

但这是一种非常棘手的方式,所以我正在考虑一些更简单的选项

将Api网关直接集成到S3是一种方法:

https://aws.amazon.com/premiumsupport/knowledge-center/api-gateway-upload-image-s3/

这是文件中提到集成的部分。

现在,选择Integration Request并在集成类型类别。对于AWS区域,请选择us-west-2。对于AWS服务,选择简单存储服务(S3(。

实际上,您现在可以将Lambda与高达10GB的Ephemeral Storage一起使用:https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-临时存储

编辑:我看到有效载荷限制不是问题,谢谢Mark B.

两种可能的选择:

选项1

如果您正在与自己的网络/移动应用程序交互,S3预签名URL选项也不错。您将Lambda置于标准用户身份验证/授权之后,然后返回一个有效载荷,如:

{
"upload_url": "<presigned url>"
}

然后,客户端可以简单地将文件传递到您在响应中指定的上传url。

选项2

如果你正在构建一个公共编程API,其中你不想泄露S3的细节,那么我建议实现多部分文件上传。您可以使用API网关和AWS Lambda实现这一点,确保每次上传都在这些服务的限制范围内。在这种方法中,您将需要设计和实现客户端感觉自然的API。AWS S3 CLI在封面下进行多部分上传。

最新更新