Azure CLI - 如何在启用软删除和版本控制的情况下取消删除存储 Blob

Azure CLI - How to Undelete a Storage Blob with Soft-Delete and Versioning enabled

我正在使用 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 实际上是 restored/undeleted。有没有其他人以前使用 undelete 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

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

简而言之:

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

当版本控制的 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 再次激活。