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 仍显示为活动状态)。
但我找到了某种解决方法。
简而言之:
- 获取要取消删除的 blob 的(最新)versionId
- 获取 blob URI 并将 versionId 和 SAS 令牌作为查询参数添加到 URI。
- 复制源 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 再次激活。
我正在使用 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 仍显示为活动状态)。
但我找到了某种解决方法。
简而言之:
- 获取要取消删除的 blob 的(最新)versionId
- 获取 blob URI 并将 versionId 和 SAS 令牌作为查询参数添加到 URI。
- 复制源 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 再次激活。