如何配置AWS API Gateway以支持Lambda返回Gzip压缩JSON响应
问题描述
我正在尝试创建一个可通过AWS API Gateway访问的AWS Lambda函数,使其返回Gzip压缩的JSON响应。以下是我的Lambda TypeScript代码:
import { DB } from '@/DB/db'; import zlib from 'zlib'; import { promisify } from 'util'; export async function main(db: DB) { const gzip = promisify(zlib.gzip); console.info('procees of getTools tools started'); const result = await db.getToolsRepo().getTools(); const jsonString = JSON.stringify(result); // Compress with gzip const gzipCompressed = await gzip(Buffer.from(jsonString, 'utf-8')); // Prepare the response const response = { statusCode: 200, headers: { 'Content-Type': 'application/json', 'Content-Encoding': 'gzip' }, body: gzipCompressed.toString('base64'), isBase64Encoded: true }; return response; }
我尝试了AWS API Gateway“内容处理”的“直通”和“转换为二进制”选项,但都无效,收到的是嵌套响应而非Base64二进制数据:
{"statusCode":200,"headers":{"Content-Type":"application/json","Content-Encoding":"gzip"},"body":"H4sIAA ...
解决方案
1. 配置API Gateway二进制媒体类型
- 进入API Gateway控制台,选中目标API,切换到设置标签页。
- 在二进制媒体类型区域,添加
application/json,点击保存。这一步让API Gateway识别该类型的响应为二进制数据进行处理。
2. 确认Lambda集成的内容处理设置
- 如果使用Lambda代理集成:API Gateway会自动识别响应中的
isBase64Encoded字段,无需额外配置响应模板,但必须确保已配置好上述二进制媒体类型。 - 如果使用非代理集成:将集成请求的内容处理设置为转换为二进制,同时确保响应模板直接传递Lambda返回的
body内容。
3. 验证Lambda响应格式
你的代码格式已经正确,但需再次确认:
isBase64Encoded必须设为true,明确告知API Gateway需要将base64编码的body解码为二进制数据。- 响应头
Content-Encoding: gzip和Content-Type: application/json必须完整设置,确保客户端能正确解压并解析响应。
4. 重新部署API
所有配置修改完成后,务必将API重新部署到对应的阶段,否则更改不会生效。
额外排查点
- 测试时在请求头中添加
Accept-Encoding: gzip,触发API Gateway返回压缩响应。 - 查看CloudWatch日志,确认Lambda确实返回了格式正确的响应,没有额外的嵌套或格式错误。
内容的提问来源于stack exchange,提问作者Pavel Bernshtam
相关产品推荐
相关产品推荐

