如何配置Azure Cosmos DB Spark OLTP Connector使用托管标识认证?
计划将DataLake中的数据摄入至Azure Cosmos DB,经评估Spark OLTP Connector是易用性最高的接入方案。受公司安全策略约束,服务接入禁止使用主密钥,所有应用常规采用托管标识完成认证。已知Cosmos DB Java客户端构建器提供TokenCredential配置选项,示例代码如下:
CosmosAsyncClient client = CosmosClientBuilder .credential(new DefaultAzureCredentialBuilder().build()) .buildAsyncClient();
咨询是否有可行方法配置该连接器,使其通过托管标识采用相同认证机制完成接入。
完全支持,Azure Cosmos DB Spark OLTP Connector 从4.10.0版本开始原生兼容Azure Identity体系的TokenCredential认证链路,可以直接对接托管标识,不需要使用主密钥,和示例中Java SDK的认证逻辑完全对齐。
核心基础配置
所有认证场景都需要先配置以下基础参数,不要配置spark.cosmos.accountKey参数:
spark.cosmos.accountEndpoint:填写目标Cosmos DB账号终结点,格式为https://<你的Cosmos账号名>.documents.azure.com:443/spark.cosmos.auth.type:固定设置为Custom
场景1:作业运行在Azure托管环境
如果Spark作业运行在已开启托管标识的Azure服务上(包括AKS、Synapse Spark、Azure Databricks、Azure VM/VMSS等),不需要额外开发,直接使用连接器内置的默认凭据提供方即可,追加配置:
spark.cosmos.auth.aadTokenProvider:固定值为com.azure.cosmos.spark.DefaultAzureCredentialTokenProvider
该内置实现的认证逻辑和示例代码中new DefaultAzureCredentialBuilder().build()的逻辑完全一致,会自动遍历认证链,识别当前环境绑定的系统分配托管标识完成认证。
如果需要使用用户分配托管标识,额外追加一项配置即可:spark.cosmos.auth.aadTokenProvider.clientId:填写待使用的用户分配托管标识的客户端ID。
场景2:需要自定义凭据逻辑
如果内置的默认凭据链不满足需求(比如需要定制认证源排除规则、指定特殊的认证参数),可以自定义凭据提供方:
- 编写类实现
com.azure.cosmos.spark.AadTokenProvider接口,在实现逻辑中构造需要的TokenCredential实例返回即可,写法和原生Java SDK构造客户端的逻辑无差异 - 将实现类打包为JAR包,作为Spark作业依赖提交
- 将
spark.cosmos.auth.aadTokenProvider配置项的值改为自定义实现类的全限定名
注意事项:使用托管标识接入前,必须提前在Cosmos DB账号的访问控制(IAM)面板给对应托管标识分配对应的数据操作角色,例如内置的
Cosmos DB Built-in Data Contributor角色,否则认证成功后也会因权限不足无法读写数据。
内容的提问来源于stack exchange,提问作者Steven Lai

