如何配置AWS API Gateway实现透传与请求头子域名转发
解决方案:AWS API Gateway 租户请求透传配置
方案1:Lambda代理集成(推荐)
Lambda代理集成可以完全控制请求转发逻辑,支持动态修改目标域名,步骤如下:
- 创建Lambda函数,接收API Gateway代理请求(事件包含
headers、path、httpMethod等字段) - 从请求头
x-cust-domain提取租户子域名,拼接目标API地址:https://${custDomain}.xyz.com${event.path} - 用HTTP客户端(如Node.js的
axios、Python的requests)转发请求,保留原请求的方法、头、请求体 - 将目标API的响应原样返回给API Gateway,包含状态码、响应头、响应体
示例Node.js代码:
const axios = require('axios'); exports.handler = async (event) => { const custDomain = event.headers['x-cust-domain']; if (!custDomain) { return { statusCode: 400, body: JSON.stringify({ error: 'Missing x-cust-domain header' }) }; } const targetUrl = `https://${custDomain}.xyz.com${event.path}`; const config = { method: event.httpMethod, url: targetUrl, headers: { ...event.headers }, data: event.body ? JSON.parse(event.body) : undefined }; try { const response = await axios(config); return { statusCode: response.status, headers: response.headers, body: JSON.stringify(response.data) }; } catch (error) { return { statusCode: error.response?.status || 500, body: JSON.stringify({ error: error.message }) }; } };
- 在API Gateway中配置Lambda代理集成,将所有
/api/*路径指向该Lambda函数 - 确保Lambda函数具备访问目标租户API的网络权限(目标在VPC内则配置VPC访问,否则直接使用公网权限)
方案2:HTTP API集成重写(无Lambda)
若使用HTTP API而非REST API,可直接通过集成配置实现地址重写:
- 创建HTTP API,添加路由
/api/{proxy+} - 配置集成类型为HTTP集成,目标地址设为
https://{x-cust-domain}.xyz.com/api/{proxy} - 在集成的请求参数中,将请求头
x-cust-domain映射到集成的主机头变量 - 开启HTTP API的路径重写和头映射功能,确保
x-cust-domain的值正确注入目标主机名
方案3:REST API自定义VTL映射模板
针对REST API,可通过集成请求的VTL模板动态修改目标地址:
- 创建REST API,配置资源
/api/{proxy}及对应方法 - 配置集成类型为HTTP,初始目标地址设为占位符(如
https://placeholder.xyz.com/{proxy}) - 在集成请求的映射模板中,使用VTL提取
x-cust-domain并生成目标URL:
#set($custDomain = $input.params('x-cust-domain')) #if($custDomain) #set($targetUrl = "https://$custDomain.xyz.com$context.resourcePath/$context.path.proxy") #else #set($targetUrl = "https://default.xyz.com$context.resourcePath/$context.path.proxy") #end $context.setVariable("targetUrl", $targetUrl)
- 确保API Gateway有权动态解析目标域名,部分区域可能需额外配置权限
过往方案失败原因排查
- Lambda授权器:仅用于授权校验,不支持修改请求目标地址,不适用于该场景
- 302重定向失败:大概率是客户端不支持自动跟随重定向,或重定向地址跨域被浏览器拦截。若必须用重定向,建议返回
307 Temporary Redirect(保留原请求方法和体),而非302(会自动转为GET请求)
内容的提问来源于stack exchange,提问作者Shahaji Gole
相关产品推荐
相关产品推荐

