外部公司本地网络通过 AWS Direct Connect 访问 Private API Gateway:完整配置指南

整体架构 | DNS 与 HTTPS 链路 | Direct Connect | Route 53 Resolver | Private API Gateway | 安全与排障

这里要特别注意:这不是一条所有流量依次穿过的“串行代理链”。

它实际上分成两条独立流程:

  1. DNS解析路径:负责把私有域名解析成 VPC Endpoint 的私有 IP。
  2. 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:SourceVpceaws: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-api URL时,可能被解析到 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"
        }
      }
    }
  ]
}
                

这种写法的含义是:

  1. 原则上允许调用。
  2. 但只要来源 Endpoint不是指定 Endpoint,就显式拒绝。

AWS提供了基于 aws:SourceVpceaws: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
                

二十三、最容易被遗漏的十个地方

  1. Direct Connect不是自动加密的。
  2. DNS和HTTPS是两条不同路径。
  3. Resolver Endpoint必须同时开放UDP和TCP 53。
  4. Private Hosted Zone必须关联Resolver所在VPC。
  5. Alias目标是execute-api VPC Endpoint,不是Resolver。
  6. execute-api Endpoint安全组必须允许外部公司来源网段TCP 443。
  7. Private Domain Policy和Private API Policy是两份策略。
  8. 必须创建Domain Name Access Association。
  9. 修改API的Endpoint关联或资源后需要重新部署。
  10. 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
→ 后端服务