Terraform远程状态获取私有DNS 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

