使用Terraform为AWS实例指定私网IP时报子网预留地址范围错误如何解决
报错说明
你遇到的是AWS返回的参数不合法错误,具体错误日志如下:
Error: Error creating ENI: InvalidParameterValue: Address is in subnet's reserved address range status code: 400, request id: xxxxxxxxxx with aws_network_interface.my-instance-nic on main.tf line 222, in resource "aws_network_interface" "my-instance-nic": resource "aws_network_interface" "my-instance-nic" {
根因分析
该错误的核心原因是你手动指定的私网IP落在了AWS VPC子网的预留IP范围内。AWS对所有VPC子网默认预留5个IP地址,不支持分配给用户自建资源:
- 子网CIDR的第一个地址:子网网络标识地址
- 子网CIDR的第二个地址:VPC默认内网网关地址
- 子网CIDR的第三个地址:AWS官方DNS服务地址
- 子网CIDR的第四个地址:AWS预留用于未来功能迭代的地址
- 子网CIDR的最后一个地址:子网广播地址(AWS VPC不支持广播,该地址直接冻结不可用)
解决方案
- 首先确认目标子网的CIDR范围,计算合法可分配IP区间
例如子网CIDR为172.31.0.0/24时,合法可分配IP的范围是172.31.0.4~172.31.0.254,你指定的IP必须落在该区间内 - 修改Terraform配置中的指定IP参数
如果你使用aws_network_interface资源创建弹性网卡,修改private_ips参数中的自定义IP;如果你直接在aws_instance资源中指定private_ip参数,替换为落在可分配区间内的未占用IP即可 - 批量分配场景建议使用Terraform内置函数自动生成合法IP,避免手动计算错误,示例代码如下:
# 自动取子网第10个可用IP,自动跳过预留地址 resource "aws_instance" "my_instance" { ami = "ami-xxxxxx" instance_type = "t2.micro" subnet_id = aws_subnet.my_subnet.id private_ip = cidrhost(aws_subnet.my_subnet.cidr_block, 10) } - 修改完成后重新执行
terraform plan和terraform apply即可正常创建资源
内容的提问来源于stack exchange,提问作者mdnfiras
相关产品推荐
相关产品推荐

