使用Azure Python SDK遍历存储容器实现跨账户Blob批量备份
实现方案
你正在使用的azure-storage-blob原生就支持Blob容器遍历、批量拷贝能力,不需要额外引入其他库。你写的遍历代码仅存在缩进错误,导致只能读取最后一个容器的内容,修正后结合已验证的跨账户拷贝逻辑,即可实现全存储账户自动同步备份。
完整可运行代码
from azure.storage.blob import BlobClient, BlobServiceClient, ContainerClient from azure.storage.blob import ResourceTypes, AccountSasPermissions from azure.storage.blob import generate_account_sas from datetime import datetime, timedelta # ===================== 配置参数 ===================== # 源存储账户配置 source_connection_string = "源存储账户连接字符串" source_account_key = "源存储账户密钥" # 目标存储账户配置 target_connection_string = "目标存储账户连接字符串" # SAS有效期配置 sas_valid_hours = 24 # 可根据备份数据量调整,避免大文件拷贝过程中SAS过期 # ===================== 初始化客户端 ===================== # 源存储客户端 source_blob_service_client = BlobServiceClient.from_connection_string(source_connection_string) # 目标存储客户端 target_blob_service_client = BlobServiceClient.from_connection_string(target_connection_string) # 生成源账户全局SAS,不需要每个Blob单独生成 source_sas_token = generate_account_sas( account_name = source_blob_service_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=sas_valid_hours) ) # ===================== 遍历+批量拷贝 ===================== # 遍历源账户所有容器 for source_container in source_blob_service_client.list_containers(include_metadata=True): container_name = source_container['name'] print(f"正在处理容器: {container_name}") # 目标端自动创建同名容器(如果不存在) target_blob_service_client.create_container_if_not_exists(container_name) # 初始化源容器客户端 source_container_client = source_blob_service_client.get_container_client(container_name) # 遍历当前容器所有Blob for blob in source_container_client.list_blobs(): blob_name = blob.name print(f"正在拷贝Blob: {container_name}/{blob_name}") # 拼接带SAS的源Blob访问地址 source_blob_url = f"{source_blob_service_client.url}/{container_name}/{blob_name}?{source_sas_token}" # 初始化目标Blob客户端,路径和源端保持一致 target_blob_client = target_blob_service_client.get_blob_client(container=container_name, blob=blob_name) # 触发异步拷贝 target_blob_client.start_copy_from_url(source_blob_url)
注意事项
- 跨账户Blob拷贝是服务端异步操作,脚本只负责触发拷贝请求,实际拷贝时间取决于文件大小和存储账户带宽,若需要确认全部拷贝完成,可添加逻辑轮询
target_blob_client.get_blob_properties().copy.status状态判断 - 若仅需要同步增量内容,可以在触发拷贝前对比源Blob和目标Blob的最后修改时间、ETag,跳过未修改的文件减少不必要的拷贝
- 如果需要处理多个源存储账户,将上述逻辑套入源存储账户配置的循环即可
- 若遇到特殊访问层级的Blob(比如归档层),需要先解冻再触发拷贝
内容的提问来源于stack exchange,提问作者Nayden Van
相关产品推荐
相关产品推荐

