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

Terraform部署带用户分配身份与客户托管密钥的Azure Data Factory:密钥未显示及手动添加报错问题

解决Terraform部署ADF时CMK不生效及托管标识找不到的问题

嘿,我看了你的Terraform配置和遇到的问题,核心原因是用户分配身份的Key Vault访问策略配置错误,再加上资源创建的依赖顺序没处理好,导致ADF没法正确关联客户托管密钥(CMK),手动添加时才会提示“未找到CMK中使用的托管标识”。

具体问题拆解

  1. 用错了Access Policy的Object ID
    在azurerm_key_vault_access_policy.main里,你把用户分配身份的client_id当成了object_id填进去,但Key Vault的访问策略要求的是托管身份的Principal ID(也就是principal_id字段),不是Client ID。这就相当于你给错了授权对象,Key Vault根本没给正确的身份开权限,ADF自然找不到能用的托管身份来用CMK。

  2. 依赖顺序没理清楚
    你的ADF资源没明确依赖azurerm_key_vault_access_policy.main,这可能导致ADF在访问策略配置好之前就被创建了,那时候用户分配身份还没Key Vault的权限,CMK肯定关联不上。

  3. 重复配置了Access Policy
    你写了azurerm_key_vault_access_policy.main和azurerm_key_vault_access_policy.new两个针对同一个用户分配身份的访问策略,这不仅多余,还可能搞出权限冲突。

修改后的完整配置

data "azurerm_client_config" "main" {}

resource "azurerm_resource_group" "main" {
  name     = "rgsupports01"
  location = "East US 2"
}

resource "azurerm_user_assigned_identity" "main" {
  name                = "supports01-mid"
  resource_group_name = azurerm_resource_group.main.name
  location            = azurerm_resource_group.main.location
  # 这里不用加depends_on,Terraform会自动处理和资源组的依赖关系
}

resource "azurerm_key_vault" "main" {
  name                       = "supportskv01"
  location                   = azurerm_resource_group.main.location
  resource_group_name        = azurerm_resource_group.main.name
  enabled_for_disk_encryption = true
  tenant_id                  = data.azurerm_client_config.main.tenant_id
  soft_delete_retention_days = 7
  purge_protection_enabled   = false
  sku_name                   = "standard"

  access_policy {
    tenant_id = data.azurerm_client_config.main.tenant_id
    object_id = data.azurerm_client_config.main.object_id

    key_permissions = [
      "Get",
      "Unwrapkey",
      "Wrapkey",
      "Create",
      "Delete",
    ]
    secret_permissions = [
      "Get",
    ]
    storage_permissions = [
      "Get",
    ]
  }
}

# 重点修正:用用户分配身份的principal_id作为授权的object_id
resource "azurerm_key_vault_access_policy" "main" {
  key_vault_id = azurerm_key_vault.main.id
  tenant_id    = data.azurerm_client_config.main.tenant_id
  object_id    = azurerm_user_assigned_identity.main.principal_id

  key_permissions = [
    "Get", "List", "UnwrapKey", "WrapKey", "GetRotationPolicy"
  ]
  secret_permissions = [
    "Get", "List",
  ]
}

resource "azurerm_key_vault_key" "main" {
  depends_on = [azurerm_key_vault_access_policy.main]
  name       = "supportrsakeys01"
  key_vault_id = azurerm_key_vault.main.id
  key_type   = "RSA"
  key_size   = 2048

  key_opts = [
    "decrypt",
    "encrypt",
    "sign",
    "unwrapKey",
    "verify",
    "wrapKey",
  ]
}

resource "azurerm_data_factory" "adf" {
  # 明确依赖访问策略和密钥,确保创建ADF时权限和密钥都已就绪
  depends_on = [azurerm_key_vault_access_policy.main, azurerm_key_vault_key.main]
  
  name                = "supportdfs01"
  resource_group_name = azurerm_resource_group.main.name
  location            = azurerm_resource_group.main.location
  public_network_enabled = false
  customer_managed_key_id = azurerm_key_vault_key.main.id

  identity {
    type         = "UserAssigned"
    identity_ids = [azurerm_user_assigned_identity.main.id]
  }
}

# 删掉重复的access_policy,不需要第二个

关键修改说明

  • 修正授权对象:把Access Policy里的client_id换成principal_id,让Key Vault给正确的用户分配身份授权。
  • 补全依赖关系:让ADF依赖于Key Vault的访问策略和密钥资源,保证ADF创建时,必要的权限和密钥都已经配置完成。
  • 移除冗余配置:删掉重复的azurerm_key_vault_access_policy.new,避免权限冲突。

验证步骤

  1. 如果之前的资源有问题,可以先执行terraform destroy清理掉。
  2. 运行terraform init && terraform apply应用修改后的配置。
  3. 部署完成后,去Azure Portal看ADF的加密设置,应该就能看到CMK已经成功关联了。

这样调整后,应该就能解决你遇到的两个问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:47:30