Return JSON 响应 S3 上传

Return JSON in response to S3 Upload

我对 AWS Lambda 比较陌生,所以这可能是微不足道的,但到目前为止我还没有弄明白。 我想要 return JSON 数据,我可以 return 将其作为响应 API 网关请求的回调。 我遇到的问题是,我想处理用户上传的图像,并 return 以 JSON 格式向用户提供该处理的结果。 我知道我可以创建响应 S3 上传(触发器)的 Lambda 函数,但我不能 return 以这种方式向用户发送数据。

您可以将此实现为单个同步操作。如果图像小于 10MB,那么您应该能够创建一个 Lambda 函数来接受图像,将其上传到 S3,进行处理,然后 return 将数据提供给用户。这还假设您可以在 29 秒内上传到 S3 并处理图像,这是 API 网关使请求超时之前的最长时间。

如果这对您不起作用,那么您将不得不切换到异步处理。您可以使用 Lambda 函数来响应 S3 上传事件并进行处理并将结果写入 DynamoDB、RDS 或 Aurora 中的 table。然后,您可以公开一个 API 网关方法来检查已完成的处理并获取结果。然后,客户端必须轮询此 API 网关方法。

我推荐另一种方法:

  1. let the browser do the upload to S3直接使用javascript
  2. subscribe your lambda function to S3 events 在那个桶里
  3. 让您的 Lambda 函数缩略图并根据命名约定将生成的缩略图保存回 S3,例如,如果您的图像是 someimage.jpg,您可以将其保存为 someimage-thumb.jpg
  4. 上传完成后,让 javascript 客户端循环轮询 S3 存储桶,直到缩略图存在并显示。

此方法会带来更快的上传速度、更好的用户体验并且应该非常可靠。

=========================================== ====

如果您真的想使用 API 网关,这是可能的,因为二进制数据是 now supported。您可以在函数中接收二进制或 base64 编码的数据。您可以回复包含经过 base64 编码处理的图像和一些元数据的响应,例如:

{
    "thumbnail": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg==",
    "metadataKey1": "some data",
    "metadataKey2": "some other data"
}

这里的缺点:

  1. 上传速度会变慢,因为我们引入了瓶颈。
  2. 需要更多的处理,特别是如果必须转换大图像 to/from base64。
  3. 浏览器将更加努力地渲染处理后的图像。