如何在Terraform中自动获取私有DNS A记录IP并跨域创建A记录
解决Terraform自动获取Azure Flexible PostgreSQL私有DNS A记录IP并创建跨域A记录的问题
你当前的代码存在一个关键问题:你试图引用azurerm_private_dns_a_record.flexpsql,但这个Terraform资源并不存在——Azure Flexible PostgreSQL对应的私有DNS区域${local.flexpsql_name}.private.postgres.database.azure.com里的A记录是Azure自动托管生成的,并非由你的Terraform代码创建的资源,因此需要通过数据源来查询这些自动生成的记录。
修正后的完整实现步骤:
添加数据源查询自动生成的A记录
用data "azurerm_private_dns_a_record"查询刚创建的私有DNS区域中FlexPSQL实例对应的A记录:data "azurerm_private_dns_a_record" "flexpsql_auto" { name = local.flexpsql_name zone_name = azurerm_private_dns_zone.flexpsql.name resource_group_name = var.vnet_resource_group_name # 依赖VNet链接创建完成,确保Azure已生成A记录 depends_on = [azurerm_private_dns_zone_virtual_network_link.flexpsql] }修改跨域A记录资源,引用数据源的IP记录
直接使用数据源返回的records字段填充跨域A记录的IP列表:resource "azurerm_private_dns_a_record" "cross_zone" { name = local.flexpsql_name zone_name = data.azurerm_private_dns_zone.main.name resource_group_name = "rgtest111" ttl = 3600 records = data.azurerm_private_dns_a_record.flexpsql_auto.records }
完整代码整合:
# 创建FlexPSQL私有DNS区域 resource "azurerm_private_dns_zone" "flexpsql" { name = "${local.flexpsql_name}.private.postgres.database.azure.com" resource_group_name = var.vnet_resource_group_name } # 关联VNet到私有DNS区域 resource "azurerm_private_dns_zone_virtual_network_link" "flexpsql" { name = local.flexpsql_name private_dns_zone_name = azurerm_private_dns_zone.flexpsql.name virtual_network_id = var.virtual_network_id resource_group_name = var.vnet_resource_group_name } # 查询Azure自动生成的FlexPSQL A记录 data "azurerm_private_dns_a_record" "flexpsql_auto" { name = local.flexpsql_name zone_name = azurerm_private_dns_zone.flexpsql.name resource_group_name = var.vnet_resource_group_name depends_on = [azurerm_private_dns_zone_virtual_network_link.flexpsql] } # 在现有组织私有DNS区域创建跨域A记录 resource "azurerm_private_dns_a_record" "cross_zone" { name = local.flexpsql_name zone_name = data.azurerm_private_dns_zone.main.name resource_group_name = "rgtest111" ttl = 3600 records = data.azurerm_private_dns_a_record.flexpsql_auto.records }
关键说明:
depends_on用于确保Terraform在VNet链接完全建立后再查询A记录,避免因Azure未生成记录导致的查询失败。- 数据源
azurerm_private_dns_a_record会直接读取Azure托管的A记录内容,无需手动维护IP。
内容的提问来源于stack exchange,提问作者Nerd in Training
相关产品推荐
相关产品推荐

