如何在Terraform中为EC2实例分配固定私有IP?
如何通过Terraform为EC2实例分配固定私有IP?
我编写了以下Terraform代码:
resource "aws_network_interface" "eni_carl" { subnet_id = module.vpc.public_subnets[3] private_ip = "10.0.4.1/32" security_groups = [module.vpc.ssh_sg] } resource "aws_instance" "carl" { ami = var.ami instance_type = "t2.micro" key_name = var.key_name network_interface { network_interface_id = aws_network_interface.eni_carl.id device_index = 0 } }
但AWS仍会为我的实例随机分配私有IP,请问如何实现为EC2实例分配固定不变的私有IP?
环境信息:
- Terraform v1.3.4,运行于linux_amd64
- AWS Provider v4.39.0
问题原因
当前配置中,虽然给弹性网络接口(ENI)指定了固定私有IP,但aws_instance资源未明确禁用自动分配私有IP的默认行为,AWS会自动创建默认ENI并分配随机IP,覆盖自定义ENI的设置。
解决方法
要让实例使用自定义ENI的固定IP,需确保实例不创建默认ENI,同时正确配置自定义ENI的关联参数。修正后的完整代码如下:
resource "aws_network_interface" "eni_carl" { subnet_id = module.vpc.public_subnets[3] private_ip = "10.0.4.1" # 无需添加/32后缀,AWS自动处理32位掩码 security_groups = [module.vpc.ssh_sg] } resource "aws_instance" "carl" { ami = var.ami instance_type = "t2.micro" key_name = var.key_name network_interface { network_interface_id = aws_network_interface.eni_carl.id device_index = 0 delete_on_termination = false # 可选,实例销毁时保留ENI以便复用 } # 关键:禁用自动关联公网IP(若不需要),确保实例仅使用指定的自定义ENI associate_public_ip_address = false }
注意事项
- 确认
10.0.4.1处于目标子网的IP地址范围内,且未被其他AWS资源占用,否则资源创建会失败。 - 若需要实例销毁后保留ENI,必须设置
delete_on_termination = false,否则ENI会随实例一同被删除。 - ENI的
private_ip字段无需添加子网掩码后缀,直接填写IP地址即可。
内容的提问来源于stack exchange,提问作者drdot
相关产品推荐
相关产品推荐

