【问题标题】:Terraform create subnets under multiple VPC'sTerraform 在多个 VPC 下创建子网
【发布时间】:2018-07-29 10:27:42
【问题描述】:

我在 Terraform 中遇到问题。我正在尝试使用我的变量文件中的预定义 CIDR 范围来配置 VPC 和子网。下面是变量文件中的代码 sn-p,即 variables.tf

variable "vpc-fullcidr" {
  description = "VPC CIDR range"
  type = "list"
  default = ["10.0.0.0/16", "192.168.0.0/16"]
}
variable "subnet-cidr" {
  description = "Subnet CIDR range"
  type = "list"
  default = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24", "192.168.0.0/24", 
  "192.168.1.0/24", "192.168.2.0/24"]
}

variable "vpc-count" {
  description = "Number of VPC to create"
  type    = "string"
  default = "2"
}

variable "subnet-count"
{
  description = "Number of Subnets to create"
  default = "6"
}

以下是我的 VPC 模板。 VPC 的配置没有任何问题:-

resource "aws_vpc" "VPCPrimary" {
   count = "${var.vpc-count}"
   cidr_block = "${element(var.vpc-fullcidr, count.index)}"
   #### Below DNS values are for the internal vpc dns resolution
   enable_dns_support = true
   enable_dns_hostnames = true
   tags {
     Name = "${element(var.VPCNameTag, count.index)}"
   }
}

当我尝试创建子网时,它失败了。下面是我的子网模板:-

resource "aws_subnet" "PrivateSubnets" {
  count = "${var.subnet-count}"
  vpc_id = "${element(aws_vpc.VPCPrimary.*.id, count.index)}"
  availability_zone = "${var.primaryaz}"
  cidr_block        = "${element(var.subnet-cidr, count.index)}"
  tags {
  Name = "Private Subnet ${count.index + 1}"
  }
}

地形错误日志:-

Error: Error applying plan:

2 error(s) occurred:

* aws_subnet.PrivateSubnets[4]: 1 error(s) occurred:

* aws_subnet.PrivateSubnets.4: Error creating subnet: InvalidSubnet.Range: 
The CIDR '192.168.1.0/24' is invalid.
status code: 400, request id: 1a9136e6-8631-43cb-99a6-ccd2522854d4
* aws_subnet.PrivateSubnets[1]: 1 error(s) occurred:

* aws_subnet.PrivateSubnets.1: Error creating subnet: InvalidSubnet.Range: 
The CIDR '10.0.2.0/24' is invalid.
status code: 400, request id: 1b0e4cf5-2e1d-402e-a89d-f08d8ac694e1

我正在尝试以自动方式配置基础架构,其中 variables.tf 文件使用存储过程在 .NET 前端中的用户输入动态填充。这个问题是当我尝试创建多个 VPC 以及多个子网时。有什么方法可以将子网 CIDR 块与 terraform 资源“aws_subnet”中的 VPC CIDR 块映射。

【问题讨论】:

  • 其他的都创建好了吗?
  • 哦,等一下,您是否有任何逻辑将 192.168.x.x 子网与 10.x.x.x 子网分开,以便它们只尝试在正确的 VPC 中创建?或者您只是在两个 VPC 上的所有子网中循环(这似乎是 TF sn-ps 发布的情况),尽管我预计在这种情况下会报告 6 个错误......
  • 我搜索了很多关于如何实现将两者分开的逻辑但找不到逻辑。六个子网中有四个成功创建,因此其余两个子网出错。我正在寻找一种解决方案,其中我将创建 n 个 VPC 和 x 个子网,并且用户将动态提供这些详细信息。

标签: terraform


【解决方案1】:

您定义了两个 VPC,我将其称为 A 和 B:

default = ["10.0.0.0/16", "192.168.0.0/16"]
#             A               B

然后您定义了 6 个子网:

  default = [
    "10.0.1.0/24", 
    "10.0.2.0/24",
    "10.0.3.0/24",
    "192.168.0.0/24", 
    "192.168.1.0/24",
    "192.168.2.0/24"]

创建子网时,您循环遍历子网资源 6 次,每个子网一次:

resource "aws_subnet" "PrivateSubnets" {
  count = "${var.subnet-count}"
  vpc_id = "${element(aws_vpc.VPCPrimary.*.id, count.index)}"

在上面,您还使用计数来索引创建的 VPC。此索引从 1 到 6 进行,而您只有 2 个 VPC,因此它会自动换行。这意味着当它通过子网 1-6 时,它将 VPC 重复为 ABABAB。如果您将该模式应用于您定义的 6,您可以看到为什么 2 失败:

  default = [
    "10.0.1.0/24",      #A
    "10.0.2.0/24",      #B <- this fails
    "10.0.3.0/24",      #A
    "192.168.0.0/24",   #B
    "192.168.1.0/24",   #A <- this fails
    "192.168.2.0/24"]   #B

您现在可以看到其中两个失败的原因,因为它们是在错误的 VPC 中创建的。一个简单的解决方法是对子网进行排序,以便它们正确索引到 VPC:

  default = [
    "10.0.1.0/24",     #A
    "192.168.0.0/24",  #B
    "10.0.2.0/24",     #A
    "192.168.1.0/24",  #B
    "10.0.3.0/24",     #A
    "192.168.2.0/24"]  #B

对于更通用的解决方案,您可能需要考虑使用模块,您可以在其中多次将单个 VPC CIDR 和相关子网提供给模块。

【讨论】:

  • 没错,我知道问题出在错误映射的 VPC-Subnet CIDR 上。您能否提供一个示例,我们可以使用模块来实现上述场景。由于子网的数量会有所不同,我们无法继续在默认部分中提供正确映射 VPC 子网范围的列出的修复程序。对于给定的 VPC,它可能是 1-6。
  • 非常感谢詹姆斯的建议。我创建了两个模块,并且能够毫无问题地配置 VPC 和子网。
猜你喜欢
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 2020-06-13
  • 2020-11-30
  • 1970-01-01
  • 2022-09-28
  • 2019-11-22
  • 2019-02-04
相关资源
最近更新 更多