首页 > 解决方案 > Azure CLI - 如何在启用软删除和版本控制的情况下取消删除存储 Blob

问题描述

我正在使用 Azure CLI 将 blob 添加到我的存储帐户。通过 Azure CLI,我可以成功地软删除 blob;我可以通过在 Azure 门户上查看软删除的 blob 来确认这一点。我想恢复通过 Azure CLI 再次删除的 blob,但我遇到了问题。我试图使用该az storage blob undelete命令来执行此操作。据报道它是成功的 - 我通过添加--verbose标志并查看从 CLI 触发的 API 调用返回的 200 HTTP 状态来知道这一点。回应是:

{
  "undeleted": null
}

当我再次查看 Azure 门户中的 blob 列表时,没有迹象表明该 blob 实际上已恢复/取消删除。以前有没有其他人成功使用过取消删除Azure CLI 命令?


这是一些终端输出;希望它有助于理解我正在尝试做的事情:

PS C:\Users\admin> az storage blob list --account-name azartbackupstore01 -c backupcontainer01 -o table
Name                                                                 IsDirectory    Blob Type    Blob Tier    Length    Content Type              Last Modified              Snapshot
-------------------------------------------------------------------  -------------  -----------  -----------  --------  ------------------------  -------------------------  ----------
20/20162F8E84F43EEAAEC0DB0010545C32D8D1A0CF60284CA2E9A57884B55C2445                 BlockBlob                 47        application/octet-stream  2021-08-05T15:25:59+00:00
92/92D536261E45E93DB4A8F063A98102BF443DD7EC16B1075F7D13A1A326544035                 BlockBlob                 11458     application/octet-stream  2021-08-05T15:22:47+00:00

PS C:\Users\admin> az storage blob delete --account-name azartbackupstore01 -c backupcontainer01 --name 20/20162F8E84F43EEAAEC0DB0010545C32D8D1A0CF60284CA2E9A57884B55C2445

PS C:\Users\admin> az storage blob undelete --account-name azartbackupstore01 -c backupcontainer01 --name 20/20162F8E84F43EEAAEC0DB0010545C32D8D1A0CF60284CA2E9A57884B55C2445
{
  "undeleted": null
}

PS C:\Users\admin> az storage blob list --account-name azartbackupstore01 -c backupcontainer01 -o table
Name                                                                 IsDirectory    Blob Type    Blob Tier    Length    Content Type              Last Modified              Snapshot
-------------------------------------------------------------------  -------------  -----------  -----------  --------  ------------------------  -------------------------  ----------
92/92D536261E45E93DB4A8F063A98102BF443DD7EC16B1075F7D13A1A326544035                 BlockBlob                 11458     application/octet-stream  2021-08-05T15:22:47+00:00

标签: azureazure-devopsazure-web-app-serviceazure-powershellazure-cli

解决方案


显然,当您在 blob 上启用软删除和版本控制时,会发生一些奇怪的事情(即使在 blob 显示为已删除但 blob 状态为 的 Azure 门户中,已null删除 blob 的版本仍显示为活动)。但我找到了某种解决方法。

简而言之:

  1. 获取要取消删除的 blob 的(最新)versionId
  2. 获取 blob URI 并将 versionId 和 SAS 令牌作为查询参数添加到 URI。
  3. 复制源 URI 是已删除 blob 的 blob,包括versionId(我在此处的代码中找到了此解决方案)

当一个版本化的 blob 被软删除时,它将显示以下命令:

az storage blob list --account-name azartbackupstore01 -c backupcontainer01 -o table --include v

我只--include (v)ersion在最后添加了将显示所有版本的 blob。这--include (d)eleted将不起作用,因为 blob 不知何故没有删除状态。

以下是我的做法:

$blobName="20/20162F8E84F43EEAAEC0DB0010545C32D8D1A0CF60284CA2E9A57884B55C2445"
$containerName="backupcontainer01"
$accountName="azartbackupstore01"
$sas="replace with your sas token"

# query all blobs where name equals $blobName, and reverse sort by versionId (which is the date) so most recent will be the first in the list
$versionId=az storage blob list --account-name $accountName -c $containerName --include v -o json --query "reverse(sort_by([?name=='$blobName'], &versionId))[0].versionId"
$blobUriRoot=az storage blob url --account-name $accountName -c $containerName --name $blobName
# The blobUriRoot and versionId variables are outputted with additional quotes, so these need to be replaced.
$blobUri=$($blobUriRoot + "?versionId=" + $versionId).Replace('"', "")

$blobUriWithSas = $blobUri + "&" + $sas
az storage blob copy start --account-name $accountName --destination-blob $blobName --destination-container $containerName --source-uri $blobUriWithSas 

运行上述命令后,指定的 blob 再次处于活动状态。


推荐阅读