整体架构 | DNS 与 HTTPS 链路 | Direct Connect | Route 53 Resolver | Private API Gateway | 安全与排障
这里要特别注意:这不是一条所有流量依次穿过的“串行代理链”。
它实际上分成两条独立流程:
- DNS解析路径:负责把私有域名解析成 VPC Endpoint 的私有 IP。
- HTTPS访问路径:客户端拿到私有 IP 后,直接通过 Direct Connect 访问 Interface VPC Endpoint,再由 AWS PrivateLink 转入 Private API Gateway。
二、整体架构
下面以东京区域 ap-northeast-1 为例。
外部公司网络
172.20.0.0/16
│
├─ 业务客户端
│ curl / Java / Postman / 业务系统
│
├─ 外部公司 DNS
│ 条件转发:
│ api.partner.example.com
│ ↓
│ 10.20.10.10
│ 10.20.20.10
│
└─ 外部公司路由器
BGP
│
│ AWS Direct Connect
▼
Direct Connect Location
│
▼
Direct Connect Gateway
│
├─ Private VIF → VGW
│ 或
└─ Transit VIF → Transit Gateway
│
▼
AWS VPC
10.20.0.0/16
│
┌──────────────┴──────────────┐
│ │
▼ ▼
Route 53 Resolver Interface VPC Endpoint
Inbound Endpoint com.amazonaws.ap-northeast-1.execute-api
UDP/TCP 53 TCP 443
10.20.10.10 10.20.11.x
10.20.20.10 10.20.21.x
│ │
▼ │
Route 53 Private Hosted Zone │
partner.example.com │
│ │
api.partner.example.com │
Alias → VPC Endpoint ─────────────┘
│
▼
API Gateway Private Domain
│
Domain Access Association
│
▼
API Mapping / Base Path
│
▼
Private REST API Gateway
│
▼
Lambda / AWS Service / VPC Link
Route 53 Resolver Inbound Endpoint 接收来自本地网络的 DNS 请求,而 Private Hosted Zone 保存私有域名记录;Interface VPC Endpoint 则是 HTTPS 数据流真正进入 API Gateway 的入口。
三、一次完整请求究竟如何流动
假设外部公司系统请求:
https://api.partner.example.com/v1/orders
1. DNS解析过程
客户端首先询问外部公司的内部 DNS:
api.partner.example.com 是什么 IP?
外部公司 DNS 上配置了条件转发:
partner.example.com
→ 10.20.10.10
→ 10.20.20.10
这两个 IP 是 AWS VPC 中的 Route 53 Resolver Inbound Endpoint IP。
DNS请求走:
外部公司 DNS
→ Direct Connect
→ Transit Gateway/VGW
→ Resolver Inbound Endpoint
→ Route 53 VPC Resolver
→ Private Hosted Zone
Private Hosted Zone 中存在:
api.partner.example.com
A Alias
→ vpce-xxxxxxxx.execute-api.ap-northeast-1.vpce.amazonaws.com
最终返回的不是 API Gateway 公网 IP,而是 Interface VPC Endpoint ENI 的私有 IP,例如:
10.20.11.45
10.20.21.82
Inbound Endpoint 的 IP 本身也是 VPC 私有 IP,因此本地网络必须通过 Direct Connect 或 VPN 与该 VPC 建立路由。AWS要求每个 Resolver Endpoint 至少配置两个 IP,并推荐放在不同可用区。
2. HTTPS访问过程
DNS结束后,客户端向解析出的 VPC Endpoint 私有 IP 建立 TCP 443:
客户端
→ Direct Connect
→ TGW/VGW
→ VPC Endpoint ENI:443
→ AWS PrivateLink
→ API Gateway Private Custom Domain
→ API Mapping
→ Private REST API
这里 Route 53 Resolver 不参与 HTTPS转发。它只负责之前的 DNS解析。
Private API Gateway 只能通过 API Gateway 的 Interface VPC Endpoint 访问,API资源策略还必须允许指定的 VPC或VPC Endpoint。
四、各服务为什么存在
1. AWS Direct Connect
作用
Direct Connect 在外部公司网络和 AWS 之间提供私有专线连接。
它主要负责:
- 将外部公司的私有网段路由到 AWS VPC。
- 将 AWS VPC网段发布给外部公司。
- 承载 DNS请求。
- 承载 HTTPS API请求。
- 避免业务流量经过公共互联网。
- 提供相对稳定的带宽和时延。
Direct Connect不负责什么
Direct Connect本身不负责:
- DNS解析。
- API身份认证。
- API授权。
- TLS证书。
- API Gateway路由。
- 自动加密全部链路。
Direct Connect是“私有线路”,但不能简单等同于“端到端加密线路”。需要链路加密时,可以考虑支持条件下的 MACsec,或者在 Direct Connect 上叠加 Site-to-Site VPN/IPsec。MACsec的 must_encrypt 模式会在无法建立加密时停止传输;should_encrypt 则可能在失败时回退到未加密通信。
2. Route 53 Resolver Inbound Endpoint
作用
让外部公司自己的 DNS服务器能够询问 AWS VPC内的 DNS。
没有它,外部公司的本地 DNS不能直接查询:
- Route 53 Private Hosted Zone。
- VPC内部私有DNS名称。
- 与 VPC Endpoint有关的私有记录。
Inbound Endpoint创建后,会在指定子网创建 ENI,并分配固定私有 IP。外部公司 DNS将对应域名的请求转发到这些 IP。
为什么不能直接询问 VPC的 VPC+2 DNS
VPC内常见 DNS地址类似:
VPC CIDR:10.20.0.0/16
VPC Resolver:10.20.0.2
但外部网络不应该直接把 10.20.0.2 当作普通 DNS服务器使用。混合网络的标准入口是 Resolver Inbound Endpoint。
3. Route 53 Private Hosted Zone
作用
保存私有域名和对应记录,例如:
Private Hosted Zone:
partner.example.com
Record:
api.partner.example.com
A Alias
→ execute-api Interface VPC Endpoint
Private Hosted Zone仅对关联 VPC以及通过相应 Resolver Inbound Endpoint进入的查询生效,不需要把 API真实地址暴露到公网DNS。
4. Interface VPC Endpoint
服务名:
com.amazonaws.ap-northeast-1.execute-api
作用
Interface VPC Endpoint 是 Private API Gateway 在 VPC内的私有入口。
它会在选择的每个可用区子网中创建一个 ENI:
AZ-a:10.20.11.45
AZ-c:10.20.21.82
外部公司的 HTTPS请求最终到达这些 ENI,再通过 AWS PrivateLink进入 API Gateway。
Interface Endpoint支持:
- Security Group。
- VPC Endpoint Policy。
- 多可用区。
- 私有DNS名称。
- IPv4、IPv6或双栈,视服务和配置而定。
AWS建议 Interface Endpoint选择多个子网来提高可用性。
5. API Gateway Private Custom Domain
例如:
api.partner.example.com
它解决两个问题:
友好的调用地址
不用使用:
https://a1b2c3d4-vpce123.execute-api.ap-northeast-1.amazonaws.com/prod
而使用:
https://api.partner.example.com/v1
TLS证书
API Gateway根据 TLS SNI 中的:
api.partner.example.com
选择对应 ACM证书。
Private Custom Domain与 VPC Endpoint之间必须创建:
Domain Name Access Association
否则,即使 DNS已经指向 Endpoint,API Gateway也不会允许该 Endpoint使用这个私有域名。
6. Private API Gateway
Private API Gateway是最终API入口。
它可以继续集成:
- Lambda。
- AWS服务。
- HTTP后端。
- 通过 VPC Link连接 ALB/NLB及 VPC内服务。
Private API并不代表“任何通过专线的人都能调用”。至少还存在以下授权层:
VPC Endpoint Security Group
VPC Endpoint Policy
Private Domain Resource Policy
Private API Resource Policy
API方法级认证
后端业务认证
Private API的资源策略可以通过 aws:SourceVpce 或 aws:SourceVpc 限制来源。AWS推荐明确指定 VPC或VPC Endpoint,而不是允许所有来源。
五、推荐的地址和资源规划
下面给一个具体例子。
| 项目 | 示例 |
|---|---|
| AWS Region | ap-northeast-1 |
| AWS VPC | 10.20.0.0/16 |
| 外部公司网段 | 172.20.0.0/16 |
| Resolver Endpoint子网A | 10.20.10.0/24 |
| Resolver Endpoint子网C | 10.20.20.0/24 |
| Resolver IP A | 10.20.10.10 |
| Resolver IP C | 10.20.20.10 |
| execute-api Endpoint子网A | 10.20.11.0/24 |
| execute-api Endpoint子网C | 10.20.21.0/24 |
| 私有域名 | api.partner.example.com |
| Private Hosted Zone | partner.example.com |
| API Stage | prod |
| Base Path | v1 |
建议将 Resolver Endpoint 和 Interface Endpoint 分开放在专用子网中,便于:
- 独立配置 NACL。
- 分离 Flow Logs。
- 识别成本。
- 独立控制路由和安全组。
- 后续替换或扩容。
六、第一阶段:Direct Connect配置
方案A:只有一个 VPC
可以采用:
Direct Connect
→ Private VIF
→ Direct Connect Gateway
→ Virtual Private Gateway
→ VPC
Private VIF主要用于通过私有 IP访问 VPC。创建时需要设置 VLAN、客户侧 BGP ASN、BGP Peer IP、MTU等参数。
方案B:多个 VPC或共享网络中心
推荐:
Direct Connect
→ Transit VIF
→ Direct Connect Gateway
→ Transit Gateway
→ Shared Services VPC
这是企业环境更常见的设计,因为后续可以将:
- DNS VPC。
- API VPC。
- 业务 VPC。
- 安全检查 VPC。
统一接入 Transit Gateway。
Transit VIF用于连接与 Direct Connect Gateway关联的 Transit Gateway;Direct Connect Gateway的 allowed prefixes 会影响向本地网络发布的 AWS侧前缀。
Direct Connect配置步骤
1. 建立物理或Hosted Connection
可以是:
- Dedicated Connection。
- 由合作伙伴提供的 Hosted Connection。
企业正式生产环境应避免只有一条链路。AWS的高可用模型建议使用不同设备、不同 Direct Connect Location的冗余连接,并可以使用 Resiliency Toolkit测试 BGP故障切换。
2. 创建 Direct Connect Gateway
例如:
Name: dxgw-partner-api
Amazon side ASN: 64520
3. 创建 Transit Gateway
例如:
TGW ASN: 64530
将 API所在 VPC attach到 TGW。
4. 关联 DX Gateway和 TGW
需要设置 allowed prefixes,例如:
10.20.0.0/16
不要随意发布:
0.0.0.0/0
10.0.0.0/8
除非这是经过明确审核的网络设计。
5. 创建 Transit VIF
关键参数包括:
VLAN: 120
Customer ASN: 65010
AWS ASN: 来自 DXGW
Customer Peer IP: 169.254.x.x/30
AWS Peer IP: 169.254.x.x/30
BGP MD5 Key: 自动生成或指定
MTU: 1500 或 8500
6. 配置本地路由器
本地向 AWS发布:
172.20.0.0/16
AWS向本地发布:
10.20.0.0/16
7. 配置 TGW路由表
AWS侧至少需要:
172.20.0.0/16
→ Direct Connect Gateway/TGW关联方向
API VPC子网路由表需要:
172.20.0.0/16
→ Transit Gateway
外部公司路由器需要:
10.20.0.0/16
→ Direct Connect
Direct Connect最常见错误
路由只配置了单向
例如:
外部公司可以到 10.20.11.45
但 AWS不知道如何回到 172.20.0.0/16
结果通常是 TCP连接超时。
CIDR重叠
例如:
外部公司:10.20.0.0/16
AWS VPC:10.20.0.0/16
这种情况不能依靠普通路由解决,通常需要:
- 重新规划地址。
- NAT。
- 中间代理。
- PrivateLink服务化架构。
MTU不一致
Private VIF可以使用1500或9001,Transit VIF可以使用1500或8500。启用 Jumbo Frame前要确认客户路由器、运营商、DX链路、TGW及中间设备都支持,否则可能出现小请求正常、大请求卡住的问题。
七、第二阶段:创建 Route 53 Resolver Inbound Endpoint
1. 创建安全组
例如:
sg-r53-inbound
入站规则:
UDP 53
Source: 外部公司 DNS服务器IP/32
TCP 53
Source: 外部公司 DNS服务器IP/32
例如:
UDP 53 ← 172.20.1.10/32
UDP 53 ← 172.20.1.11/32
TCP 53 ← 172.20.1.10/32
TCP 53 ← 172.20.1.11/32
不要只开放 UDP 53。以下情况可能使用 TCP:
- DNS响应过大。
- DNSSEC。
- UDP截断后的重试。
- 某些内部DNS产品的行为。
AWS明确要求 Inbound Endpoint安全组允许 TCP和UDP 53。
2. 创建 Inbound Endpoint
控制台路径:
Route 53
→ Resolver
→ Inbound endpoints
→ Create inbound endpoint
建议设置:
Name: r53-inbound-partner-api
VPC: vpc-api-shared
Endpoint category: Default
Protocol: Do53
Security Group: sg-r53-inbound
配置两个 AZ:
AZ-a
Subnet: subnet-dns-a
IP: 10.20.10.10
AZ-c
Subnet: subnet-dns-c
IP: 10.20.20.10
AWS要求最少两个 IP,并建议位于不同可用区;这些 IP在 Endpoint生命周期内保持不变。
3. 外部公司DNS配置条件转发
Windows DNS示例:
Conditional Forwarder:
partner.example.com
Master Servers:
10.20.10.10
10.20.20.10
BIND示例:
zone "partner.example.com" {
type forward;
forward only;
forwarders {
10.20.10.10;
10.20.20.10;
};
};
推荐只转发精确域名:
partner.example.com
不要无必要地配置:
.
com
example.com
否则大量无关 DNS查询可能被转发到 AWS。
4. 验证 DNS链路
直接测试 AWS Resolver IP:
dig @10.20.10.10 api.partner.example.com
再通过外部公司正常 DNS测试:
dig api.partner.example.com
初期 Private Hosted Zone还没创建时,可能返回 NXDOMAIN,这至少可以证明请求已经到达 Resolver。
八、第三阶段:创建 execute-api Interface VPC Endpoint
1. 创建 Endpoint安全组
例如:
sg-vpce-execute-api
入站规则:
TCP 443
Source: 172.20.0.0/16
更严格时只允许业务系统网段:
TCP 443
Source: 172.20.10.0/24
不要误以为只允许 VPC CIDR就可以。调用方位于外部公司网络,VPC Endpoint看到的来源通常是外部公司的原始私有 IP,因此必须允许对应网段。
AWS要求 execute-api Endpoint安全组允许 HTTPS 443流量。
2. 创建 Endpoint
控制台路径:
VPC
→ Endpoints
→ Create endpoint
选择:
Service category: AWS services
Service:
com.amazonaws.ap-northeast-1.execute-api
Type:
Interface
配置:
VPC: vpc-api-shared
Subnets:
subnet-endpoint-a
subnet-endpoint-c
Security Group:
sg-vpce-execute-api
Private DNS:
Enabled
建议至少选择两个可用区。每个选定 AZ只能选择一个子网,AWS会在每个子网创建一个 Endpoint ENI。
AWS CLI示例:
aws ec2 create-vpc-endpoint \
--region ap-northeast-1 \
--vpc-id vpc-0123456789abcdef0 \
--vpc-endpoint-type Interface \
--service-name com.amazonaws.ap-northeast-1.execute-api \
--subnet-ids subnet-aaa subnet-ccc \
--security-group-ids sg-0123456789abcdef0 \
--private-dns-enabled
3. Private DNS开关的影响
开启 execute-api Private DNS后:
*.execute-api.ap-northeast-1.amazonaws.com
在该 VPC内会优先解析到 VPC Endpoint。
这样调用 Private API的默认域名更方便,但也有副作用:
- VPC内访问公网 API Gateway默认
execute-apiURL时,可能被解析到 Private Endpoint。 - 公网 API可能因此无法通过默认域名访问。
- 公网 API最好使用自己的 Regional Custom Domain。
AWS文档明确提醒,启用 execute-api Endpoint私有DNS后,VPC内通过默认 endpoint访问公网 API可能受到影响。
九、第四阶段:创建 Private REST API
1. 创建API
控制台:
API Gateway
→ Create API
→ REST API
→ Build
选择:
Endpoint type: Private
IP address type: Dualstack
VPC Endpoint IDs: vpce-xxxxxxxx
Private API Gateway这里指的是 REST API Private Endpoint。创建时可以直接关联 execute-api VPC Endpoint。关联后,API Gateway会生成与 API ID和 Endpoint ID相关的调用DNS名称。
CLI示例:
aws apigateway create-rest-api \
--region ap-northeast-1 \
--name partner-private-api \
--endpoint-configuration '{
"types":["PRIVATE"],
"ipAddressType":"dualstack",
"vpcEndpointIds":["vpce-0123456789abcdef0"]
}'
2. 创建资源和方法
例如:
/
└── orders
├── GET
└── POST
或者:
/health
/orders
/orders/{orderId}
配置 Lambda或其他Integration后,部署到:
Stage: prod
3. API Resource Policy
推荐只允许指定 Endpoint:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "execute-api:/*"
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "execute-api:/*",
"Condition": {
"StringNotEquals": {
"aws:SourceVpce": "vpce-0123456789abcdef0"
}
}
}
]
}
这种写法的含义是:
- 原则上允许调用。
- 但只要来源 Endpoint不是指定 Endpoint,就显式拒绝。
AWS提供了基于 aws:SourceVpce 和 aws:SourceVpc 的 Private API资源策略示例。
修改资源策略后,应重新部署 API。
十、第五阶段:证书和 Private Custom Domain
1. 准备 ACM证书
证书必须覆盖:
api.partner.example.com
并且证书必须位于 API Gateway所在区域,例如:
ap-northeast-1
可以使用:
api.partner.example.com
或合适情况下:
*.partner.example.com
Private Custom Domain支持通配符证书,但不支持通配符Custom Domain名称本身;私有域名固定使用 TLS 1.2。
ACM公共证书的重要问题
即使域名只用于内网,申请 ACM公共证书时,ACM仍需要验证域名所有权。
DNS验证记录必须能够被 ACM从公共 DNS找到。仅把 CNAME放在 Route 53 Private Hosted Zone中不能完成 ACM公共证书验证。
因此比较稳妥的做法是:
- 使用公司真实拥有的公共域名子域,例如
api.partner.example.com。 - 在公共 DNS中仅放 ACM验证CNAME。
- 实际 API的 A记录只放在 Private Hosted Zone。
- 公网 DNS不需要发布 API真实地址。
2. 创建 Private Custom Domain
控制台:
API Gateway
→ Custom domain names
→ Add domain name
配置:
Domain name:
api.partner.example.com
Endpoint type:
Private
Routing mode:
API mappings only
ACM Certificate:
覆盖 api.partner.example.com 的证书
创建后,API Gateway最初会给该域名配置拒绝全部访问的策略,需要手动授权指定 VPC Endpoint。
CLI示例:
aws apigateway create-domain-name \
--region ap-northeast-1 \
--domain-name api.partner.example.com \
--certificate-arn arn:aws:acm:ap-northeast-1:111122223333:certificate/xxxxxxxx \
--security-policy TLS_1_2 \
--endpoint-configuration '{"types":["PRIVATE"]}' \
--policy file://domain-policy.json
十一、Private Domain Resource Policy
Private Domain本身也必须允许指定 VPC Endpoint。
domain-policy.json:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "execute-api:/*"
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "execute-api:/*",
"Condition": {
"StringNotEquals": {
"aws:SourceVpce": "vpce-0123456789abcdef0"
}
}
}
]
}
这里有一个非常容易忽略的点:
请求要成功,至少需要同时满足:
Private Domain Policy允许
Private API Policy允许
VPC Endpoint Policy允许
方法级认证允许
AWS明确要求 Private API和Private Custom Domain分别配置资源策略。
十二、第六阶段:创建 API Mapping
例如希望:
https://api.partner.example.com/v1/orders
映射到:
API: partner-private-api
Stage: prod
Base Path: v1
控制台:
API Gateway
→ Custom domain names
→ api.partner.example.com
→ API mappings
→ Configure mappings
设置:
API: partner-private-api
Stage: prod
Path: v1
CLI:
aws apigateway create-base-path-mapping \
--region ap-northeast-1 \
--domain-name api.partner.example.com \
--domain-name-id abcd1234 \
--rest-api-id a1b2c3d4 \
--stage prod \
--base-path v1
Private Custom Domain必须通过 API Mapping或路由规则映射到具体 Private API和Stage。
十三、第七阶段:创建 Domain Name Access Association
这是 Private Custom Domain架构中最容易漏掉的一步。
需要建立:
Private Custom Domain
↕
execute-api VPC Endpoint
控制台:
API Gateway
→ Custom domain names
→ api.partner.example.com
→ Resource sharing
→ Domain name access associations
→ Create
选择:
Domain ARN:
arn:aws:apigateway:ap-northeast-1:111122223333:
/domainnames/api.partner.example.com+domain-id
VPC Endpoint:
vpce-0123456789abcdef0
CLI:
aws apigateway create-domain-name-access-association \
--region ap-northeast-1 \
--domain-name-arn \
arn:aws:apigateway:ap-northeast-1:111122223333:/domainnames/api.partner.example.com+abcd1234 \
--access-association-source vpce-0123456789abcdef0 \
--access-association-source-type VPCE
该关联创建后可能需要大约15分钟进入可用状态,Private Custom Domain本身的创建或证书更新也可能需要一段时间。
十四、第八阶段:配置 VPC Endpoint Policy
Endpoint Policy控制:
建议不要长期保持 Full Access。
例如只允许指定 Domain和API:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": [
"arn:aws:execute-api:ap-northeast-1:111122223333:/domainnames/api.partner.example.com+abcd1234",
"arn:aws:execute-api:ap-northeast-1:111122223333:a1b2c3d4/*"
]
}
]
}
也可以通过 execute-api:viaDomainArn 限制只能经指定 Private Custom Domain访问。AWS给出了按私有域名、API和方法限制 VPC Endpoint Policy的示例。
Authorization Header注意点
Endpoint Policy首先评估请求的 Authorization Header:
- 没有 Authorization:按匿名Principal评估。
- 正确 SigV4:识别为IAM Principal。
- 错误 SigV4:直接拒绝。
- Bearer Token/JWT:对 Endpoint Policy来说通常仍按匿名Principal评估。
因此,如果业务层使用 OAuth/JWT/Lambda Authorizer,不要在 Endpoint Policy里错误地要求某个 IAM User,否则合法JWT请求也可能被 Endpoint Policy挡住。
十五、第九阶段:创建 Private Hosted Zone和Alias记录
1. 创建 Private Hosted Zone
推荐创建:
partner.example.com
并关联包含以下资源的 VPC:
- Resolver Inbound Endpoint。
- execute-api VPC Endpoint。
至少 Private Hosted Zone必须与 Inbound Endpoint所在 VPC关联,Resolver才能使用该 Hosted Zone应答外部查询。
CLI:
aws route53 create-hosted-zone \
--name partner.example.com \
--caller-reference "$(date +%s)" \
--hosted-zone-config Comment="Partner private API",PrivateZone=true \
--vpc VPCRegion=ap-northeast-1,VPCId=vpc-0123456789abcdef0
2. 创建 Alias记录
控制台:
Route 53
→ Hosted zones
→ partner.example.com
→ Create record
配置:
Record name:
api
Record type:
A
Alias:
On
Route traffic to:
Alias to VPC endpoint
Region:
ap-northeast-1
Endpoint:
vpce-0123456789abcdef0
Private API Custom Domain的Route 53 Alias目标应是 execute-api Interface VPC Endpoint,而不是 Lambda、API ID或 Resolver Endpoint。
CLI记录示例:
{
"Changes": [
{
"Action": "UPSERT",
"ResourceRecordSet": {
"Name": "api.partner.example.com",
"Type": "A",
"AliasTarget": {
"DNSName": "vpce-0123456789abcdef0.execute-api.ap-northeast-1.vpce.amazonaws.com",
"HostedZoneId": "VPC_ENDPOINT_HOSTED_ZONE_ID",
"EvaluateTargetHealth": false
}
}
}
]
}
然后:
aws route53 change-resource-record-sets \
--hosted-zone-id Z0123456789ABCDEFG \
--change-batch file://api-alias.json
如果 Endpoint使用IPv6或Dualstack,应根据实际需要增加 AAAA记录。
十六、外部公司最终需要配置什么
外部公司通常只需要获得以下信息。
网络信息
AWS目标网段:
10.20.0.0/16
协议:
DNS UDP/TCP 53
HTTPS TCP 443
DNS信息
转发域:
partner.example.com
DNS目标:
10.20.10.10
10.20.20.10
API信息
Base URL:
https://api.partner.example.com/v1
健康检查:
GET /health
业务API:
GET /orders
POST /orders
认证信息
取决于设计,例如:
- OAuth2/JWT。
- API Gateway Lambda Authorizer。
- AWS IAM SigV4。
- HMAC签名。
- Cognito Token。
- 业务用户名/密码,不推荐单独使用。
- API Key,仅适合计量和Usage Plan,不应当作唯一安全认证。
Private API目前不支持API Gateway的 mutual TLS功能,因此B2B双向证书认证不能直接按公网 Regional API的 mTLS方式配置。可以改用IAM SigV4、JWT/Lambda Authorizer、应用层证书校验,或重新设计前置代理层。
十七、完整的安全控制层
推荐把控制分成六层。
第一层:Direct Connect路由
只发布必要网段:
外部公司 → AWS:
10.20.0.0/16
AWS → 外部公司:
172.20.10.0/24
尽量不要互相发布整个企业网段。
第二层:Resolver Endpoint安全组
只允许外部公司的正式 DNS服务器:
UDP/TCP 53
172.20.1.10/32
172.20.1.11/32
不要允许全部客户端直接查询 Resolver。
第三层:execute-api Endpoint安全组
只允许业务系统来源网段:
TCP 443
172.20.10.0/24
第四层:VPC Endpoint Policy
只允许:
指定Private Domain
指定API
指定方法或Stage
第五层:Domain和API Resource Policy
同时通过:
aws:SourceVpce
限制指定 Endpoint。
需要进一步限制外部原始IP时,Private API资源策略可以使用:
aws:VpcSourceIp
因为 VPC Endpoint可能会重写网络层源IP,而 aws:VpcSourceIp 用于判断原始请求源地址。
第六层:方法级和业务级认证
例如:
OAuth2 Access Token
JWT Claims
Partner ID
Scope
订单权限
调用频率
业务审计
网络可达不等于业务有权访问。
十八、DNS设计中的关键注意点
1. Split-Horizon DNS
假设外部公司内部已经管理:
example.com
AWS又创建:
Private Hosted Zone: example.com
那么可能产生分裂DNS和权威冲突。
更推荐划分专用子域:
aws-api.example.com
partner-api.example.com
private.example.com
然后只条件转发这个子域。
2. Private Hosted Zone关联错误
如果:
Resolver Endpoint在 VPC-A
Private Hosted Zone只关联 VPC-B
Inbound Endpoint可能无法按预期解析该 Hosted Zone。
最简单的做法是:
Private Hosted Zone
同时关联 Resolver Endpoint所在 VPC
以及 execute-api Endpoint所在 VPC
如果二者就在同一 VPC,则更简单。
3. 不要把 Resolver IP写进业务A记录
错误:
api.partner.example.com
A → 10.20.10.10
10.20.10.10 是 DNS服务器,不是 API服务器。
正确:
api.partner.example.com
A Alias → execute-api VPC Endpoint
4. TTL和缓存
Private Hosted Zone记录变更后,外部公司 DNS和客户端可能继续使用缓存。
测试时可以:
dig api.partner.example.com
观察 TTL,并清理:
- Windows DNS缓存。
- Linux
systemd-resolved缓存。 - Java JVM DNS缓存。
- 企业DNS缓存。
十九、高可用设计
Direct Connect
生产环境至少考虑:
DX Connection A
DX Connection B
不同设备
最好不同DX Location
并准备:
Site-to-Site VPN Backup
使用BGP属性控制主备。
Resolver Inbound Endpoint
至少两个 AZ:
10.20.10.10
10.20.20.10
外部DNS同时配置两个 Forwarder。
每个 Resolver Endpoint IP可处理大量查询;AWS当前文档说明单IP在条件适合时可处理最高约10,000 UDP DNS QPS,但实际容量受查询大小、协议、响应延迟和安全组连接跟踪影响。
Interface VPC Endpoint
至少两个 AZ:
Endpoint ENI A
Endpoint ENI C
Route 53 Alias会返回相应Endpoint地址。
AWS也明确建议 Private Custom Domain使用至少两个可用区的 VPC Endpoint。
API Gateway
API Gateway自身为区域托管服务,不需要自行部署EC2式的主备实例,但后端仍需单独考虑:
- Lambda并发。
- VPC Link。
- ALB/NLB多AZ。
- 数据库多AZ。
- 跨区容灾。
二十、监控和日志
建议至少启用以下项目。
Direct Connect
监控:
ConnectionState
VirtualInterfaceBpsIngress
VirtualInterfaceBpsEgress
VirtualInterfacePpsIngress
VirtualInterfacePpsEgress
BGP状态
并执行 BGP Failover Test,确认备用链路真正可接管。AWS Resiliency Toolkit支持通过暂时关闭BGP会话验证冗余路由。
Route 53 Resolver
启用:
Resolver Query Logging
CloudWatch Resolver Endpoint Metrics
查询日志可以帮助确认:
- 是否收到域名查询。
- 查询来自哪个 VPC。
- 查询类型。
- 返回结果。
要注意 Resolver缓存命中的重复查询通常不会作为每次独立查询都出现在Query Log中。
VPC
启用:
VPC Flow Logs
重点查看:
- Resolver Endpoint ENI。
- execute-api Endpoint ENI。
- TGW相关流量。
- ACCEPT/REJECT。
- 源IP、目标IP、端口。
API Gateway
启用:
Access Logs
Execution Logs
Detailed Metrics
AWS X-Ray,按需
推荐访问日志至少包含:
$requestId
$context.identity.sourceIp
$context.domainName
$context.httpMethod
$context.resourcePath
$context.status
$context.responseLength
$context.integrationErrorMessage
二十一、标准测试顺序
不要一开始只运行 curl,应按层测试。
第一步:检查 BGP和路由
外部路由器确认已经学习:
10.20.0.0/16
AWS侧确认已经学习:
172.20.0.0/16
第二步:直接测试 Resolver Endpoint
dig @10.20.10.10 api.partner.example.com A
dig @10.20.20.10 api.partner.example.com A
第三步:通过外部公司正式DNS测试
dig api.partner.example.com A
应返回 Endpoint私有IP。
第四步:测试 TCP 443
nc -vz api.partner.example.com 443
或者:
telnet api.partner.example.com 443
第五步:检查TLS证书
openssl s_client \
-connect api.partner.example.com:443 \
-servername api.partner.example.com
检查:
Subject Alternative Name
Issuer
Validity
TLS version
Certificate chain
第六步:调用健康检查
curl -v https://api.partner.example.com/v1/health
第七步:带认证调用
JWT示例:
curl -v \
-H "Authorization: Bearer ${TOKEN}" \
https://api.partner.example.com/v1/orders
SigV4场景可以使用支持签名的SDK、AWS CLI或相应签名库。
二十二、常见故障与判断方法
1. DNS请求超时
表现:
dig 超时
优先检查:
外部DNS到Resolver IP的路由
TGW路由
VPC子网路由
Resolver SG UDP/TCP 53
外部防火墙
NACL
2. DNS返回 NXDOMAIN
说明网络和DNS服务器可能已经通了,但记录层有问题。
检查:
Private Hosted Zone名字
A Alias记录
Hosted Zone与VPC关联
查询的FQDN是否正确
是否存在更具体的冲突Hosted Zone
3. 域名能解析,但TCP 443超时
检查:
execute-api Endpoint SG
外部到Endpoint ENI的路由
NACL
TGW回程路由
外部防火墙
4. TLS证书名称不匹配
例如证书是:
*.example.com
但域名是:
api.partner.example.com
*.example.com 只覆盖一层:
api.example.com
通常不覆盖:
api.partner.example.com
应使用:
*.partner.example.com
或精确证书:
api.partner.example.com
5. 返回403 Forbidden
检查顺序:
Domain Name Access Association是否AVAILABLE
Domain Resource Policy
API Resource Policy
VPC Endpoint Policy
方法Authorization
JWT/IAM签名
API Key/Usage Plan
6. 返回 Missing Authentication Token
常见原因:
Base Path错误
Stage映射错误
HTTP方法错误
资源路径不存在
API未重新部署
例如实际Mapping:
/v1 → prod
正确:
https://api.partner.example.com/v1/orders
错误:
https://api.partner.example.com/prod/orders
7. 默认 execute-api URL能访问,但Custom Domain不能
重点检查:
ACM证书
Private Domain状态
Domain Resource Policy
Domain Access Association
API Mapping
Route 53 Alias
Host/SNI
8. VPC内能访问,外部公司不能访问
通常说明:
API Gateway配置基本正确
问题集中在DX路由、Endpoint SG或外部DNS
9. 小请求正常,大请求失败
检查:
MTU
PMTUD
ICMP Fragmentation Needed
中间防火墙
Jumbo Frame
二十三、最容易被遗漏的十个地方
- Direct Connect不是自动加密的。
- DNS和HTTPS是两条不同路径。
- Resolver Endpoint必须同时开放UDP和TCP 53。
- Private Hosted Zone必须关联Resolver所在VPC。
- Alias目标是execute-api VPC Endpoint,不是Resolver。
- execute-api Endpoint安全组必须允许外部公司来源网段TCP 443。
- Private Domain Policy和Private API Policy是两份策略。
- 必须创建Domain Name Access Association。
- 修改API的Endpoint关联或资源后需要重新部署。
- ACM公共证书的DNS验证记录必须能从公共DNS查询到,不能只放私有Hosted Zone。
二十四、推荐的最终生产配置
正式 B2B 系统推荐采用以下配置:
两条Direct Connect
+ VPN备用链路
Transit VIF
+ Direct Connect Gateway
+ Transit Gateway
独立Shared Services VPC
两个AZ的Resolver Inbound Endpoint
+ 只允许正式DNS服务器UDP/TCP 53
两个AZ的execute-api Interface Endpoint
+ 只允许外部业务网段TCP 443
专用私有子域
api.partner.example.com
Private Custom Domain
+ ACM证书
+ Domain Access Association
Private Domain Policy
+ API Resource Policy
+ Endpoint Policy
全部限制aws:SourceVpce
JWT或IAM SigV4认证
+ API Gateway Access Logs
+ Resolver Query Logs
+ VPC Flow Logs
+ DX CloudWatch告警
最终链路可以概括为:
DNS:
外部DNS
→ Direct Connect
→ Resolver Inbound Endpoint
→ Private Hosted Zone
→ 返回VPC Endpoint私有IP
HTTPS:
外部业务系统
→ Direct Connect
→ execute-api Interface Endpoint
→ Private Custom Domain
→ API Mapping
→ Private REST API
→ 后端服务