You need to enable JavaScript to run this app. 如何从其他Terraform部署或模块获取Key Vault中的密钥值?
优惠活动
大模型
产品
解决方案
定价
更多

如何从其他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所在的资源组名称,避免硬编码资源路径导致的查询失败。

具体配置步骤

  1. 配置Key Vault查询数据源,拿到目标Vault的资源ID
    data "azurerm_key_vault" "target_vault" {
      name                = "key-vault-1"
      resource_group_name = "key-vault-1所在的资源组名称"
    }
    
  2. 配置密钥查询数据源,拉取对应secret的实际值
    data "azurerm_key_vault_secret" "target_password" {
      name         = "secret-password-1"
      key_vault_id = data.azurerm_key_vault.target_vault.id
      # 可选:如果需要读取指定历史版本的密钥,在这里填写对应版本号即可,不填默认拉取最新版本
      # version = "v1"
    }
    
  3. 在当前模块需要用到密钥值的位置,直接引用数据源返回的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 07:15:10