3. 配置AWS VPC网络

任务目标

使用 Terraform 在 AWS 上创建一个具备公网访问能力的 VPC 网络架构,包含:1个 VPC、2个公有子网、1个互联网网关及关联的路由表。通过该配置,子网内的资源可以访问互联网。

环境依赖

  • Terraform ≥ 1.0
  • AWS Provider ≥ 4.0
  • AWS 账号凭证(环境变量 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY,或已配置的默认凭证链)

完整实现

创建 main.tf 文件,内容如下:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
  required_version = ">= 1.0"
}

provider "aws" {
  region = "us-east-1"
}

# VPC
resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "demo-vpc"
  }
}

# 互联网网关
resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.main.id

  tags = {
    Name = "demo-igw"
  }
}

# 两个公有子网(分布在不同可用区)
resource "aws_subnet" "public" {
  count                   = 2
  vpc_id                  = aws_vpc.main.id
  cidr_block              = cidrsubnet(aws_vpc.main.cidr_block, 8, count.index)
  availability_zone       = data.aws_availability_zones.available.names[count.index]
  map_public_ip_on_launch = true

  tags = {
    Name = "demo-public-${count.index + 1}"
  }
}

# 路由表
resource "aws_route_table" "public" {
  vpc_id = aws_vpc.main.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.igw.id
  }

  tags = {
    Name = "demo-public-rt"
  }
}

# 路由表关联到子网
resource "aws_route_table_association" "public" {
  count          = 2
  subnet_id      = aws_subnet.public[count.index].id
  route_table_id = aws_route_table.public.id
}

# 获取当前区域可用区列表
data "aws_availability_zones" "available" {
  state = "available"
}

# 输出
output "vpc_id" {
  value = aws_vpc.main.id
}

output "subnet_ids" {
  value = aws_subnet.public[*].id
}

output "internet_gateway_id" {
  value = aws_internet_gateway.igw.id
}

运行与验证

  1. 初始化:terraform init
  2. 预览变更:terraform plan
  3. 应用配置:terraform apply -auto-approve

验证方法:

  • 命令执行成功后,观察输出中的 vpc_id、subnet_ids(2个)和 internet_gateway_id 均有值。
  • 在 AWS 控制台 VPC 服务中确认:VPC 状态为 available,两个子网均显示“公有”且已关联到同一路由表,路由表中存在指向 igw-id 的 0.0.0.0/0 路由。
  • 可选连通性测试:在任一公有子网中启动一个测试实例(使用默认安全组并放行 SSH),若能通过公网 IP 连接,则证明互联网网关和路由配置生效。

清理资源:terraform destroy -auto-approve

关键说明

  • cidrsubnet 函数将 VPC 的 /16 网段划分为两个 /24 子网(10.0.0.0/24 和 10.0.1.0/24)。
  • map_public_ip_on_launch = true 确保子网内启动的实例自动获得公网 IP,这是公网访问的必要条件。
  • 路由表关联使用 count = 2 与子网一一对应,确保两个子网都通过同一互联网网关出网。