使用 terraform 为每个可用区创建多个子网



我是地球形态的新手。我想使用 terraform 在 AWS 中的特定区域中为每个可用区创建一个公有子网和三个私有子网。我可以通过引用以下链接 https://medium.com/@maneetkum/create-subnet-per-availability-zone-in-aws-through-terraform-ea81d1ec1883 为每个可用区创建一个私有和公有子网。但是,我需要将创建的一个私人子拆分为另一个 2。这在地形中可能吗?

data "aws_availability_zones" "available" {}resource "aws_vpc" "myVpc" {
cidr_block           = "10.20.0.0/16"
enable_dns_hostnames = true
tags {
Name = "myVpc"
}
}
resource "aws_subnet" "public_subnet" {
count = "${length(data.aws_availability_zones.available.names)}"
vpc_id = "${aws_vpc.myVpc.id}"
cidr_block = "10.20.${10+count.index}.0/24"
availability_zone = "${data.aws_availability_zones.available.names[count.index]}"
map_public_ip_on_launch = true
tags {
Name = "PublicSubnet"
}
}
resource "aws_subnet" "private_subnet" {
count = "${length(data.aws_availability_zones.available.names)}"
vpc_id = "${aws_vpc.myVpc.id}"
cidr_block = "10.20.${20+count.index}.0/24"
availability_zone= "${data.aws_availability_zones.available.names[count.index]}"
map_public_ip_on_launch = false
tags {
Name = "PrivateSubnet"
}
}

上述代码用于为每个可用区创建一个私有子网和公有子网。

可以创建多个子网,并自动将它们放入可用区,而无需复制代码。 让我们保持干燥。 为避免重复代码,请使用 Terraform 元参数和内置函数的魔力。 具体来说,使用">计数"和">cidrsubnet"。 ">计数"将生成任意数量的子网副本。

如果要为每个子网提供唯一值(如子网的标签Name),则可以为每个子网指定一个唯一的助记符名称,方法是使用要分配给每个子网的名称创建数据字典。然后在创建子网时使用">count.index"分配它们。 如果工作量太大,您也可以在名称中嵌入count.index

不同区域具有不同数量的可用区。 为确保将子网分配给实际退出的可用区,您应动态生成可用区列表。 这样,您就知道列表中的所有可用区实际上在您正在使用的区域中可用。

如果子网较多,而该区域具有可用区,会发生什么情况? 使用模算术来包装您的工作索引。 与其直接使用 index.count,不如使用列表的长度对 index.count 进行取模。这将环绕索引,因此您的工作索引永远不会超出可用区列表的长度。

但是,真正的魔力是">cidrsubnet"命令。 下面的示例将采用传递的基本 CIDR 块的大小(恰好是/16),添加第二个参数 (4),并生成/20 CIDR 块。 第三个参数通过可用的 CIDR 块进行索引,从而确保每个子网获得不同的子 CIDR 块。

注意:相关的 cidrsubnets 命令有很大的不同。因此,请小心,不要混淆这两个功能。

resource "aws_subnet" "area_subnets" {
count                   = 4 # creates four subnets
vpc_id                  = var.area_vpc_id
map_public_ip_on_launch = var.map_public_ip_on_launch
cidr_block           = cidrsubnet(var.area_subnet_cidr, 4, count.index)
availability_zone_id = data.aws_availability_zones.available.zone_ids[count.index % length(data.aws_availability_zones.available.zone_ids)]
tags = tomap({ "Name" = "${var.subnet_names[count.index]}" })
}
variable "subnet_names" {
type = list(string)
default = [
"Primary NAT Gateway Subnet",
"Secondary NAT Gateway Subnet",
"Channel A Subnet",
"Channel B Subnet"
]
}
variable "map_public_ip_on_launch" {
type    = bool
default = true
}
variable "area_vpc_id"
documentation = "The Terraform ID of the containing VPC"
type = string
default = "vpc-abcdefghijklmno"
}
variable "area_subnet_cidr"
documentation = "The base CIDR that you are working with"
type = string
default = "10.0.0.0/16"
}
data "aws_availability_zones" "available" {
state = "available"
filter { # Only fetch Availability Zones (no Local Zones)
name   = "opt-in-status"
values = ["opt-in-not-required"]
}
}

您只需复制private_subnet资源元素即可在每个可用区中创建两个新子网:

...
resource "aws_subnet" "private_subnet" {
count = "${length(data.aws_availability_zones.available.names)}"
vpc_id = "${aws_vpc.myVpc.id}"
cidr_block = "10.20.${20+count.index}.0/24"
availability_zone= "${data.aws_availability_zones.available.names[count.index]}"
map_public_ip_on_launch = false
tags {
Name = "PrivateSubnet"
}
}
resource "aws_subnet" "private_subnet_2" {
count = "${length(data.aws_availability_zones.available.names)}"
vpc_id = "${aws_vpc.myVpc.id}"
cidr_block = "10.30.${20+count.index}.0/24"
availability_zone= "${data.aws_availability_zones.available.names[count.index]}"
map_public_ip_on_launch = false
tags {
Name = "PrivateSubnet2"
}
}

您需要修改每个子网的 CIDR 块,以确保它们不会相互重叠。

最新更新