Compartir a través de

使用 Go 删除和还原 Blob

本文介绍如何使用适用于 Go 的 Azure 存储客户端模块删除 Blob,以及如何在保留期内还原软删除的 Blob。

先决条件

设置你的环境

如果没有现有项目,请查看本部分,其中介绍了如何设置项目来使用适用于 Go 的 Azure Blob 存储客户端模块。 步骤包括模块安装、添加 import 路径以及创建授权的客户端对象。 有关详细信息,请参阅 Azure Blob 存储和 Go 入门

安装模块

使用以下命令安装 azblob 模块:

go get github.com/Azure/azure-sdk-for-go/sdk/storage/azblob

若要使用 Microsoft Entra ID 进行身份验证(建议),请使用以下命令安装 azidentity 模块:

go get github.com/Azure/azure-sdk-for-go/sdk/azidentity

添加导入路径

在代码文件中添加以下导入路径:

import (
    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)

这些导入路径代表了开始之前需要满足的最低要求。 本文中的某些代码示例可能需要其他导入路径。 有关具体详细信息和示例用法,请参阅代码示例

创建客户端对象

若要将应用连接到 Blob 存储,请使用 azblob.NewClient 创建客户端对象。 以下示例演示如何使用 DefaultAzureCredential 创建客户端对象进行授权:

func getServiceClientTokenCredential(accountURL string) *azblob.Client {
    // Create a new service client with token credential
    credential, err := azidentity.NewDefaultAzureCredential(nil)
    handleError(err)

    client, err := azblob.NewClient(accountURL, credential, nil)
    handleError(err)

    return client
}

授权

授权机制必须具有删除 Blob 或还原软删除 Blob 所需的权限。 若要使用 Microsoft Entra ID 进行授权(建议),需有 Azure RBAC 内置角色“存储 Blob 数据参与者”或更高级别的角色。 要了解详细信息,请参阅删除 Blob (REST API)取消删除 Blob (REST API) 的授权指导。

删除 Blob

注意

为存储帐户启用 Blob 软删除后,无法使用客户端库方法执行永久删除。 如果使用本文中所述的方法,软删除的 Blob、Blob 版本或快照在保留期结束之前会一直保持可用,保留期结束后将被永久删除。 若要详细了解基础 REST API 操作,请参阅删除 Blob (REST API)

若要删除 Blob,请调用以下方法:

下面的示例删除 Blob:

func deleteBlob(client *azblob.Client, containerName string, blobName string) {
    // Delete the blob
    _, err := client.DeleteBlob(context.TODO(), containerName, blobName, nil)
    handleError(err)
}

如果 Blob 具有任何关联的快照,则必须删除其所有快照才能删除该 Blob。 以下示例删除一个 Blob 及其快照:

func deleteBlobWithSnapshots(client *azblob.Client, containerName string, blobName string) {
    // Delete the blob and its snapshots
    _, err := client.DeleteBlob(context.TODO(), containerName, blobName, &blob.DeleteOptions{
        DeleteSnapshots: to.Ptr(blob.DeleteSnapshotsOptionTypeInclude),
    })
    handleError(err)
}

若要删除快照而不删除 blob 本身,可以将值 DeleteSnapshotsOptionTypeOnly 传递给 DeleteSnapshots 参数。

还原已删除的 Blob

Blob 软删除会在系统中将已删除的数据保留指定的一段时间,可以在意外删除或覆盖单个 Blob 及其版本、快照和元数据时提供保护。 在保留期内,可以将 Blob 还原到它在删除时的状态。 在保留期过期后,Blob 将被永久删除。 有关 Blob 软删除的详细信息,请参阅 Blob 的软删除

可以使用 Azure 存储客户端库来还原软删除的 Blob 或快照。

还原软删除的 Blob 的方式取决于存储帐户是否启用了 Blob 版本控制。 有关 Blob 版本控制的详细信息,请参阅 Blob 版本控制。 请根据你的情况,查看以下部分之一:

禁用版本控制时还原软删除的对象

在禁用了版本控制的情况下,若要还原删除的 Blob,请调用以下任一方法:

此方法还原软删除的 Blob 以及任何关联的软删除快照的内容和元数据。 对未删除的 Blob 调用此方法不会起作用。

func restoreDeletedBlob(client *azblob.Client, containerName string, blobName string) {
    // Reference the blob as a client object
    blobClient := client.ServiceClient().NewContainerClient(containerName).NewBlobClient(blobName)

    // Restore the deleted blob
    _, err := blobClient.Undelete(context.TODO(), &blob.UndeleteOptions{})
    handleError(err)
}

启用版本控制时还原软删除的对象

如果将存储帐户配置为启用 blob 版本控制,则删除 blob 会导致 blob 的当前版本成为以前的版本。 若要在启用了版本控制的情况下还原软删除的 Blob,请将前一个版本复制到基础 Blob。 可使用以下方法:

下面的代码示例标识已删除的 Blob 的版本,并通过将其复制到基本 Blob 来还原该版本:

func restoreDeletedBlobVersion(client *azblob.Client, containerName string, blobName string, versionID string) {
    // Reference the blob as a client object
    baseBlobClient := client.ServiceClient().NewContainerClient(containerName).NewBlobClient(blobName)

    blobVersionClient, err := baseBlobClient.WithVersionID(versionID)
    handleError(err)

    // Restore the blob version by copying it to the base blob
    _, err = baseBlobClient.StartCopyFromURL(context.TODO(), blobVersionClient.URL(), nil)
    handleError(err)
}

注意

本指南中的代码示例旨在帮助你开始使用 Azure Blob 存储和 Go。 你应该修改错误处理和 Context 值以满足应用程序的需求。

资源

若要详细了解如何使用适用于 Go 的 Azure Blob 存储客户端模块删除 Blob 和还原已删除的 Blob,请参阅以下资源。

代码示例

REST API 操作

Azure SDK for Go 包含基于 Azure REST API 而生成的库,允许你通过熟悉的 Go 范式来与 REST API 操作进行交互。 用于删除 Blob 和还原已删除 Blob 的客户端库方法使用以下 REST API 操作:

客户端模块资源

另请参阅

  • 本文是适用于 Go 的 Blob 存储开发人员指南的一部分。 若要了解详细信息,请参阅构建 Go 应用中的完整开发人员指南文章列表。