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
}
运行与验证
- 初始化:
terraform init - 预览变更:
terraform plan - 应用配置:
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与子网一一对应,确保两个子网都通过同一互联网网关出网。