Terraform模块间数据传递:GatewaySubnet ID获取问题问询
问题解答
一、Data数据源报错GatewaySubnet不存在的原因及解决
这是正常行为。Terraform的data资源默认会在执行计划阶段尝试查询Azure中已存在的资源,而此时GatewaySubnet是当前部署流程中即将创建的资源,还未实际存在于Azure上,因此会报错找不到。
如果一定要用data方案,需显式声明依赖关系,让Terraform等待子网创建完成后再执行data查询:
data "azurerm_subnet" "gateway-subnet" { name = "GatewaySubnet" virtual_network_name = var.vnet_name resource_group_name = var.resource_group depends_on = [module.network-azure] }
但这种方式不如直接从模块输出引用资源ID可靠,因为data依赖外部状态,而模块输出直接关联资源的创建状态。
二、从模块输出中过滤GatewaySubnet的ID
优化方案:修改network模块的输出格式(推荐)
将子网输出改为以子网名为键、ID为值的映射,查找更直观高效:
# 在network模块中修改output output "subnets" { value = { for k, subnet in azurerm_subnet.main-subnets : subnet.name => subnet.id } }
随后在vpn模块中直接引用:
module "vpn-azure" { source = "../../modules/AZURE/vpn" # 其他变量... gateway_subnet_id = module.network-azure.subnets["GatewaySubnet"] }
兼容原有列表输出的过滤方式
如果保持原有列表形式的输出,可使用Terraform的for表达式结合one函数(确保唯一匹配)过滤:
module "vpn-azure" { source = "../../modules/AZURE/vpn" # 其他变量... gateway_subnet_id = one([for s in module.network-azure.subnets : s.id if s.name == "GatewaySubnet"]) }
one函数会从过滤后的单元素列表中提取值,若没有匹配或匹配多个,会抛出明确错误,避免潜在问题。
内容的提问来源于stack exchange,提问作者DarkLeafyGreen
相关产品推荐
相关产品推荐

