使用 Go 通过 Blob 索引标记来管理和查找数据
本文介绍如何使用适用于 Go 的 Azure 存储客户端模块通过 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 索引标记所需的权限。 要使用 Microsoft Entra ID 进行授权(建议),需有 Azure RBAC 内置角色存储 Blob 数据所有者或更高级别的角色。 若要了解详细信息,请参阅获取 Blob 标记、设置 Blob 标记或按标记查找 Blob 的授权指南。
关于 blob 索引标记
Blob 索引标记使用键值标记属性对存储帐户中的数据进行分类。 这些标记会自动索引,并作为可搜索的多维索引公开,便于你轻松查找数据。 本文介绍了如何使用 blob 索引标记来设置、获取和查找数据。
启用了分层命名空间的存储帐户不支持 Blob 索引标记。 若要详细了解 Blob 索引标记功能以及已知问题和限制,请参阅通过 Blob 索引标记管理和查找 Azure Blob 数据。
设置标记
如果代码通过以下一种机制授权访问 Blob 数据,则可以设置索引标记:
- 使用 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/write 操作分配 Azure RBAC 角色的安全主体。 存储 blob 数据所有者是包含此操作的内置角色。
- 具有访问 Blob 标记的权限(
t
权限)的共享访问签名 (SAS) - 帐户密钥
有关详细信息,请参阅设置 Blob 索引标记。
可以使用以下方法设置标记:
此方法中指定的标记将替换任何现有标记。 如果必须保留现有值,则必须下载这些值并将其包含在对此方法的调用中。 以下示例介绍如何设置标记:
func setBlobTags(client *azblob.Client, containerName string, blobName string) {
// Reference the blob as a client object
blobClient := client.ServiceClient().NewContainerClient(containerName).NewBlobClient(blobName)
// Get existing tags for the blob if they need to be preserved
resp, err := blobClient.GetTags(context.TODO(), nil)
handleError(err)
tags := make(map[string]string)
for _, v := range resp.BlobTags.BlobTagSet {
tags[*v.Key] = *v.Value
}
// Add or modify blob tags
var updated_tags = make(map[string]*string)
updated_tags["tag1"] = to.Ptr("value1")
updated_tags["tag2"] = to.Ptr("value2")
// Combine existing tags with new tags
for k, v := range updated_tags {
tags[k] = *v
}
// Set blob tags
_, err = blobClient.SetTags(context.TODO(), tags, nil)
handleError(err)
}
你可以通过调用不带标记的 SetTags
来移除所有标记,如以下示例所示:
func clearBlobTags(client *azblob.Client, containerName string, blobName string) {
// Reference the blob as a client object
blobClient := client.ServiceClient().NewContainerClient(containerName).NewBlobClient(blobName)
// Clear blob tags
_, err := blobClient.SetTags(context.TODO(), make(map[string]string), nil)
handleError(err)
}
获取标记
如果代码通过以下一种机制授权访问 Blob 数据,则可以获取索引标记:
- 使用 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags/read 操作分配 Azure RBAC 角色的安全主体。 存储 blob 数据所有者是包含此操作的内置角色。
- 具有访问 Blob 标记的权限(
t
权限)的共享访问签名 (SAS) - 帐户密钥
有关详细信息,请参阅获取和列出 Blob 索引标记。
可以使用以下方法获取标记:
以下示例演示如何检索和循环访问 Blob 的标记:
func getBlobTags(client *azblob.Client, containerName string, blobName string) {
// Reference the blob as a client object
blobClient := client.ServiceClient().NewContainerClient(containerName).NewBlobClient(blobName)
// Get the blob tags
resp, err := blobClient.GetTags(context.TODO(), nil)
handleError(err)
// Print the blob tags
for _, v := range resp.BlobTags.BlobTagSet {
fmt.Printf("Key: %v, Value: %v\n", *v.Key, *v.Value)
}
}
通过 Blob 索引标记筛选和查找数据
如果代码通过以下一种机制授权访问 Blob 数据,则可以使用索引标记来查找和筛选数据:
- 使用 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/filter/action 操作分配 Azure RBAC 角色的安全主体。 存储 blob 数据所有者是包含此操作的内置角色。
- 具有按照标记筛选 Blob 的权限(
f
权限)的共享访问签名 (SAS) - 帐户密钥
有关详细信息,请参阅使用 Blob 索引标记查找数据。
注意
不能使用索引标记来检索以前的版本。 以前版本的标记不会传递给 blob 索引引擎。 有关详细信息,请参阅条件和已知问题。
可以使用以下方法基于索引标记筛选 Blob 数据:
以下示例查找并列出了标记为图像的所有 Blob:
func findBlobsByTags(client *azblob.Client, containerName string, blobName string) {
// Reference the container as a client object
containerClient := client.ServiceClient().NewContainerClient(containerName)
// Filter blobs by tags
where := "\"Content\"='image'"
opts := container.FilterBlobsOptions{MaxResults: to.Ptr(int32(10))}
resp, err := containerClient.FilterBlobs(context.TODO(), where, &opts)
handleError(err)
// Print the blobs found
for _, blobItem := range resp.FilterBlobSegment.Blobs {
fmt.Printf("Blob name: %v\n", *blobItem.Name)
}
}
注意
本指南中的代码示例旨在帮助你开始使用 Azure Blob 存储和 Go。 你应该修改错误处理和 Context
值以满足应用程序的需求。
资源
若要详细了解如何使用适用于 Go 的 Azure Blob 存储客户端库通过索引标记来管理和查找数据,请参阅以下资源。
代码示例
- 查看本文中的代码示例 (GitHub)
REST API 操作
Azure SDK for Go 包含基于 Azure REST API 而生成的库,从而允许你通过熟悉的 Go 范式与 REST API 操作进行交互。 用于管理和使用 Blob 索引标记的客户端库方法使用以下 REST API 操作:
- 获取 Blob 标记 (REST API)
- 设置 Blob 标记 (REST API)
- 按标记查找 Blob (REST API)