使用 Terraform 在 AWS 上跨多个 VPC 创建多个子网
Create multiple subnets across a number of VPCs on AWS using Terraform
我想创建一个创建多个 VPC 的 terraform 脚本。然后,我希望我的脚本在所有 VPC 中创建 'n' 个子网。我想在一个子网资源块中执行此操作。我可以使用资源块内的计数创建 VPC,但无法将其用于子网。请帮忙。
直接在 Terraform 中没有针对您的要求的此类规定,但我们可以调整计数以满足您的要求。
首先,创建一个资源块,创建一定数量的 VPC。
resource "aws_vpc" "main" {
count = "${var.vpc_count}"
cidr_block = "${element(var.cidr_prefix, count.index)}.0.0/16"
enable_dns_support = "true"
enable_dns_hostnames = "true"
tags {
Name = "${var.vpc_name}${count.index}"
}
}
您也可以通过 variables.tf 文件或 .tfvars 文件传递值来对计数使用插值法。
现在使用此脚本在所有 VPC 中创建 "count" 个子网,并在所有可用性区域中均匀分布。
resource "aws_subnet" "private_subnet" {
count = "${var.subnet_count * var.vpc_count}"
vpc_id = "${element(aws_vpc.main.*.id, count.index % var.vpc_count)}"
cidr_block = "${element(var.cidr_prefix, count.index)}.${count.index}.0/24"
availability_zone = "${element(data.aws_availability_zones.all.names, count.index)}"
tags {
Name = "${var.vpc_name}-${element(var.availability_zone, count.index)}-${count.index}"
}
}
您可以单独定义VPC网段为列表,子网网段为列表。虽然我已经使用了 CIDR 前缀并使用 count 来为子网配置 CIDR 块的值。
查看变量 cidr_prefix。
variable "cidr_prefix"{
type = "list"
description = "The first 16 bits of the desired cidr block/s. Note: The number of elements in the list should not be less than the specified count of VPCs."
default = ["172.16", "10.0", "143.14", "100.10"]
}
@Shiv - 这是一个很好的解决方案,我也可以使用变量列表来实现。
如果您想进一步创建路由 table 关联到仅创建的特定子网,挑战就来了。
想象一个设计:
- 创建了 3 个 vpc(mgmt-vpc、shared-vpc 和 dedicated-vpc)
- 每个 vpc 中有 2 个 AZ(az-1a 和 az-1b)
- 每个可用区有 2 个子网(pub-sub-az-1a 和 pvt-sub-az-1a)[总共 12 个子网 -- 6 个 pub 和 6 个 pvt]
- 2 条路线 tables (mgmt-vpc-pub-rt & mgmt-vpc-pvt-rt)
不是这样 'NEAT & SMART' 解决方案:从修改输出变量的计划中记下子网元素 ID,以便标记正确的子网。但这是一种解决方法,因为涉及可能会导致错误的手动步骤。
通过
为每个子网创建输出变量
输出“mgmt_pvt_subnet-1”{
值 = aws_subnet.fg-pvt-sub[0].id
}
通过引用输出变量
创建多个路由table关联
资源“aws_route_table_association”“mgmt-pvt-subnet-rt-assn”{
route_table_id = aws_route_table.fg-pvt-rt.id
subnet_id = aws_subnet.fg-pvt-sub[0].id
}
挑战:
当您必须 'cherry pick' 属于 mgmt-vpc 的私有子网与 mgmt-vpc-pvt-rt 相关联时,问题就来了。
我已经尝试使用 count、for、for_each 条件,但我无法实现我的目标...
任何指点将不胜感激
我想创建一个创建多个 VPC 的 terraform 脚本。然后,我希望我的脚本在所有 VPC 中创建 'n' 个子网。我想在一个子网资源块中执行此操作。我可以使用资源块内的计数创建 VPC,但无法将其用于子网。请帮忙。
直接在 Terraform 中没有针对您的要求的此类规定,但我们可以调整计数以满足您的要求。 首先,创建一个资源块,创建一定数量的 VPC。
resource "aws_vpc" "main" {
count = "${var.vpc_count}"
cidr_block = "${element(var.cidr_prefix, count.index)}.0.0/16"
enable_dns_support = "true"
enable_dns_hostnames = "true"
tags {
Name = "${var.vpc_name}${count.index}"
}
}
您也可以通过 variables.tf 文件或 .tfvars 文件传递值来对计数使用插值法。
现在使用此脚本在所有 VPC 中创建 "count" 个子网,并在所有可用性区域中均匀分布。
resource "aws_subnet" "private_subnet" {
count = "${var.subnet_count * var.vpc_count}"
vpc_id = "${element(aws_vpc.main.*.id, count.index % var.vpc_count)}"
cidr_block = "${element(var.cidr_prefix, count.index)}.${count.index}.0/24"
availability_zone = "${element(data.aws_availability_zones.all.names, count.index)}"
tags {
Name = "${var.vpc_name}-${element(var.availability_zone, count.index)}-${count.index}"
}
}
您可以单独定义VPC网段为列表,子网网段为列表。虽然我已经使用了 CIDR 前缀并使用 count 来为子网配置 CIDR 块的值。
查看变量 cidr_prefix。
variable "cidr_prefix"{
type = "list"
description = "The first 16 bits of the desired cidr block/s. Note: The number of elements in the list should not be less than the specified count of VPCs."
default = ["172.16", "10.0", "143.14", "100.10"]
}
@Shiv - 这是一个很好的解决方案,我也可以使用变量列表来实现。
如果您想进一步创建路由 table 关联到仅创建的特定子网,挑战就来了。
想象一个设计:
- 创建了 3 个 vpc(mgmt-vpc、shared-vpc 和 dedicated-vpc)
- 每个 vpc 中有 2 个 AZ(az-1a 和 az-1b)
- 每个可用区有 2 个子网(pub-sub-az-1a 和 pvt-sub-az-1a)[总共 12 个子网 -- 6 个 pub 和 6 个 pvt]
- 2 条路线 tables (mgmt-vpc-pub-rt & mgmt-vpc-pvt-rt)
不是这样 'NEAT & SMART' 解决方案:从修改输出变量的计划中记下子网元素 ID,以便标记正确的子网。但这是一种解决方法,因为涉及可能会导致错误的手动步骤。
通过
为每个子网创建输出变量输出“mgmt_pvt_subnet-1”{ 值 = aws_subnet.fg-pvt-sub[0].id }
通过引用输出变量
创建多个路由table关联资源“aws_route_table_association”“mgmt-pvt-subnet-rt-assn”{ route_table_id = aws_route_table.fg-pvt-rt.id subnet_id = aws_subnet.fg-pvt-sub[0].id }
挑战: 当您必须 'cherry pick' 属于 mgmt-vpc 的私有子网与 mgmt-vpc-pvt-rt 相关联时,问题就来了。
我已经尝试使用 count、for、for_each 条件,但我无法实现我的目标...
任何指点将不胜感激