You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Python SDK跨存储账户复制Blob时报SAS认证错误求助

错误原因
  • 变量被意外覆盖:你已经在代码注释中标记了核心问题,后续重新声明的source_blob将原本指向存储账户A的源Blob客户端覆盖为指向存储账户B的客户端,导致复制操作的源地址实际指向B中不存在的资源,直接触发CannotVerifyCopySource错误。
  • 源文件名配置不匹配:存储账户A的newblob容器内实际文件名为newfile.txt,但代码中定义的blob_name为lastfile.txt,无法定位到有效的源文件。
  • 目标客户端调用错误:创建目标Blob时使用的是源存储的客户端client,而非目标存储的客户端target_client,写入逻辑完全颠倒。
  • 目标SAS权限配置错误:目标存储的SAS仅配置了读、列表权限,缺少写入权限,无法完成数据写入操作。
  • 目标容器未预先创建:存储账户B初始不存在newblob容器,未提前创建容器会触发资源不存在错误。
修复后的代码
from azure.storage.blob import BlobClient, BlobServiceClient
from azure.storage.blob import ResourceTypes, AccountSasPermissions
from azure.storage.blob import generate_account_sas    
from datetime import *


# 源存储账户A配置
source_connection_string = 'connection.string' # 源容器连接字符串
source_account_key = 'key' # 源存储账户密钥
source_container_name = 'newblob' # 待复制Blob所在容器名称
source_blob_name = 'newfile.txt' # 待复制Blob名称,与实际文件名匹配

# 目标存储账户B配置
target_connection_string = 'connection-string'
target_account_key = 'key'
target_container_name = 'newblob' # 目标容器名称
target_blob_name = 'newfile.txt' # 目标文件名称

# 初始化源客户端
source_client = BlobServiceClient.from_connection_string(source_connection_string) 
# 初始化目标客户端
target_client = BlobServiceClient.from_connection_string(target_connection_string)

# 预先创建目标容器(如不存在)
if not target_client.get_container_client(target_container_name).exists():
    target_client.create_container(target_container_name)

# 生成源存储账户SAS令牌
source_sas_token = generate_account_sas(
    account_name = source_client.account_name,
    account_key = source_account_key, 
    resource_types = ResourceTypes(object=True, container=True),
    permission= AccountSasPermissions(read=True,list=True),
    expiry = datetime.utcnow() + timedelta(hours=4)
)

# 初始化源Blob客户端
source_blob = BlobClient(
    source_client.url,
    container_name = source_container_name, 
    blob_name = source_blob_name,
    credential = source_sas_token
)

# 生成目标存储账户SAS令牌,增加写入权限
target_sas_token = generate_account_sas(
    account_name = target_client.account_name,
    account_key = target_account_key, 
    resource_types = ResourceTypes(object=True, container=True),
    permission= AccountSasPermissions(read=True,list=True,write=True),
    expiry = datetime.utcnow() + timedelta(hours=4)
)

# 初始化目标Blob客户端,使用目标存储服务端
target_blob = BlobClient(
    target_client.url,
    container_name = target_container_name, 
    blob_name = target_blob_name,
    credential = target_sas_token
)

# 启动跨账户复制
target_blob.start_copy_from_url(source_blob.url)

内容的提问来源于stack exchange,提问作者Nayden Van

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:00:00