Terraform部署带用户分配身份与客户托管密钥的Azure Data Factory:密钥未显示及手动添加报错问题
解决Terraform部署ADF时CMK不生效及托管标识找不到的问题
嘿,我看了你的Terraform配置和遇到的问题,核心原因是用户分配身份的Key Vault访问策略配置错误,再加上资源创建的依赖顺序没处理好,导致ADF没法正确关联客户托管密钥(CMK),手动添加时才会提示“未找到CMK中使用的托管标识”。
具体问题拆解
用错了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。依赖顺序没理清楚
你的ADF资源没明确依赖azurerm_key_vault_access_policy.main,这可能导致ADF在访问策略配置好之前就被创建了,那时候用户分配身份还没Key Vault的权限,CMK肯定关联不上。重复配置了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,避免权限冲突。
验证步骤
- 如果之前的资源有问题,可以先执行
terraform destroy清理掉。 - 运行
terraform init && terraform apply应用修改后的配置。 - 部署完成后,去Azure Portal看ADF的加密设置,应该就能看到CMK已经成功关联了。
这样调整后,应该就能解决你遇到的两个问题了。
内容的提问来源于stack exchange,提问作者Sanaga
相关产品推荐
相关产品推荐

