我有一个lambda需要通过api网关(使用lambda集成)返回二进制对象和一些http标头(例如内容类型)或重定向到另一个URL . 在二进制支持示例(例如https://aws.amazon.com/blogs/compute/binary-support-for-api-integrations-with-amazon-api-gateway/)中,lambda仅返回二进制对象(图像)的(base64) . 在我的情况下,我还需要返回状态代码和http标头(或等效的东西) . 我很难在api网关中使用二进制支持来完成这项工作 .
lambda在这个表单上返回一个json:
{
"statusCode": 200,
"headers": {
"content-type": "image/jpeg"
},
"body": "/9j/4AAQS...gLDAoKCAwZK",
"isBase64Encoded": true
}
在积分响应中,我为表单的image / jpeg(等)添加了body映射:
$input.json('$.body')
和'内容类型'的 Headers 映射如下:
integration.response.body.headers['content-type']
我已经尝试了上述的许多变化,但结果是一致的
Execution failed due to configuration error: Unable to transform response
如何将json从lambda转换为可以通过api网关转换为二进制的形式,使用http标头和所有?我可以从api网关获得更多的调试日志记录,以显示更具体的不满意的内容吗?
有没有办法从api网关获得更多的调试日志?
3 回答
我最近在遇到类似的问题后得到了这个工作 .
就我而言,我错过了两件事:
首先,我需要更改AWS将在“Accept” Headers 中发送到上游的类型列表“
其次,我需要将Integration Response设置为“Convert to binary(如果需要)”:
有关详细信息,请参阅this answer和示例配置 .
我还发现我没有足够的耐心 . 每当我部署API时,我都会立即进行检查,而不是等待几分钟才能传播更改 .
我厌倦了使用base64编码返回二进制数据,但我无法通过API网关从Lambda函数返回它 .
因此,我决定重定向URL . 我将方法响应更改为302并添加了"Location"响应标头 . 我还从Integration Response中删除了响应代码200,选择302作为响应代码并使用
Location
header映射integration.response.body.location
值 . 我的Lambda代码以此格式返回重定向URL的位置:希望这可以帮助 .
我发现任何文件要备份,这是可能的,而我发现这个https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-payload-encodings-workflow.html
这听起来像这样的映射只能是相反的方式;我最终做的是只返回Base64Encoded二进制字符串并在头映射中硬编码内容类型和缓存控制;完整实现请参阅我的博客文章https://mesfinmoges.com/dynamic-image-resizing-using-amazon-s3-aws-lambda-mazon-api-gateway-amazon-cloudfront/