Databricks中SAS Token+ABFS访问ADLS Gen2报403,WASB正常
测试环境Databricks通过ABFS访问生产ADLS Gen2报403的排查建议
问题场景
- 现有测试(stg)、生产(prod)两个Databricks工作区
- stg作业需读取prod环境ADLS Gen2中的JSON文件,输出写入stg Blob存储,使用SAS Token做身份认证
- stg环境下:使用ABFS协议(
spark.read.json("abfss://<container>@<account_name>.dfs.core.windows.net/<blob_path>"))访问时触发403错误,但改用WASB协议+相同SAS Token可正常访问 - prod环境下:ABFS、WASB两种协议均能正常访问目标存储
- 已知prod Blob存储配置了防火墙,无法查看具体规则,怀疑WASB协议是否绕过了防火墙限制
核心原因分析
- 端点差异导致防火墙拦截:ABFS协议使用
dfs.core.windows.net端点,WASB协议使用blob.core.windows.net端点。prod的防火墙规则可能仅允许了blob.core.windows.net的访问请求,而未放行dfs.core.windows.net的流量,导致stg的ABFS请求被拦截。 - SAS Token权限覆盖范围:生成SAS Token时,若仅指定了Blob服务权限,未包含ADLS Gen2对应的File服务权限,可能导致ABFS协议访问受限(WASB仅依赖Blob服务权限)。不过prod环境两种协议均正常,此可能性较低,但仍需验证。
- Databricks出站网络限制:stg Databricks工作区(尤其是VNet注入部署的集群)的出站流量可能被内部防火墙/NVA限制,仅允许访问
blob.core.windows.net,阻断了对dfs.core.windows.net的请求。
排查与解决建议
1. 验证端点访问连通性
在stg Databricks集群的笔记本中执行以下命令,确认两个端点的访问差异:
- 解析端点:
nslookup <account_name>.dfs.core.windows.net nslookup <account_name>.blob.core.windows.net - 直接测试HTTP访问(替换实际SAS Token):
curl -v "https://<account_name>.dfs.core.windows.net/<container>/<blob_path>?<your_sas_token>" curl -v "https://<account_name>.blob.core.windows.net/<container>/<blob_path>?<your_sas_token>"
对比两个请求的返回结果,若dfs端点返回403而blob端点正常,基本可确认是防火墙针对端点的拦截。
2. 检查SAS Token权限配置
确认生成SAS Token时,**服务类型(Service)**勾选了Blob和File两项:
- ABFS协议依赖ADLS Gen2的File服务权限,若仅勾选Blob,会导致ABFS访问被拒绝。
- 可通过SAS Token的
sv参数验证:若值为bf则包含Blob和File服务,若仅为b则仅支持Blob服务。
3. 调整防火墙与网络规则
- 若能联系prod存储管理员,请求将stg Databricks工作区的出站IP范围添加到prod Blob防火墙的允许列表中,同时确保规则覆盖
dfs.core.windows.net端点。 - 若stg Databricks使用VNet注入,检查VNet的出站NSG规则或防火墙策略,确认未阻断对
*.dfs.core.windows.net的443端口访问。
4. 临时应急方案
若短期内无法调整防火墙或网络规则,可临时改用WASB协议完成数据读取,但需注意:ABFS是ADLS Gen2的推荐协议,支持分层命名空间、ACL管理等高级功能,长期建议优先修复ABFS的访问问题。
内容的提问来源于stack exchange,提问作者Xkimnt
相关产品推荐
相关产品推荐

