如何在Azure DevOps的Azure CLI任务中用AzCopy复制Blob最新备份文件至另一账户
在Azure DevOps流水线中用AzCopy复制存储账户内的最新备份文件
核心思路
先通过Azure CLI命令筛选出备份文件夹内的最新Blob,再用AzCopy将该Blob复制到目标存储账户。以下是具体实现步骤:
1. 配置Azure CLI任务基础信息
在Azure DevOps流水线中添加Azure CLI任务,选择对应的Azure订阅,设置脚本类型为Bash或PowerShell(按需选择)。
2. 脚本实现(Bash版本)
# 替换为你的实际资源信息 SOURCE_STORAGE_ACCOUNT="your-source-storage-account" SOURCE_CONTAINER="your-source-container" BACKUP_FOLDER="backup/folder/path/" # 注意末尾斜杠,确保匹配文件夹下的所有文件 TARGET_STORAGE_ACCOUNT="your-target-storage-account" TARGET_CONTAINER="your-target-container" TARGET_FOLDER="target/backup/path/" # 获取备份文件夹内的最新Blob(排除文件夹类型,按最后修改时间倒序取第一个) LATEST_BLOB=$(az storage blob list \ --account-name $SOURCE_STORAGE_ACCOUNT \ --container-name $SOURCE_CONTAINER \ --prefix $BACKUP_FOLDER \ --query "[?properties.contentType!='application/x-directory'] | sort_by(@, &properties.lastModified)[-1].name" \ --output tsv) # 校验是否获取到有效Blob if [ -z "$LATEST_BLOB" ]; then echo "Error: 未在备份文件夹中找到有效备份文件" exit 1 fi # 使用AzCopy复制最新Blob到目标存储账户 az copy copy \ "https://$SOURCE_STORAGE_ACCOUNT.blob.core.windows.net/$SOURCE_CONTAINER/$LATEST_BLOB" \ "https://$TARGET_STORAGE_ACCOUNT.blob.core.windows.net/$TARGET_CONTAINER/$TARGET_FOLDER$(basename $LATEST_BLOB)" \ --recursive=false
3. 脚本实现(PowerShell版本)
# 替换为你的实际资源信息 $sourceStorageAccount = "your-source-storage-account" $sourceContainer = "your-source-container" $backupFolder = "backup/folder/path/" $targetStorageAccount = "your-target-storage-account" $targetContainer = "your-target-container" $targetFolder = "target/backup/path/" # 获取备份文件夹内的最新Blob $latestBlob = az storage blob list ` --account-name $sourceStorageAccount ` --container-name $sourceContainer ` --prefix $backupFolder ` --query "[?properties.contentType!='application/x-directory'] | sort_by(@, &properties.lastModified)[-1].name" ` --output tsv # 校验是否获取到有效Blob if (-not $latestBlob) { Write-Error "未在备份文件夹中找到有效备份文件" exit 1 } # 使用AzCopy复制最新Blob az copy copy ` "https://$sourceStorageAccount.blob.core.windows.net/$sourceContainer/$latestBlob" ` "https://$targetStorageAccount.blob.core.windows.net/$targetContainer/$targetFolder$(Split-Path $latestBlob -Leaf)" ` --recursive:$false
关键细节说明
- 过滤文件夹:
?properties.contentType!='application/x-directory'用于排除备份文件夹下的子目录,只保留实际备份文件 - 排序逻辑:
sort_by(@, &properties.lastModified)[-1]按Blob的最后修改时间倒序排序,取最后一个即为最新文件;如果备份文件的生成时间更准确,可替换为properties.creationTime - 文件名匹配:如果备份文件有特定后缀(如
.bak、.zip),可在query中添加过滤条件,例如:[?properties.contentType!='application/x-directory' && contains(name, '.bak')] - 权限验证:Azure CLI任务使用服务主体授权时,需确保服务主体拥有源存储账户的Storage Blob Data Reader权限,以及目标存储账户的Storage Blob Data Contributor权限
内容的提问来源于stack exchange,提问作者Elliot
相关产品推荐
相关产品推荐

