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

如何基于环境变量通过Terraform从Key Vault获取多环境SQL凭据

多环境Azure Key Vault凭据配置方案

核心思路:用本地映射表动态匹配环境与密钥

通过locals创建环境到Key Vault密钥信息的映射,再结合数据源动态拉取对应环境的凭据,完美支持3个及以上环境。


步骤1:定义环境变量约束

先确保var.environment有明确的取值范围,避免输入错误:

variable "environment" {
  type        = string
  description = "部署环境(Dev/UAT/Prod)"
  validation {
    condition     = contains(["Dev", "UAT", "Prod"], var.environment)
    error_message = "环境值必须是Dev、UAT或Prod中的一个。"
  }
}

步骤2:创建环境-密钥映射表

在locals中定义每个环境对应的Key Vault密钥名称(如果每个环境有独立的Key Vault,也可以把Key Vault ID加入映射):

locals {
  sql_credential_map = {
    Dev = {
      username_secret_name = "sql-server-dev-admin-username"
      password_secret_name = "sql-server-dev-admin-password"
      key_vault_id         = azurerm_key_vault.dev.id # 替换为你的Dev环境Key Vault ID
    }
    UAT = {
      username_secret_name = "sql-server-uat-admin-username"
      password_secret_name = "sql-server-uat-admin-password"
      key_vault_id         = azurerm_key_vault.uat.id # 替换为你的UAT环境Key Vault ID
    }
    Prod = {
      username_secret_name = "sql-server-prod-admin-username"
      password_secret_name = "sql-server-prod-admin-password"
      key_vault_id         = azurerm_key_vault.prod.id # 替换为你的Prod环境Key Vault ID
    }
  }

  # 快速获取当前环境的配置
  current_env_config = local.sql_credential_map[var.environment]
}

步骤3:动态拉取Key Vault凭据

通过数据源引用当前环境对应的密钥:

data "azurerm_key_vault_secret" "sql_admin_username" {
  name         = local.current_env_config.username_secret_name
  key_vault_id = local.current_env_config.key_vault_id
}

data "azurerm_key_vault_secret" "sql_admin_password" {
  name         = local.current_env_config.password_secret_name
  key_vault_id = local.current_env_config.key_vault_id
}

步骤4:配置SQL Server

直接使用拉取到的凭据配置SQL Server:

resource "azurerm_mssql_server" "main" {
  name                         = "sql-server-${var.environment}"
  resource_group_name          = azurerm_resource_group.main.name
  location                     = azurerm_resource_group.main.location
  version                      = "12.0"
  administrator_login          = data.azurerm_key_vault_secret.sql_admin_username.value
  administrator_login_password = data.azurerm_key_vault_secret.sql_admin_password.value
}

为什么之前的tomap尝试失败?

如果之前直接把数据源实例放进map,Terraform会因为数据源延迟求值导致解析错误。正确的做法是映射密钥名称、Key Vault ID这类静态配置,再通过数据源动态引用,而不是直接存储数据源对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:56:13