从AWS Lambda函数的S3中获取对象并发送到Api Gateway
我正在试图从一个桶中获取.jpg文件并将其发送回api网关。 我相信我有正确的设置,因为我看到东西被logging。 它从s3抓取文件,而gm是graphicsmagick库。 不知道我是否正确使用它。
在lambda函数中,我这样做(很多代码来自aws示例):
async.waterfall([ function download(next) { console.log(srcKey); console.log(srcBucket); // Download the image from S3 into a buffer. s3.getObject({ Bucket: srcBucket, Key: srcKey }, next); }, function transform(response, next) { console.log(response); next(null, 'image/jpeg', gm(response.Body).quality(85)); }, function sendData(contentType, data, next){ console.log(contentType); console.log(data); imageBuffer = data.sourceBuffer; context.succeed(imageBuffer); } ] );
响应头有内容长度:85948,这似乎不正确,因为原始文件只有36kb。 任何人都知道我在做什么错了?
与Lambda
一起使用时,不应使用API Gateway
传回二进制内容。 带有Lambda
API Gateway
设置为使用XML/JSON
数据进行响应。 阅读更多关于为什么和如何在这里 。
尝试改变您的callback链,以便将修改的图像上传回S3
。 成功上传后,发回目标对象的URI
并将客户端redirect到它。
您可以轻松实现Get Image < – > API网关< – > Lambda < – > S3集成。
在lambda中,而不是json,返回图像的base64string表示( buffer.toString('base64')
),强制API网关将string转换为二进制,并添加特定的Content-Type
(所以你不需要使用它们的限制二进制支持,强制你发送一个特定的Accept头)。
在AWS控制台中,转到API网关,然后转到相关方法并更新设置:
-
集成请求
- 取消选中: 使用Lambda代理集成
-
方法响应
- 添加响应 – > HTTP状态: 200
- 添加标题: 内容types
-
集成响应 – >标题映射 – >响应标题 – >内容types
- 映射值: 'image / jpeg' (单引号的问题)
从命令行运行下面的命令强制转换string为二进制。 首先,从API网关检索rest-api-id和resource-id 。 然后,在CLI中运行(用你自己的replacerest-api-id和resource-id):
aws apigateway put-integration-response --rest-api-id <rest-api-id> --resource-id <resource-id> --http-method GET --status-code 200 --content-handling CONVERT_TO_BINARY