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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:24:03