如何知道lambda图像压缩是否完成?

How to know whether lambda image compression is completed?

我正在用 apollo-server-express 制作一个 GraphQL API 服务器。

为了允许用户将他们的图像上传到 S3,我做了一个名为 userContentFileUpload Mutation 的突变,其架构如下所示:

type Mutation {
  userContentFileUpload(file: File!) {
    uploadUrl
    fileUrl
  }
}

uploadUrl 是用于上传图像文件的预签名 S3 URL,fileUrl 是包含上传图像文件将具有的密钥的 S3 URL。

因此客户可以按如下方式使用此 API:

  1. 使用 fetchaxios 将图像文件上传到 uploadUrl
  2. 等待上传请求成功。
  3. 使用上传文件的fileUrl作为远程URL。

现在我正在尝试添加一个 AWS lambda 函数来压缩上传的图像。

lambda 函数将:

  1. 由 S3 文件上传事件触发。
  2. 压缩上传的文件。
  3. 将压缩文件放入S3存储桶。

但是,由于对uploadUrl的上传请求会在lambda函数的第1步之前完成,所以客户端开始使用fileUrl的时间与压缩文件实际上被放入 S3 存储桶。

我该如何填补这个空白?

据我所知,您现在有两个一般选项:

  1. 接收图像时压缩图像(称为静态再现)。
  2. 在传送图像时压缩图像并缓存结果(有时称为动态再现)。

这是所有资产交付系统中的两个选项。两种方法各有优缺点。

由于您没有提供很多细节(图像大小、使用模式等),因此很难说两者中哪一个更适合您。

因此,我将仅向您提示如何在 AWS 中实施两者。

如果你想在收到图片时进行压缩,并且只允许在压缩图片时访问fileUrl,你可以切换到Step Functions. Since a few months API Gateway allows you to send incoming requests directly to express Step Functions进行处理。因此,您可以创建一个 Step Function 来下载图像、创建压缩​​版本,然后将 returns 发送给调用方。显然,这是有限制的。图片越大,处理时间可能越长,您可能 运行 超时等。所以上传 2MB 的图片,没问题。上传 1GB 大的图片,这可能会成为一个问题。

您的第二个选择是在交付时压缩并缓存结果。如果你使用 AWS Cloudfront, you can use Lambda@Edge to do this. But you could also use S3 Object Lambdas.

可能还有更多选项可以帮助您构建类似的东西。但是如果没有更多的细节,很难找到最适合您的解决方案。