如何在不同存储账户间复制指定版本的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
相关产品推荐
相关产品推荐

