「AWS 网络进阶」

深入 AWS 网络编排:VPC Peering 与 Transit Gateway 选型、跨区域与全球加速、多账户网络隔离、安全组与 NACL 治理,以及 Route 53 解析与排障。

1. VPC Peering 与 Transit Gateway 选型

一句话总结: VPC Peering 适合「少量、同区域、无环」的连接,Transit Gateway 适合「多 VPC、跨区域、需集中路由」的中心辐射型拓扑,选型看规模与演进方向。

单 VPC 是最简单的起点,但一旦出现「VPC A 要连 VPC B、VPC C」,两两 Peering 的路由表会爆炸。先看两种方案的适用边界。

维度VPC PeeringTransit 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 三条线治理清楚,网络层就能稳定支撑业务扩张。

延伸阅读

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「terraform」更多文章

  1. Helm Provider 与应用发布:值注入与回滚
  2. 模块注册表与分发:版本、文档与测试
  3. DNS 与证书编排:托管区域与自动验证