我对 AWS Lambda 比较陌生,所以这可能是微不足道的,但到目前为止我还没有弄清楚。我想返回 JSON 数据,因为我可以将其作为回调返回以响应 API 网关请求。我遇到的问题是我想处理用户上传的图像并将处理结果以 JSON 格式返回给用户。我知道我可以创建响应 S3 上传(触发器)的 Lambda 函数,但我不能以这种方式将数据返回给用户。
问问题
1724 次
2 回答
2
您可以将其实现为单个同步操作。如果图像小于 10MB,那么您应该能够创建一个 Lambda 函数来接受图像,将其上传到 S3,对其进行处理,并将数据返回给用户。这也假设您可以在 29 秒内上传到 S3 并处理图像,这是 API Gateway 将请求超时之前的最长时间。
如果这对您不起作用,那么您将切换到异步处理。您可以使用 Lambda 函数来响应 S3 上传事件并进行处理并将结果写入 DynamoDB、RDS 或 Aurora 中的表。然后,您可以公开一个 API Gateway 方法来检查已完成的处理并获取结果。然后,客户端必须轮询此 API Gateway 方法。
于 2017-01-02T00:46:26.653 回答
1
我会推荐一种替代方法:
- 让浏览器直接使用 javascript上传到 S3
- 将您的 lambda 函数订阅到该存储桶中的 S3 事件
- 让您的 Lambda 函数对图像进行缩略图,并根据命名约定将生成的缩略图保存回 S3,例如,如果您的图像是
someimage.jpg
,您可以将其保存为someimage-thumb.jpg
. - 上传完成后,让 javascript 客户端循环轮询 S3 存储桶,直到缩略图存在并显示。
这种方法将导致更快的上传,更好的用户体验,并且应该非常可靠。
=================================================
如果你真的想使用 API 网关,这是可能的,因为现在支持二进制数据。您可以在函数中接收二进制或 base64 编码的数据。您可以回复包含 base64 编码的处理图像和一些元数据的响应,例如:
{
"thumbnail": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg==",
"metadataKey1": "some data",
"metadataKey2": "some other data"
}
这里的缺点:
- 由于我们引入了瓶颈,上传时间会变慢。
- 需要更多的处理,特别是如果必须将大图像转换为 base64 或从 base64 转换。
- 浏览器将更加努力地渲染处理后的图像。
于 2017-01-02T19:48:41.183 回答