1. VPC Peering 与 Transit Gateway 选型
一句话总结: VPC Peering 适合「少量、同区域、无环」的连接,Transit Gateway 适合「多 VPC、跨区域、需集中路由」的中心辐射型拓扑,选型看规模与演进方向。
单 VPC 是最简单的起点,但一旦出现「VPC A 要连 VPC B、VPC C」,两两 Peering 的路由表会爆炸。先看两种方案的适用边界。
| 维度 | VPC Peering | Transit Gateway |
|---|---|---|
| 连接模式 | 两两直连 | 中心辐射 |
| 跨区域 | 支持但需手动加路由 | 原生支持 |
| 路由管理 | 每对 VPC 各加一条 | 集中在一张路由表 |
| 费用 | 低 | 按处理量计费 |
| 环路风险 | 多对时易混乱 | 辐射拓扑天然无环 |
resource "aws_vpc_peering_connection" "app_to_shared" {
vpc_id = aws_vpc.app.id
peer_vpc_id = aws_vpc.shared.id
auto_accept = true
}
resource "aws_route" "app_to_shared" {
route_table_id = aws_route_table.app_private.id
destination_cidr_block = "10.0.0.0/16"
vpc_peering_connection_id = aws_vpc_peering_connection.app_to_shared.id
}
1.1 何时直接上 TGW
当 VPC 超过三个、或明确要做跨区域打通时,直接上 Transit Gateway,避免后期把成对的 Peering 迁移成 TGW。
resource "aws_ec2_transit_gateway" "main" {
description = "中心网络网关"
}
resource "aws_ec2_transit_gateway_vpc_attachment" "app" {
subnet_ids = [aws_subnet.app_private_a.id, aws_subnet.app_private_b.id]
transit_gateway_id = aws_ec2_transit_gateway.main.id
vpc_id = aws_vpc.app.id
}
一句话:两三个 VPC 用 Peering,五个以上、要跨区域就用 TGW;先规划拓扑再下手,避免后期返工。
2. Transit Gateway 与多 VPC 互联
一句话总结: TGW 把多 VPC 通过 attachment 挂到中心,用路由表与传播控制可达性,再结合 Network Manager 做全局视图。
TGW 的核心是「中心路由器」:每个 VPC 建一个 attachment,路由表决定流量怎么走。默认每个 attachment 会把路由传播到 TGW 路由表。
resource "aws_ec2_transit_gateway_route_table" "main" {
transit_gateway_id = aws_ec2_transit_gateway.main.id
}
resource "aws_ec2_transit_gateway_route_table_association" "app" {
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.app.id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.main.id
}
resource "aws_ec2_transit_gateway_route_table_propagation" "app" {
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.app.id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.main.id
}
2.1 分段隔离
安全要求高的场景,把 VPC 分组:业务组、共享组各用一张 TGW 路由表,组间不传播,流量默认隔离。
resource "aws_ec2_transit_gateway_route_table" "shared" {
transit_gateway_id = aws_ec2_transit_gateway.main.id
}
resource "aws_ec2_transit_gateway_route_table_association" "shared" {
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.shared.id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.shared.id
}
一句话:TGW 的隔离边界是「路由表 + 传播」,不是 attachment 本身;几张路由表就把网络切成分区。
3. 跨区域与全球加速
一句话总结: 跨区域打通用 TGW 跨区域 attachment 或 VPC Peering 跨区域,全球加速用 Global Accelerator 把流量调度到就近区域,配合 Route 53 做域名解析。
跨区域连接常用于灾备与全球业务。TGW 支持跨区域 attachment,路由条目由 AWS 自动管理,比跨区域 Peering 更省心。
resource "aws_ec2_transit_gateway_peering_attachment" "cn_to_us" {
peer_region = "us-west-2"
transit_gateway_id = aws_ec2_transit_gateway.main.id
peer_transit_gateway_id = aws_ec2_transit_gateway.us_west.id
}
resource "aws_ec2_transit_gateway_route" "us_to_cn" {
destination_cidr_block = "10.0.0.0/16"
transit_gateway_attachment_id = aws_ec2_transit_gateway_peering_attachment.cn_to_us.id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.us_west.id
}
3.1 Global Accelerator 接入
Global Accelerator 提供两个稳定 Anycast IP,把流量调度到就近的终端节点组,适合 HTTP/HTTPS 与 TCP/UDP 全球接入。
resource "aws_globalaccelerator_accelerator" "main" {
name = "ga-main"
ip_address_type = "IPV4"
enabled = true
}
resource "aws_globalaccelerator_listener" "main" {
accelerator_arn = aws_globalaccelerator_accelerator.main.id
port_range {
from_port = 443
to_port = 443
}
protocol = "TCP"
}
resource "aws_globalaccelerator_endpoint_group" "main" {
listener_arn = aws_globalaccelerator_listener.main.id
endpoint_group_region = "ap-northeast-1"
endpoint_configuration {
endpoint_id = aws_lb.web.arn
weight = 120
}
}
一句话:跨区域是「链路」,全球加速是「入口」,链路解决通不通,入口解决快不快。
4. VPN 与 Direct Connect 混合云
一句话总结: 混合云接入有 VPN 与 Direct Connect 两条路,VPN 走公网加密适合小流量,DX 走专线适合核心业务,两者可并存做冗余。
混合云把本地数据中心与云 VPC 打通。VPN 用 aws_vpn_connection 与客户网关,DX 用 aws_dx_* 系列资源。
resource "aws_customer_gateway" "onprem" {
bgp_asn = 65000
ip_address = var.onprem_public_ip
type = "ipsec.1"
}
resource "aws_vpn_connection" "main" {
customer_gateway_id = aws_customer_gateway.onprem.id
transit_gateway_id = aws_ec2_transit_gateway.main.id
type = "ipsec.1"
enable_acceleration = true
}
4.1 路由传播与故障切换
把 VPN 路由传播进 TGW,本地网段即可经 TGW 路由到云内 VPC;多条链路用 BGP 权重控制主备。
resource "aws_ec2_transit_gateway_route_table_propagation" "vpn" {
transit_gateway_attachment_id = aws_vpn_connection.main.transit_gateway_attachment_id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.main.id
}
一句话:VPN 是「低成本的公网隧道」,DX 是「高可用的专线」,先 VPN 后 DX、双链路冗余是常见演进路径。
5. 多账户网络隔离与共享 VPC
一句话总结: 多账户网络用「Network Account + VPC Peering/TGW」或「共享 VPC + 子网委派」两种模型,前者集中管理网关,后者让业务账户直接消费子网。
多账户架构中网络往往集中在一个 Network Account,其他账户通过 Peering/TGW 接入,或用资源共享(RAM)共享 VPC 子网。
resource "aws_ram_resource_share" "vpc_share" {
name = "shared-vpc"
}
resource "aws_ram_resource_association" "subnet" {
resource_share_arn = aws_ram_resource_share.vpc_share.id
resource_arn = aws_subnet.shared_private.arn
}
resource "aws_ram_principal_association" "consumer" {
resource_share_arn = aws_ram_resource_share.vpc_share.id
principal = var.consumer_account_id
}
5.1 消费方使用共享子网
业务账户通过 aws_subnet data source 读取共享子网,直接在其中创建资源,网络出口由 Network Account 统一管控。
data "aws_subnet" "shared" {
provider = aws.consumer
id = data.aws_ssm_parameter.shared_subnet_id.value
}
resource "aws_instance" "app" {
provider = aws.consumer
subnet_id = data.aws_subnet.shared.id
instance_type = "t3.micro"
}
一句话:共享 VPC 把「网络治理」与「业务资源」解耦,安全组与路由由 Network Account 统一管,业务账户只管应用。
6. 安全组与 NACL 治理
一句话总结: 安全组是实例级有状态防火墙,NACL 是子网级无状态防火墙,治理重点是「统一命名、集中维护、审计放行规则」。
安全组治理的高频坑是「规则越堆越多、没人删」。用模块或命名规范统一管理,并用 IaC 保证规则可审查。
resource "aws_security_group" "app" {
name = "sg-app-${var.environment}"
description = "应用安全组,只放行来自 ALB"
vpc_id = aws_vpc.main.id
ingress {
from_port = 8080
to_port = 8080
protocol = "tcp"
security_groups = [aws_security_group.alb.id]
}
}
resource "aws_default_security_group" "default" {
vpc_id = aws_vpc.main.id
}
resource "aws_network_acl" "main" {
vpc_id = aws_vpc.main.id
egress {
protocol = "tcp"
rule_no = 100
action = "allow"
cidr_block = "0.0.0.0/0"
from_port = 0
to_port = 65535
}
ingress {
protocol = "tcp"
rule_no = 100
action = "allow"
cidr_block = "0.0.0.0/0"
from_port = 80
to_port = 443
}
}
6.1 治理清单
| 检查项 | 做法 |
|---|---|
| 命名 | sg-<用途>-<环境>,一目了然 |
| 引用 | 用安全组 ID 引用而非裸 IP |
| 审计 | 定期导出规则做最小权限复查 |
| 默认组 | 关掉 default SG 的全部入站 |
| 层级 | 公网在 ALB 层终结,后端只认 SG |
一句话:安全组与 NACL 的治理不是「写几条规则」,而是「建立可审查、可收敛的规则生命周期」。
7. Route 53 解析与排障
一句话总结: Route 53 用托管区(hosted zone)承接域名,记录类型分 A/AAAA/CNAME/别名,别名指向 AWS 资源可避免 TTL 外迁问题。
DNS 是网络的「最后一公里」。内网解析用私有托管区,对外域名用公有托管区,别名记录直接映射到 LB/CloudFront。
resource "aws_route53_zone" "internal" {
name = "internal.example.com"
vpc {
vpc_id = aws_vpc.main.id
}
}
resource "aws_route53_record" "app" {
zone_id = aws_route53_zone.internal.zone_id
name = "app.internal.example.com"
type = "A"
alias {
name = aws_lb.app.dns_name
zone_id = aws_lb.app.zone_id
evaluate_target_health = true
}
}
7.1 常见排障工作流
dig @127.0.0.53 app.internal.example.com # 本地 DNS 查询
nslookup app.internal.example.com 172.31.0.2 # 指定 VPC 解析器
terraform plan -refresh-only # 检查 DNS 漂移
aws route53 list-resource-record-sets \
--hosted-zone-id Z123456 --query "ResourceRecordSets"
一句话:DNS 排障先确认「解析到哪台、TTL 多久、别名是否健康」,再用 refresh-only 看 IaC 与实况的差异。
8. 总结
AWS 网络进阶的核心是把「连接、隔离、加速、治理」四类能力组合起来:
| 环节 | 要点 |
|---|---|
| 连接 | Peering 少量直连,TGW 中心辐射 |
| 隔离 | TGW 路由表分组、共享 VPC 子网委派 |
| 加速 | Global Accelerator 就近调度 |
| 混合云 | VPN 公网隧道 + DX 专线冗余 |
| 治理 | 安全组引用、NACL 层级、规则审计 |
| 解析 | Route 53 别名指向、私有托管区 |
| 排障 | dig/plan refresh-only 双工具链 |
一句话收尾:AWS 网络进阶的难点不是「建多少资源」,而是「拓扑如何演进、隔离边界如何守」。先画拓扑图,再决定 Peering 还是 TGW,把路由表、安全组、DNS 三条线治理清楚,网络层就能稳定支撑业务扩张。
延伸阅读
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。