使用本地服务器与AzCopy跨ADLS存储账户传输文件报错如何处理
报错产生原因
- 核心原因是执行的AzCopy命令仅为源ADLS Gen2存储容器配置了SAS授权凭证,未给目标存储容器提供合法的写入授权,AzCopy没有权限将数据写入目标存储账户。
- 额外可能的触发原因:
- 提供的SAS令牌权限不足:源端SAS缺少读取/列表权限,或目标端SAS缺少写入/列表权限
- SAS令牌已过期,或允许访问的IP范围未覆盖当前运行AzCopy的服务器公网IP
- 存储账户的防火墙规则拦截了当前服务器的访问请求
解决方案
方案1:使用SAS令牌授权(适合一次性临时传输场景)
- 分别为源、目标ADLS Gen2容器生成合法SAS令牌:
- 源端SAS勾选读取、列出权限
- 目标端SAS勾选写入、列出权限(如果需要覆盖目标端已有同名文件,额外勾选删除权限)
- 配置SAS有效期覆盖整个传输周期,允许的IP范围添加当前运行AzCopy的服务器公网IP
- 调整执行命令,给目标端URL也拼接上生成的SAS令牌:
azcopy cp 'https://mysourceaccount.dfs.core.windows.net/mycontainer?<源端SAS字符串>' 'https://mydestinationaccount.dfs.core.windows.net/mycontainer?<目标端SAS字符串>' --recursive
方案2:使用Azure AD身份授权(适合长期、高频传输场景)
- 首先在运行AzCopy的服务器上执行身份登录:
# 单租户场景直接执行 azcopy login # 跨租户场景需要指定租户ID azcopy login --tenant-id <对应Azure租户ID>
- 为登录使用的Azure AD账号分配对应权限:
- 源存储账户范围分配存储Blob数据读者角色
- 目标存储账户范围分配存储Blob数据参与者角色
- 直接执行不带SAS令牌的传输命令即可:
azcopy cp 'https://mysourceaccount.dfs.core.windows.net/mycontainer' 'https://mydestinationaccount.dfs.core.windows.net/mycontainer' --recursive
额外验证步骤
如果配置后仍报错,可依次排查:
- 确认两个存储账户的防火墙规则已放通当前服务器的公网IP,或已开启「允许受信任的Azure服务访问该存储账户」配置
- 确认SAS令牌未被意外转义,在命令行中如果用双引号包裹URL注意不要让Shell解析SAS中的特殊字符(建议优先用单引号包裹URL)
内容的提问来源于stack exchange,提问作者nYuker_98 D
相关产品推荐
相关产品推荐

