You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:15:04