如何从其他Terraform部署或模块获取Key Vault中的密钥值?
跨独立Terraform部署读取Azure Key Vault密钥的实现方案
因为你要读取的Key Vault、存储的secret都由另一套独立的Terraform部署托管,当前模块无法直接引用对方tfstate里的资源对象,可落地的操作方式是通过Azure Provider提供的只读数据源完成查询,具体操作如下:
前置准备
- 给当前Terraform执行所用的Azure身份(服务主体/托管身份)配置目标Key Vault的访问权限:要么授权Azure RBAC维度的Key Vault Secrets User角色,要么配置旧版访问策略下的secret读取权限,没有对应权限的话所有查询都会直接报错。
- 提前确认目标Key Vault所在的资源组名称,避免硬编码资源路径导致的查询失败。
具体配置步骤
- 配置Key Vault查询数据源,拿到目标Vault的资源ID
data "azurerm_key_vault" "target_vault" { name = "key-vault-1" resource_group_name = "key-vault-1所在的资源组名称" } - 配置密钥查询数据源,拉取对应secret的实际值
data "azurerm_key_vault_secret" "target_password" { name = "secret-password-1" key_vault_id = data.azurerm_key_vault.target_vault.id # 可选:如果需要读取指定历史版本的密钥,在这里填写对应版本号即可,不填默认拉取最新版本 # version = "v1" } - 在当前模块需要用到密钥值的位置,直接引用数据源返回的value字段即可,比如:
# 示例:将读取到的密钥值传入当前部署的应用配置 resource "azurerm_linux_web_app" "example" { name = "my-app" resource_group_name = "当前部署的资源组" location = "East Asia" site_config { application_stack { node_version = "18-lts" } } app_settings = { DB_PASSWORD = data.azurerm_key_vault_secret.target_password.value } }
关键注意点
- 这种实现方式完全和另一套独立的Terraform部署解耦,不需要把对方的tfstate配置成远程共享状态,只要当前身份有Azure侧的资源读取权限就能正常工作,不会出现状态锁冲突、状态文件跨部署依赖的问题。
- 不要直接硬编码Key Vault的域名、URI来关联secret,通过Key Vault数据源返回的资源ID做关联,可以自动适配不同Azure云环境的域名规则,减少配置出错的概率。
- 执行
terraform plan的时候就会触发数据源查询,权限问题、资源找不到的问题会在计划阶段直接暴露,不需要等到实际部署时才排查。 - 读取到的secret值会被缓存到当前部署的tfstate文件中,需要给当前tfstate配置静态加密规则,避免密钥明文泄露。
内容的提问来源于stack exchange,提问作者Yoda
相关产品推荐
相关产品推荐

