使用 Terraform 的 aws 子网的子网范围无效
Invalid subnet range for aws subnet using Terraform
当我尝试使用 terraform 创建子网时,不断出现以下错误。使用 aws 控制台创建子网没有问题。有人可以帮助我吗?
Error: error creating subnet: InvalidSubnet.Range: The CIDR '10.2.0.128/26' is invalid. │ status code: 400
Error: error creating subnet: InvalidSubnet.Range: The CIDR '10.2.0.64/26' is invalid. │ status code: 400
Error: error creating subnet: InvalidSubnet.Range: The CIDR '10.2.0.0/26' is invalid. │ status code: 400
我为 VPC 和子网使用以下 CIDR 范围
variable "cidr_block" {
default = "10.1.0.0/21"
description = "VPC CIDR Block"
type = string
}
variable "public_subnet_cidr_blocks" {
default = ["10.1.0.0/26","10.2.0.0/26","10.1.0.64/26","10.2.0.64/26","10.1.0.128/26","10.2.0.128/26"]
type = list
description = "List of public subnet CIDR blocks"
}
variable "private_subnet_cidr_blocks" {
default = ["10.3.0.0/25", "10.4.0.128/25", "10.3.0.128/25", "10.5.0.0/25", "10.4.0.0/25","10.5.0.128/25"]
type = list
description = "List of private subnet CIDR blocks"
}
假设您尝试在 VPC 块内声明具有给定地址范围的子网 10.1.0.0/21
,这是无效的,因为并非您声明的所有子网地址都属于该 VPC 地址前缀。
命令行工具 ipcalc
有助于将其可视化。有一些具有类似功能的在线工具,但这个工具的输出最容易在此答案中分享。
首先,让我们检查一下 VPC CIDR 块:
$ ipcalc 10.1.0.0/21
Address: 10.1.0.0 00001010.00000001.00000 000.00000000
Netmask: 255.255.248.0 = 21 11111111.11111111.11111 000.00000000
Wildcard: 0.0.7.255 00000000.00000000.00000 111.11111111
=>
Network: 10.1.0.0/21 00001010.00000001.00000 000.00000000
HostMin: 10.1.0.1 00001010.00000001.00000 000.00000001
HostMax: 10.1.7.254 00001010.00000001.00000 111.11111110
Broadcast: 10.1.7.255 00001010.00000001.00000 111.11111111
Hosts/Net: 2046 Class A, Private Internet
ipcalc
这里的表示法是右边显示左边十进制IP地址对应的二进制数,两串二进制数之间的space表示除法网络地址和主机号之间的点。这里主要需要注意的是,该块下的所有地址都必须以二进制数字00001010.00000001.00000
开头,也就是32位IP地址的前21位
现在让我们检查错误消息中指示的 CIDR 块之一:
$ ipcalc 10.2.0.128/26
Address: 10.2.0.128 00001010.00000010.00000000.10 000000
Netmask: 255.255.255.192 = 26 11111111.11111111.11111111.11 000000
Wildcard: 0.0.0.63 00000000.00000000.00000000.00 111111
=>
Network: 10.2.0.128/26 00001010.00000010.00000000.10 000000
HostMin: 10.2.0.129 00001010.00000010.00000000.10 000001
HostMax: 10.2.0.190 00001010.00000010.00000000.10 111110
Broadcast: 10.2.0.191 00001010.00000010.00000000.10 111111
Hosts/Net: 62 Class A, Private Internet
让我们比较一下两者之间的网络地址前缀二进制数字:
Address: 10.1.0.0 00001010.00000001.00000 000.00000000
Address: 10.2.0.128 00001010.00000010.00000000.10 000000
在第二个示例中,space 已向右移动,表示该子网具有 21 位地址前缀,但只有前 21 位需要匹配,由 [= 表示50=] 在第一行。但是,第二个地址的第二个八位字节具有不同的值,因此第二个地址不属于与第一个地址相同的地址范围。
让我们将其与未生成错误的其中一个进行比较:
Address: 10.1.0.0 00001010.00000001.00000 000.00000000
Address: 10.1.0.0 00001010.00000001.00000000.00 000000
这个是可以接受的,因为前 21 个二进制数字在两个地址之间是匹配的,所改变的只是网络地址和主机号之间的分界线。
要获得有效结果,您必须确保所有子网的地址范围都属于 VPC 的地址范围,这意味着它们必须共享相同的前缀。如果您希望更改地址中较早的数字,您可以 select 一个较短的前缀,但请注意,尤其是 AWS VPC 不允许 VPC 前缀长度小于 /16
,因此在实践中这意味着VPC 内的子网必须始终至少 IP 地址的前两个八位字节与 VPC 本身相同。
在 Terraform 文档部分 Netmasks and Subnets 中有一些关于 IP 网络寻址的更多信息,它是 Terraform 用于计算子网和主机地址的内置函数的文档的一部分。
HashiCorp 还提供 a Terraform module hashicorp/subnets/cidr
,它在内部使用 Terraform 的地址计算功能来更方便地一次分配多个子网地址,只需指定每个子网的前缀长度并让 Terraform 计算实际结果地址.
当我尝试使用 terraform 创建子网时,不断出现以下错误。使用 aws 控制台创建子网没有问题。有人可以帮助我吗?
Error: error creating subnet: InvalidSubnet.Range: The CIDR '10.2.0.128/26' is invalid. │ status code: 400
Error: error creating subnet: InvalidSubnet.Range: The CIDR '10.2.0.64/26' is invalid. │ status code: 400
Error: error creating subnet: InvalidSubnet.Range: The CIDR '10.2.0.0/26' is invalid. │ status code: 400
我为 VPC 和子网使用以下 CIDR 范围
variable "cidr_block" {
default = "10.1.0.0/21"
description = "VPC CIDR Block"
type = string
}
variable "public_subnet_cidr_blocks" {
default = ["10.1.0.0/26","10.2.0.0/26","10.1.0.64/26","10.2.0.64/26","10.1.0.128/26","10.2.0.128/26"]
type = list
description = "List of public subnet CIDR blocks"
}
variable "private_subnet_cidr_blocks" {
default = ["10.3.0.0/25", "10.4.0.128/25", "10.3.0.128/25", "10.5.0.0/25", "10.4.0.0/25","10.5.0.128/25"]
type = list
description = "List of private subnet CIDR blocks"
}
假设您尝试在 VPC 块内声明具有给定地址范围的子网 10.1.0.0/21
,这是无效的,因为并非您声明的所有子网地址都属于该 VPC 地址前缀。
命令行工具 ipcalc
有助于将其可视化。有一些具有类似功能的在线工具,但这个工具的输出最容易在此答案中分享。
首先,让我们检查一下 VPC CIDR 块:
$ ipcalc 10.1.0.0/21
Address: 10.1.0.0 00001010.00000001.00000 000.00000000
Netmask: 255.255.248.0 = 21 11111111.11111111.11111 000.00000000
Wildcard: 0.0.7.255 00000000.00000000.00000 111.11111111
=>
Network: 10.1.0.0/21 00001010.00000001.00000 000.00000000
HostMin: 10.1.0.1 00001010.00000001.00000 000.00000001
HostMax: 10.1.7.254 00001010.00000001.00000 111.11111110
Broadcast: 10.1.7.255 00001010.00000001.00000 111.11111111
Hosts/Net: 2046 Class A, Private Internet
ipcalc
这里的表示法是右边显示左边十进制IP地址对应的二进制数,两串二进制数之间的space表示除法网络地址和主机号之间的点。这里主要需要注意的是,该块下的所有地址都必须以二进制数字00001010.00000001.00000
开头,也就是32位IP地址的前21位
现在让我们检查错误消息中指示的 CIDR 块之一:
$ ipcalc 10.2.0.128/26
Address: 10.2.0.128 00001010.00000010.00000000.10 000000
Netmask: 255.255.255.192 = 26 11111111.11111111.11111111.11 000000
Wildcard: 0.0.0.63 00000000.00000000.00000000.00 111111
=>
Network: 10.2.0.128/26 00001010.00000010.00000000.10 000000
HostMin: 10.2.0.129 00001010.00000010.00000000.10 000001
HostMax: 10.2.0.190 00001010.00000010.00000000.10 111110
Broadcast: 10.2.0.191 00001010.00000010.00000000.10 111111
Hosts/Net: 62 Class A, Private Internet
让我们比较一下两者之间的网络地址前缀二进制数字:
Address: 10.1.0.0 00001010.00000001.00000 000.00000000
Address: 10.2.0.128 00001010.00000010.00000000.10 000000
在第二个示例中,space 已向右移动,表示该子网具有 21 位地址前缀,但只有前 21 位需要匹配,由 [= 表示50=] 在第一行。但是,第二个地址的第二个八位字节具有不同的值,因此第二个地址不属于与第一个地址相同的地址范围。
让我们将其与未生成错误的其中一个进行比较:
Address: 10.1.0.0 00001010.00000001.00000 000.00000000
Address: 10.1.0.0 00001010.00000001.00000000.00 000000
这个是可以接受的,因为前 21 个二进制数字在两个地址之间是匹配的,所改变的只是网络地址和主机号之间的分界线。
要获得有效结果,您必须确保所有子网的地址范围都属于 VPC 的地址范围,这意味着它们必须共享相同的前缀。如果您希望更改地址中较早的数字,您可以 select 一个较短的前缀,但请注意,尤其是 AWS VPC 不允许 VPC 前缀长度小于 /16
,因此在实践中这意味着VPC 内的子网必须始终至少 IP 地址的前两个八位字节与 VPC 本身相同。
在 Terraform 文档部分 Netmasks and Subnets 中有一些关于 IP 网络寻址的更多信息,它是 Terraform 用于计算子网和主机地址的内置函数的文档的一部分。
HashiCorp 还提供 a Terraform module hashicorp/subnets/cidr
,它在内部使用 Terraform 的地址计算功能来更方便地一次分配多个子网地址,只需指定每个子网的前缀长度并让 Terraform 计算实际结果地址.