如何从DevOps Pipeline传递Storage Account Key至Databricks参数
问题分析与修复:Azure DevOps Pipeline传递存储账户密钥到Databricks失败
问题描述
尝试从Azure DevOps Pipeline传递存储账户密钥到Databricks参数,Pipeline日志显示已成功获取密钥,但Databricks中打印的env参数为空,执行存储挂载时出现错误:
shaded.databricks.org.apache.hadoop.fs.azure.AzureException: java.lang.IllegalArgumentException: Storage Key is not a valid base64 encoded string.
核心原因
- 变量跨任务传递失效:AzureCLI任务中仅将密钥设置为当前任务的环境变量,未通过Pipeline变量机制传递到后续Bash任务,导致Bash任务中
$STORAGE_ACCOUNT_KEY为空。 - Databricks参数格式错误:Databricks的
base_parameters仅支持字符串类型,但请求体中把env参数设为JSON对象{"STORAGE_ACCOUNT_KEY": "..."},导致参数解析失败,最终传递到Notebook的是空值。 - 空密钥引发挂载错误:由于传递的密钥为空,Hadoop无法解析空字符串为有效的Base64编码密钥,触发报错。
修复步骤
步骤1:将存储密钥设置为Pipeline全局变量
在AzureCLI任务的inlineScript中,添加Pipeline变量设置命令,让后续任务能访问到密钥:
# 原代码中设置环境变量后,新增以下行 echo "##vso[task.setvariable variable=STORAGE_ACCOUNT_KEY]$accountKey"
步骤2:修正Databricks API请求体的参数格式
修改Bash任务中的body2,将base_parameters改为传递字符串类型的密钥,而非JSON对象:
body2='{ "name": "'$jobName2'", "new_cluster": { "spark_version": "7.3.x-scala2.12", "node_type_id": "Standard_DS3_v2", "num_workers": 0 }, "notebook_task": { "notebook_path": "'$notebookPath1'", "base_parameters": { # 直接传递密钥字符串,或改为更清晰的参数名 "storage_account_key": "'$STORAGE_ACCOUNT_KEY'" } } }'
步骤3:调整Databricks Notebook代码匹配参数
修改Notebook中的widget定义,直接获取密钥参数:
# Cell1 dbutils.widgets.text("storage_account_key", "", "Storage Account Key") storage_account_access_key = dbutils.widgets.get("storage_account_key") print("Storage Account Key:", storage_account_access_key) # Cell2 storage_account_name = "你的存储账户名" container = "raw" mountDir = "你的挂载目录" dbutils.fs.mount( source = f"wasbs://{container}@{storage_account_name}.blob.core.windows.net", mount_point = f"/mnt/{mountDir}", extra_configs = {f"fs.azure.account.key.{storage_account_name}.blob.core.windows.net": storage_account_access_key} )
验证要点
- 检查Pipeline日志中Bash任务的
$STORAGE_ACCOUNT_KEY是否输出正确值(会被自动脱敏显示为***)。 - 运行Notebook后,确认打印的密钥不为空。
- 挂载操作成功执行,无Base64编码错误。
内容的提问来源于stack exchange,提问作者Vin
相关产品推荐
相关产品推荐

