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

Terraform跨子模块引用问题:VPC子网ID无法在EC2模块中使用

解决Terraform子模块间资源ID传递问题

问题场景

使用Terraform根模块调用三个子模块(VPC、Key_Pair、EC2_VPN),需要将VPC子模块中的public_subnet_id传递给EC2_VPN子模块用于创建EC2实例,但执行时出现子网ID不存在的错误。

相关配置代码

根模块调用代码

module "VPC" {
    source = "/home/jamie/Terraform_Project/modules/vpc/"
}

module "Key_Pair" {
    source = "/home/jamie/Terraform_Project/modules/key_pair/"
}

module "EC2_VPN" {
    source = "/home/jamie/Terraform_Project/modules/ec2_vpn/"
}

VPC子模块 - main.tf(子网部分)

/* Public Subnet */
resource "aws_subnet" "public_subnet" {
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
  map_public_ip_on_launch = true

  tags = {
    Name = "Public"
    Project = var.project
    Architect = var.architect
  }
}

VPC子模块 - output.tf

output "public_subnet_id" {
    value = aws_subnet.public_subnet.id
}

EC2_VPN子模块 - main.tf(问题部分)

resource "aws_instance" "web" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t3.micro"
  subnet_id = var.public_subnet_id
  key_name = "${var.project}_Key"

  tags = {
    Name = "VPN_Server"
    Project = var.project
    Architect = var.architect
  }
}

错误信息

Error: creating EC2 Instance: InvalidSubnetID.NotFound: The subnet ID 'module.1_VPC.Public_Subnet_id' does not exist
│       status code: 400, request id: 00fa3944-4ea3-450b-9fd4-39645785269f
│
│   with module.EC2_VPN.aws_instance.web,
│   on .terraform/modules/EC2_VPN/main.tf line 17, in resource "aws_instance" "web":
│   17: resource "aws_instance" "web" {

解决方案

1. 为EC2_VPN子模块定义输入变量

在EC2_VPN子模块目录下创建variables.tf(已有则补充),定义所需变量:

variable "public_subnet_id" {
  description = "ID of the public subnet to launch the EC2 instance into"
  type        = string
}

variable "project" {
  description = "Project name for resource tagging"
  type        = string
}

variable "architect" {
  description = "Architect name for resource tagging"
  type        = string
}

2. 在根模块中传递VPC子模块的输出到EC2_VPN子模块

修改根模块中的EC2_VPN调用代码,将VPC模块的输出及其他依赖变量传递进去:

module "EC2_VPN" {
    source = "/home/jamie/Terraform_Project/modules/ec2_vpn/"
    public_subnet_id = module.VPC.public_subnet_id
    project = var.project  # 需确保根模块已定义该变量
    architect = var.architect  # 需确保根模块已定义该变量
}

3. 验证配置并执行

依次执行terraform init和terraform apply,此时EC2_VPN模块会正确获取到VPC模块的公网子网ID,完成实例创建。

问题原因

错误信息中的子网ID为module.1_VPC.Public_Subnet_id,说明你直接将模块引用赋值给了EC2模块的变量,未通过根模块完成正确的变量传递。Terraform中子模块间的资源引用必须以根模块为中间层,将上游模块的输出作为下游模块的输入变量传递。

内容的提问来源于stack exchange,提问作者JJ18654

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:10:56