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
相关产品推荐
相关产品推荐

