Terraform跨模块引用:ASG模块如何获取VPC模块的public_subnets值
Terraform跨同级子模块引用属性实现方案
问题核心原因
同级子模块无法直接读取另一个子模块的内部资源属性,必须通过「子模块输出属性→根模块中转传递→目标子模块接收变量」的流程实现跨模块引用。
具体实现步骤
步骤1:给VPC子模块添加输出配置
在modules/vpc目录下新建outputs.tf文件,将需要对外暴露的public_subnets属性导出:
# modules/vpc/outputs.tf output "public_subnets" { description = "VPC公有子网ID列表" type = list(string) value = module.vpc.public_subnets # 引用当前vpc.tf内调用的官方VPC模块输出 } # 可按需导出其他常用属性,示例如下 output "vpc_id" { description = "VPC实例ID" type = string value = module.vpc.vpc_id }
步骤2:给ASG子模块添加变量声明
在modules/asg目录下新建variables.tf文件,声明接收公有子网参数的变量:
# modules/asg/variables.tf variable "public_subnets" { description = "ASG部署所用的公有子网ID列表" type = list(string) }
步骤3:修改ASG子模块的配置引用
修改modules/asg/asg.tf中的vpc_zone_identifier配置,改为引用自身接收的变量:
# 原错误配置:vpc_zone_identifier = module.vpc.public_subnets # 替换为以下配置 vpc_zone_identifier = var.public_subnets
步骤4:在根模块中完成参数传递
在Terraform根配置文件(一般为根目录下的main.tf)中同时声明两个子模块的调用,并将VPC子模块的输出传递给ASG子模块:
# 根目录main.tf # 调用VPC子模块 module "vpc" { source = "./modules/vpc" # 传递VPC子模块需要的参数,例如namespace等 namespace = var.namespace } # 调用ASG子模块 module "asg" { source = "./modules/asg" # 传递VPC子模块输出的公有子网参数 public_subnets = module.vpc.public_subnets # 传递ASG子模块需要的其他参数,例如namespace等 namespace = var.namespace }
验证方法
执行以下命令验证配置是否正常:
terraform init初始化加载所有子模块terraform plan检查配置是否存在引用错误,无报错则配置生效
内容的提问来源于stack exchange,提问作者Ramesh Anantha Kumar
相关产品推荐
相关产品推荐

