You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:37:01