You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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代码创建的资源,因此需要通过数据源来查询这些自动生成的记录。

修正后的完整实现步骤:

  1. 添加数据源查询自动生成的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]
    }
    
  2. 修改跨域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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:05:57