You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Terraform单模块创建N个AWS VPC及每个VPC下M个子网?

解决方案

你的核心问题是同一Terraform资源块不能同时使用count和for_each,要实现N个VPC各带M个子网,可通过setproduct函数生成VPC与子网的组合关系,用for_each遍历这个组合来创建子网。

步骤1:定义变量

先明确所需变量(对应你提到的N_vpc、M_subnet_per_vpc等):

variable "vpc_count" {
  type        = number
  description = "要创建的VPC数量(N_vpc)"
  default     = 2
}

variable "subnet_per_vpc" {
  type        = number
  description = "每个VPC下的子网数量(M_subnet_per_vpc)"
  default     = 3
}

variable "region" {
  type        = string
  description = "AWS区域"
  default     = "us-east-1"
}

variable "aws_profile" {
  type        = string
  description = "AWS配置文件名称"
  default     = "default"
}

# 基础CIDR,用于生成每个VPC的唯一CIDR
variable "base_vpc_cidr" {
  type        = string
  description = "基础VPC CIDR块,将以此为模板生成每个VPC的CIDR"
  default     = "10.0.0.0/16"
}

步骤2:创建VPC资源

用count创建N个VPC,同时通过cidrsubnet生成每个VPC的唯一CIDR,避免地址冲突:

resource "aws_vpc" "customer_vpc" {
  count      = var.vpc_count
  cidr_block = cidrsubnet(var.base_vpc_cidr, 4, count.index) # 每个VPC占用/20段
  tags = {
    Name = "vpc-${count.index}"
  }
}

步骤3:创建子网资源

利用setproduct函数将VPC列表与子网索引列表组合,生成{VPC ID, 子网序号}的键值对,再用for_each遍历这个组合:

# 生成子网索引列表(0到M-1)
locals {
  subnet_indices = range(var.subnet_per_vpc)
  # 组合VPC和子网索引,得到每个子网的唯一标识
  vpc_subnet_pairs = setproduct(aws_vpc.customer_vpc[*].id, local.subnet_indices)
}

resource "aws_subnet" "customer_subnet" {
  # 用for_each遍历组合,每个子网对应唯一的VPC+序号
  for_each = { for pair in local.vpc_subnet_pairs : "${pair[0]}-${pair[1]}" => pair }

  vpc_id            = each.value[0]
  # 基于对应VPC的CIDR生成子网CIDR
  cidr_block        = cidrsubnet(aws_vpc.customer_vpc[each.value[0]].cidr_block, 4, each.value[1])
  availability_zone = element(data.aws_availability_zones.available.names, each.value[1]) # 自动分配可用区

  tags = {
    Name = "subnet-${split("-", each.value[0])[2]}-${each.value[1]}" # 标签格式:subnet-VPC序号-子网序号
  }
}

# 数据资源:获取当前区域的可用区列表
data "aws_availability_zones" "available" {
  state = "available"
}

关键说明

  • setproduct(var.list1, var.list2)会生成两个列表的笛卡尔积,比如2个VPC+3个子网索引,会生成6组组合,对应6个子网。
  • 每个子网的CIDR通过cidrsubnet从所属VPC的CIDR中划分,避免地址冲突。
  • 可用区通过element函数循环分配,确保子网分布在不同可用区(如果可用区数量足够)。

补充:AWS Provider配置

配置AWS Provider,指定区域和配置文件:

provider "aws" {
  region  = var.region
  profile = var.aws_profile
}

内容的提问来源于stack exchange,提问作者Karthik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:22:50