如何知道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:
- 使用
fetch
或 axios
将图像文件上传到 uploadUrl
。
- 等待上传请求成功。
- 使用上传文件的
fileUrl
作为远程URL。
现在我正在尝试添加一个 AWS lambda 函数来压缩上传的图像。
lambda 函数将:
- 由 S3 文件上传事件触发。
- 压缩上传的文件。
- 将压缩文件放入S3存储桶。
但是,由于对uploadUrl
的上传请求会在lambda函数的第1步之前完成,所以客户端开始使用fileUrl
的时间与压缩文件实际上被放入 S3 存储桶。
我该如何填补这个空白?
据我所知,您现在有两个一般选项:
- 接收图像时压缩图像(称为静态再现)。
- 在传送图像时压缩图像并缓存结果(有时称为动态再现)。
这是所有资产交付系统中的两个选项。两种方法各有优缺点。
由于您没有提供很多细节(图像大小、使用模式等),因此很难说两者中哪一个更适合您。
因此,我将仅向您提示如何在 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.
可能还有更多选项可以帮助您构建类似的东西。但是如果没有更多的细节,很难找到最适合您的解决方案。
我正在用 apollo-server-express 制作一个 GraphQL API 服务器。
为了允许用户将他们的图像上传到 S3,我做了一个名为 userContentFileUpload Mutation 的突变,其架构如下所示:
type Mutation {
userContentFileUpload(file: File!) {
uploadUrl
fileUrl
}
}
uploadUrl
是用于上传图像文件的预签名 S3 URL,fileUrl
是包含上传图像文件将具有的密钥的 S3 URL。
因此客户可以按如下方式使用此 API:
- 使用
fetch
或axios
将图像文件上传到uploadUrl
。 - 等待上传请求成功。
- 使用上传文件的
fileUrl
作为远程URL。
现在我正在尝试添加一个 AWS lambda 函数来压缩上传的图像。
lambda 函数将:
- 由 S3 文件上传事件触发。
- 压缩上传的文件。
- 将压缩文件放入S3存储桶。
但是,由于对uploadUrl
的上传请求会在lambda函数的第1步之前完成,所以客户端开始使用fileUrl
的时间与压缩文件实际上被放入 S3 存储桶。
我该如何填补这个空白?
据我所知,您现在有两个一般选项:
- 接收图像时压缩图像(称为静态再现)。
- 在传送图像时压缩图像并缓存结果(有时称为动态再现)。
这是所有资产交付系统中的两个选项。两种方法各有优缺点。
由于您没有提供很多细节(图像大小、使用模式等),因此很难说两者中哪一个更适合您。
因此,我将仅向您提示如何在 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.
可能还有更多选项可以帮助您构建类似的东西。但是如果没有更多的细节,很难找到最适合您的解决方案。