2

我对AWS Lambda相对来说比较新,所以也许这是微不足道的,但到目前为止我还没有弄清楚。 我想返回JSON数据,就像我可以将它作为回调函数返回以响应API网关请求一样。 我遇到的问题是我想处理用户上传的图像,并以JSON格式将处理结果返回给用户。 我知道我可以创建响应S3上传(触发器)的Lambda函数,但我无法以这种方式向用户返回数据。响应S3上传返回JSON

+0

您需要包含代码示例。 –

回答

2

您可以将其作为单个同步操作来实现。如果图像少于10MB,那么您应该可以创建Lambda函数来接受图像,将其上传到S3,处理它并将数据返回给用户。这也假定您可以上传到S3并在29秒内处理图像,这是API网关超时请求之前的最长时间。

如果这不适合你,那么你将切换到异步处理。您可以拥有一个响应S3上传事件的Lambda函数,并执行处理并将结果写入DynamoDB,RDS或Aurora中的表中。然后,您可以公开一个API网关方法来检查完成的处理并获得结果。客户端然后必须轮询这个API网关方法。

1

我会建议替代办法:

  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编码方式接收。因为我们要介绍的一个瓶颈

  1. 时间上传速度会变慢:你可以与包括编码处理后的图像的Base64和一些元数据的响应回复,例如:

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

    这里的缺点。

  2. 需要进行更多的处理,特别是如果必须将大图像转换为base64或从base64转换大图像。
  3. 浏览器将更难以渲染处理后的图像。