如何基于环境变量通过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
相关产品推荐
相关产品推荐

