如何将Azure Synapse IP段加入ADLS防火墙以解决403访问错误?
问题详情
需要让Synapse Notebook访问托管虚拟网络(Managed VNet)外的ADLS Blob数据,但持续触发403权限错误,托管标识与用户主体名称均受影响。错误栈信息如下:
java.nio.file.AccessDeniedException: Operation failed: "This request is not authorized to perform this operation.", 403, HEAD ... at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem.checkException(AzureBlobFileSystem.java:1200) at org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem.getFileStatus(AzureBlobFileSystem.java:519) at org.apache.hadoop.fs.FileSystem.isDirectory(FileSystem.java:1713) at org.apache.spark.sql.execution.streaming.FileStreamSink$.hasMetadata(FileStreamSink.scala:47) at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:377) at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:332) at org.apache.spark.sql.DataFrameReader.$anonfun$load$3(DataFrameReader.scala:315)
目标ADLS存储账户已配置防火墙,第三方供应商要求使用无专用端点的原生ADLS存储存放HR数据,且不允许匿名访问。ADLS日志显示「Azure Synapse Analytics ... blocked」,客户端IP为XXX.XXX.XXX.XXX。目前无法直接获取Synapse托管VNet的IP,但可通过链接服务查询Synapse工作区内的Parquet文件,当前使用的访问代码如下:
filename = 'fact_payroll_timecard/*.parquet' data_path = 'abfss://%s@%s.dfs.core.windows.net/%s/%s' % (raw_container_name, raw_account_name, rawpath,filename) dfpt= spark.read.parquet(data_path)
当前配置
- IAM权限:已为Synapse托管服务标识和开发人员分配Storage Blob Data Contributor角色
- ADLS防火墙配置:允许访问的资源实例为
Microsoft.Synapse/workspace - 已勾选「允许受信任服务列表中的Azure服务访问此存储账户」
临时可行但非长期的方案
- 临时关闭ADLS的IP地址过滤规则,可正常返回数据
- 将ADLS日志中获取的
CallerIpAddress添加到防火墙IP白名单,也能生效(需先开启Blob存储诊断设置,通过StorageBlobLogs | where TimeGenerated > ago(3d)查询IP),但该IP会动态变动,无法作为长期解决方案
长期解决方案
1. 精确配置ADLS的资源实例例外
在ADLS存储账户的防火墙设置中,将「资源实例」从泛型的Microsoft.Synapse/workspace修改为你的Synapse工作区的完整资源ID,格式为:/subscriptions/<你的订阅ID>/resourceGroups/<资源组名称>/providers/Microsoft.Synapse/workspaces/<Synapse工作区名称>
此配置可确保只有你的特定Synapse工作区能通过受信任服务规则访问ADLS,避免泛型规则导致的权限匹配问题。
2. 通过Synapse链接服务访问
利用已有的链接服务机制访问外部ADLS,修改代码如下:
# 替换为你的链接服务名称和目标文件路径 dfpt = spark.read.format("parquet") \ .option("linkedService", "<ADLS链接服务名称>") \ .load("<容器路径>/fact_payroll_timecard/*.parquet")
链接服务的流量通过Azure内部通道传递,可绕过公共IP防火墙的限制,同时继承链接服务的认证配置(如托管标识),稳定性更高。
3. 配置Synapse托管VNet出站规则(适用于启用Managed VNet的工作区)
在Synapse工作区的「网络设置」中,添加出站数据防火墙规则,允许访问目标ADLS存储账户的公共端点。此配置会管控Synapse托管VNet的出站流量,确保访问请求的合法性,无需依赖动态变动的公共IP。
4. 评估专用链接方案(若第三方可接受)
如果第三方能接受专用端点配置,可为ADLS存储账户创建专用端点,并将其集成到Synapse托管虚拟网络的专用链接中。此方案让流量完全在Azure私有网络内传递,彻底消除IP变动带来的问题,同时提升数据传输的安全性。
内容的提问来源于stack exchange,提问作者Tim H.

