Azure跨存储账户复制Blob遇CannotVerifyCopySource错误求解决
解决Azure Blob跨容器复制时的CannotVerifyCopySource错误
你的错误源于使用start_copy_from_url时默认采用匿名访问源Blob,但源存储账户已禁用公共访问。无需修改公共访问设置,可通过以下两种方案解决:
方案一:源与目标属于同一存储账户
直接利用存储账户的连接字符串授权访问源Blob,无需额外生成SAS:
from azure.storage.blob import BlobServiceClient # 初始化存储账户客户端 blob_service_client = BlobServiceClient.from_connection_string(connectionstring) # 获取源、目标Blob客户端 src_blob_client = blob_service_client.get_blob_client(src_container, blob_name) dst_blob_client = blob_service_client.get_blob_client(dst_container, b_name) # 启动复制操作 copy_result = dst_blob_client.start_copy_from_url(src_blob_client.url)
方案二:源与目标属于不同存储账户
给源Blob生成带只读权限的SAS(共享访问签名)URL,用该URL作为复制源。SAS是临时授权方式,不会开启全局公共访问:
from azure.storage.blob import BlobServiceClient, generate_blob_sas, BlobSasPermissions from datetime import datetime, timedelta # 初始化源存储账户客户端 src_connection_string = "你的源存储账户连接字符串" src_blob_service_client = BlobServiceClient.from_connection_string(src_connection_string) src_blob_client = src_blob_service_client.get_blob_client(src_container, blob_name) # 生成SAS令牌(设置1小时有效期,仅授予读权限) sas_token = generate_blob_sas( account_name=src_blob_service_client.account_name, container_name=src_container, blob_name=blob_name, account_key=src_blob_service_client.credential.account_key, permission=BlobSasPermissions(read=True), expiry=datetime.utcnow() + timedelta(hours=1) ) # 拼接带SAS的源Blob URL src_blob_sas_url = f"{src_blob_client.url}?{sas_token}" # 初始化目标存储账户客户端并启动复制 dst_blob_service_client = BlobServiceClient.from_connection_string(connectionstring) dst_blob_client = dst_blob_service_client.get_blob_client(dst_container, b_name) copy_result = dst_blob_client.start_copy_from_url(src_blob_sas_url)
注意事项
- 确保使用的连接字符串拥有足够权限:源侧需具备Blob读取权限,目标侧需具备Blob写入权限。
- SAS令牌的有效期可根据实际需求调整,避免过长暴露风险。
内容的提问来源于stack exchange,提问作者Deepak Kothari
相关产品推荐
相关产品推荐

