从非隔离共享集群切换至共享集群后密钥使用失败问题
解决共享集群中Azure日志库客户端密钥无效问题
问题根源在于共享集群的安全策略限制:非隔离共享集群会自动解析Spark配置中的{{secrets/keyvault/s}}占位符为实际密钥值,但共享集群不会执行该解析,导致spark.conf.get("fs.azure.account.oauth2.client.secret")返回的是占位符字符串而非真实密钥,触发Azure身份验证报错。
解决方案步骤
改用Databricks Secrets API直接获取密钥
绕过Spark配置的限制,使用dbutils.secrets.get()直接从Secret Scope提取实际密钥值,这是共享集群中安全且可靠的敏感信息访问方式。修改后的代码示例
from azure.core.exceptions import HttpResponseError from azure.identity import ClientSecretCredential from azure.monitor.ingestion import LogsIngestionClient import os # 从Secret Scope直接获取客户端密钥(替换为你的Scope名称和Secret名称) client_secret = dbutils.secrets.get("keyvault", "s") # 保留原有方式获取客户端ID和租户ID client_id = spark.conf.get("fs.azure.account.oauth2.client.id") tenant_id = os.getenv("AZ_TENANT_ID") # 初始化身份验证凭据 credential = ClientSecretCredential( tenant_id=tenant_id, client_secret=client_secret, client_id=client_id ) client = LogsIngestionClient(endpoint=endpoint, credential=credential, logging_enable=True) client.upload(....)
- 验证权限配置
确保:- 你的Databricks Secret Scope(示例中为
keyvault)已正确关联Azure Key Vault,且目标密钥s存在。 - 共享集群的运行用户或集群服务主体拥有该Secret Scope的
READ权限。
- 你的Databricks Secret Scope(示例中为
内容的提问来源于stack exchange,提问作者user3579222
相关产品推荐
相关产品推荐

