Azure Synapse中隐藏与检索密钥的配置及访问方法
Azure Synapse 读取密钥实现对等Databricks配置方案
mssparkutils.credentials.getSecret() 是Synapse Spark环境读取受保护密钥的标准正确方法,不需要像Databricks那样做集群级的密钥挂载配置,但需要完成AKV(Azure Key Vault)关联和权限配置,针对你使用的my_new_pool Spark池,完整配置流程如下:
前置配置步骤
- 将原Databricks中使用的所有密钥(比如
example_client_id对应的实体值)存入Azure Key Vault,Synapse没有内置独立的集群密钥存储,所有受保护密钥统一从AKV拉取。 - 在Synapse Studio的「管理-链接服务」中,新建指向你存储密钥的AKV的链接服务,测试连通后发布配置。
- 给
my_new_pool的运行身份分配AKV密钥读取权限:如果池使用工作区托管标识,就到AKV的访问控制页给该托管标识分配「密钥用户」角色;如果使用自定义服务主体,给对应主体分配同权限即可,不需要把单个密钥逐一绑定到池的配置项中。
实现和Databricks一致的调用体验
你之前写的mssparkutils.credentials.getSecret("example_client_id")缺少必填的AKV链接服务参数,正确的基础调用语法是:
# 第一个参数为你之前创建的AKV链接服务名称,第二个参数为AKV中存储的密钥名 client_id = mssparkutils.credentials.getSecret("akv_link_service_name", "example_client_id")
如果要完全对齐Databricks里spark.conf.get("spark.example_client_id")的调用逻辑,不需要修改原有业务代码的话,只需要在作业/Notebook初始化阶段加一行注入配置即可:
# 将密钥注入Spark配置,全程密钥明文不会出现在日志或输出中,默认自动脱敏 spark.conf.set("spark.example_client_id", mssparkutils.credentials.getSecret("akv_link_service_name", "example_client_id")) # 后续原有代码可直接复用,和Databricks环境调用逻辑完全一致 client_id = spark.conf.get("spark.example_client_id")
常见问题说明
- 不需要像Databricks那样把密钥逐一挂载绑定到
my_new_pool的配置中:只要池的运行身份有AKV读取权限,就能拉取所有有权访问的密钥,同一个AKV链接服务可以被工作区下所有授权的Spark池复用,不需要重复配置。 - 不要直接把密钥明文写到Spark池的自定义Spark配置项里:这类配置是明文存储的,存在泄露风险。如果不想每个Notebook都写初始化注入代码,可以把密钥注入逻辑封装为公共启动脚本,配置为
my_new_pool的池级启动脚本,池启动时自动执行注入,所有跑在该池上的作业都可以直接通过spark.conf.get()读取对应密钥。 - 密钥安全:
mssparkutils.credentials.getSecret()返回的结果默认做了全链路脱敏,打印输出、日志记录时都会被替换为[REDACTED],和Databricks的密钥保护逻辑一致。
内容的提问来源于stack exchange,提问作者Nate
相关产品推荐
相关产品推荐

