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
相关产品推荐
相关产品推荐

