Terraform部署双VPC时跨模块复用aws_vpc_dhcp_options的关联问题
跨VPC关联共用DHCP选项集的落地方法
报错本质
Terraform模块默认是作用域隔离的,vpc-intapp模块内部从未声明aws_vpc_dhcp_options.dhcp_domain_name资源,直接跨模块硬写资源引用路径,必然触发未声明资源的报错,这是违反Terraform模块设计规则的写法。
实现步骤
- 第一步:将DHCP选项集ID从创建它的VPC模块中暴露为输出值
打开第一个VPC模块的outputs.tf文件,新增如下配置,把DHCP资源的ID暴露给根模块调用方:output "shared_dhcp_options_id" { value = aws_vpc_dhcp_options.dhcp_domain_name.id description = "可供其他VPC复用的公共DHCP选项集ID" } - 第二步:在第二个VPC模块中定义DHCP ID的入参变量
打开vpc-intapp模块的variables.tf文件,新增变量配置,准备接收从根模块传入的共用DHCP ID:variable "shared_dhcp_options_id" { type = string description = "跨VPC关联的公共DHCP选项集ID" } - 第三步:在根模块完成两个VPC模块的参数传递
在顶层执行Terraform部署的配置文件中,调用两个VPC模块时,将第一个模块输出的DHCP ID作为参数传入第二个模块,参考代码如下:# 调用第一个VPC模块(即最初创建DHCP选项集的模块) module "vpc_infra" { source = "./modules/vpc-infra" domain_name = "your.internal.domain" creator_name = "your-team" } # 调用第二个VPC模块 module "vpc_intapp" { source = "./modules/vpc-intapp" # 传入第一个模块输出的共用DHCP选项集ID shared_dhcp_options_id = module.vpc_infra.shared_dhcp_options_id # 保留原有的其他VPC配置参数 } - 第四步:修正第二个模块内的DHCP关联资源配置
删掉第二个模块里原本错误的硬引用代码,替换为使用模块入参的合法引用,同时注意把关联的VPC ID改成当前模块内创建的第二个VPC的资源ID(原示例代码里直接抄了第一个模块的VPC ID,后续就算DHCP ID传对了,这个VPC ID引用也会触发未声明报错):resource "aws_vpc_dhcp_options_association" "dns_resolver" { vpc_id = aws_vpc.intapp-vpc.id # 替换为当前模块内定义的第二个VPC的资源ID dhcp_options_id = var.shared_dhcp_options_id # 使用入参的DHCP ID,不再硬引用其他模块的资源 }
长期优化建议
如果后续有更多VPC需要复用这套DHCP选项集,建议把DHCP选项集的定义从第一个VPC模块中抽离,做成独立的公共模块,所有需要关联的VPC统一从这个公共模块获取DHCP ID,避免和单个业务VPC模块形成硬耦合,后续VPC模块的资源调整不会影响其他依赖方。
内容的提问来源于stack exchange,提问作者Steven Williams
相关产品推荐
相关产品推荐

