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

Terraform远程状态获取私有DNS FQDN报错,寻求解决方案

Azure SQL Server私有端点迁移后Terraform远程状态获取FQDN报错问题

背景

需将5台Azure SQL Server从公网迁移至私有端点,这些SQL Server为Kubernetes容器中的应用提供服务。已确认网络配置无误,但应用仍连接旧公网FQDN而非私有端点FQDN。经排查,应用使用的主机名由Kubernetes Secret资源生成,该资源从另一个项目的Terraform远程状态输出中取值。

相关Terraform代码

生成私有DNS记录并输出FQDN的项目代码

variable "dns_records" {
  default = {
    "btarget"  = "172.16.102.4"
    "public-0" = "172.16.102.5"
    "public-1" = "172.16.102.6"
    "public-2" = "172.16.102.7"
  }
}

resource "azurerm_private_dns_a_record" "dns-records" {
  for_each            = var.dns_records
  name                = each.key
  records             = [each.value]
  resource_group_name = "${var.application_name}-${var.environment_tag}-rg"
  ttl                 = 3600
  zone_name           = azurerm_private_dns_zone.dns-zone.name
}

output "sql_admin_fqdns" {
  description = "FQDNs of all other SQL Servers"
  sensitive   = false
  value       = { for entry in azurerm_private_dns_a_record.dns-records : entry.name => entry.fqdn }
}

调用远程状态生成Kubernetes Secret的项目代码

data "terraform_remote_state" "staged_azure" {
  backend = "azurerm"
  config = {
    subscription_id      = var.tf_state_subscription_id
    resource_group_name  = var.tf_state_rg_name
    storage_account_name = var.tf_state_sa_name
    container_name       = var.tf_state_container_name
    key                  = var.tf_state_staged_azure_key
    access_key           = var.tf_state_access_key
  }
}

resource "kubernetes_secret" "cms_database" {
  metadata {
    name      = join("-", [var.application_name, "database", each.key])
    namespace = kubernetes_namespace.magnolia.id
  }
  data = {
    username       = each.value
    password       = data.terraform_remote_state.staged_azure.outputs.sql_admin_passwords[each.key]
    hostname       = data.terraform_remote_state.staged_azure.outputs.sql_admin_fqdns[each.key].fqdn
    schema         = data.terraform_remote_state.staged_azure.outputs.sql_admin_schemas[each.key]
    port           = 1433
    resource-group = data.terraform_remote_state.staged_azure.outputs.sql_admin_rg
  }
  for_each = data.terraform_remote_state.staged_azure.outputs.sql_admin_usernames
}

报错信息

Error: 不支持的属性

│

在 tomcat.tf 第59行,resource "kubernetes_secret" "bca_cms_database" 块中:

59: hostname = data.terraform_remote_***.staged_azure.outputs.sql_admin_fqdns[each.key].fqdn

│ ├────────────────

data.terraform_remote_***.staged_azure.outputs.sql_admin_fqdns 是包含4个属性的对象

each.key 的值为 "public-2"

│

无法在原始类型值(字符串)上访问属性。

问题说明

源项目已正确输出FQDN值,但无论尝试何种方法,调用端均无法正确获取。目标是让Kubernetes Secret从远程状态中获取私有DNS记录的FQDN并注入容器。此前从公网SQL Server获取FQDN时,该Kubernetes Secret配置可正常运行。

已获取的建议

曾在Reddit Terraform板块咨询,得到建议:HashiCorp不推荐引用远程状态,应直接使用Azure数据源获取数据,但目前尚未找到具体实现方法。


内容的提问来源于stack exchange,提问作者James White

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 01:44:52