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

如何在不同存储账户间复制指定版本的Azure Blob?

跨Azure存储账户复制指定版本Blob的实现方案

报错原因说明

报错Either source is not a blob or destination is not a local folder属于Azcopy的设计限制:--list-of-versions参数仅支持源为Blob、目标为本地文件夹的下载场景,不支持跨存储账户的Blob到Blob复制。

可行实现方案

  • 方案1:单版本直接复制(无需本地中转)

    直接在源Blob的访问URL后拼接versionid参数指定对应版本,即可直接跨账户复制,无需下载到本地。
    前置要求:源和目标的Blob访问URL都需要携带权限足够的SAS令牌(源需要读权限,目标需要写/创建Blob权限)。
    命令示例:

    azcopy copy "https://sarahnotes.blob.core.windows.net/quicknotes/music.txt?<源存储SAS令牌>&versionid=<待复制的版本ID>" "https://<目标存储账户名>.blob.core.windows.net/<目标容器名>/music.txt?<目标存储SAS令牌>"
    
  • 方案2:批量复制多版本

    如果需要复制versions.txt里的多个版本,可以写简单脚本循环调用上述单版本复制命令即可,PowerShell示例如下:

    # 读取版本列表
    $versionList = Get-Content "./versions.txt"
    # 配置基础参数
    $sourceSas = "<源存储账户的SAS令牌>"
    $destSas = "<目标存储账户的SAS令牌>"
    $sourceBlobBaseUrl = "https://sarahnotes.blob.core.windows.net/quicknotes/music.txt"
    $destBlobBaseUrl = "https://<目标存储账户名>.blob.core.windows.net/<目标容器名>/music"
    
    foreach($versionId in $versionList) {
        # 拼接带版本号的源URL
        $sourceFullUrl = "$sourceBlobBaseUrl?$sourceSas&versionid=$versionId"
        # 目标URL可自定义命名,比如加版本号后缀避免覆盖
        $destFullUrl = "$destBlobBaseUrl_$versionId.txt?$destSas"
        # 执行复制
        azcopy copy $sourceFullUrl $destFullUrl
    }
    
  • 方案3:使用Azure CLI原生命令复制

    也可以用Azure官方CLI的复制命令实现,效果和Azcopy一致,示例如下:

    az storage blob copy start --source-uri "https://sarahnotes.blob.core.windows.net/quicknotes/music.txt?versionid=<待复制版本ID>&<源SAS令牌>" --destination-container <目标容器名> --destination-blob music.txt --account-name <目标存储账户名> --sas-token "<目标存储SAS令牌>"
    

注意事项

  • 源和目标存储账户如果开启了网络防火墙,需要将运行复制命令的设备IP加入允许列表,或使用私有端点访问存储账户。
  • 如果需要保留目标存储账户的Blob版本历史,需要提前开启目标存储账户的Blob版本控制功能。
  • SAS令牌的有效期需要覆盖整个复制周期,避免中途权限失效导致复制失败。

内容的提问来源于stack exchange,提问作者Sashin Sahasra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:39:00