从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-idresource-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