如何创建指向AWS API Gateway的目标组以实现ALB前置架构?
你遇到的核心问题是:ALB的目标组不支持直接指向API Gateway的HTTP端点——目标组仅支持实例、IP、Lambda或其他ALB作为后端,而APIGW是托管服务,没有固定可绑定的IP,也不属于上述目标类型。
下面给你三个可行的解决方案,按复杂度和适用性排序:
方案1:用Lambda作为ALB与APIGW的中转层
这是最贴合你原有ALB架构的方案,通过Lambda把ALB的请求转发到对应APIGW:
创建转发Lambda函数
每个APIGW对应一个Lambda,负责接收ALB的请求并转发到目标APIGW。以Python为例,代码如下(需处理请求的方法、头、体和响应):import requests import base64 # 替换为你的Service1 API Gateway地址 APIGW_URL = "https://your-service1-api.execute-api.us-east-1.amazonaws.com/prod" def lambda_handler(event, context): # 提取ALB请求核心信息 http_method = event['requestContext']['http']['method'] path = event['rawPath'] headers = event['headers'] body = event.get('body') is_base64 = event.get('isBase64Encoded', False) # 构建转发请求,移除ALB自带的Host头,使用APIGW的Host req_url = f"{APIGW_URL}{path}" req_headers = {k: v for k, v in headers.items() if k.lower() != 'host'} req_body = base64.b64decode(body) if is_base64 and body else body # 发送请求到APIGW response = requests.request( method=http_method, url=req_url, headers=req_headers, data=req_body, allow_redirects=False ) # 格式化响应返回给ALB return { 'statusCode': response.status_code, 'headers': dict(response.headers), 'body': response.text, 'isBase64Encoded': False }注意:需给Lambda配置出网权限(比如附加
AWSLambdaBasicExecutionRole,并配置VPC公网访问或NAT网关)。创建Lambda类型的目标组
在EC2控制台的目标组页面,选择Lambda function类型,分别关联两个转发Lambda函数。配置ALB监听规则
在ALB的监听器中添加两条规则:- 路径匹配
/someValue/*,转发到Service1对应的Lambda目标组 - 路径匹配
/anotherValue/*,转发到Service2对应的Lambda目标组
- 路径匹配
方案2:直接用API Gateway自定义域名+路径映射(推荐,无额外组件)
如果可以放弃ALB,这个方案最简洁——直接通过APIGW的自定义域名功能实现同一域名下的路径分流:
准备SSL证书
在AWS Certificate Manager(ACM)中申请或导入覆盖你的自定义域名的证书(需在APIGW所在区域或CloudFront的us-east-1区域)。配置APIGW的基础路径映射
- 打开Service1的API Gateway控制台,进入自定义域名页面,添加你的自定义域名,在基础路径映射中:
- 基础路径填
/someValue - 选择对应的API和阶段(比如prod)
- 基础路径填
- 对Service2的APIGW重复上述操作,基础路径填
/anotherValue
- 打开Service1的API Gateway控制台,进入自定义域名页面,添加你的自定义域名,在基础路径映射中:
Route53指向APIGW自定义域名
在Route53中创建A记录,选择别名,目标指向APIGW自定义域名对应的CloudFront分配(APIGW自定义域名会自动关联一个CloudFront分配)。
注意:如果你的APIGW原有端点已经是
/someValue开头,需要调整API的资源路径为/*,因为基础路径映射会把/someValue/*转发到APIGW的/*。如果不想调整API结构,可以用方案3的CloudFront路径重写。
方案3:用CloudFront作为统一入口(适合需要CDN/WAF的场景)
CloudFront天然支持多路径分流到不同后端,还能提供缓存、WAF、全球加速等功能:
创建CloudFront分发
- 添加两个原点:分别指向Service1和Service2的APIGW域名(比如
xxxx.execute-api.region.amazonaws.com) - 添加两个行为:
- 路径模式
/someValue/*,关联Service1的原点,可配置路径重写(比如把/someValue/替换为空,转发到APIGW的/*) - 路径模式
/anotherValue/*,关联Service2的原点,同理配置路径重写
- 路径模式
- 添加两个原点:分别指向Service1和Service2的APIGW域名(比如
配置CloudFront自定义域名
在CloudFront分发中添加自定义域名,关联ACM的SSL证书。Route53指向CloudFront域名
创建Route53 A记录,别名指向CloudFront分发的域名。
方案对比
| 方案 | 复杂度 | 成本 | 适用场景 |
|---|---|---|---|
| Lambda中转 | 中等 | 低(Lambda调用成本+ALB成本) | 必须保留ALB架构的场景 |
| APIGW自定义域名映射 | 低 | 最低(仅APIGW成本) | 无需ALB,仅需路径分流的场景 |
| CloudFront | 中等 | 中(CloudFront流量成本) | 需要CDN、缓存、WAF或全球加速的场景 |
内容的提问来源于stack exchange,提问作者Alterino

