Go を使用して BLOB を一覧表示する
この記事では、Go 用の Azure Storage クライアント モジュールを使用して BLOB を一覧表示する方法について説明します。
前提条件
- Azure サブスクリプション - 無料アカウントを作成する
- Azure Storage アカウント - ストレージ アカウントの作成
- Go 1.18+
環境を設定する
既存のプロジェクトがない場合、Go 用 Azure Blob Storage クライアント モジュールを操作するためのプロジェクトを設定する方法についてこのセクションで説明します。 この手順には、モジュールのインストール、import
パスの追加、認可されているクライアント オブジェクトの作成が含まれます。 詳細については、Azure Blob Storage および 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 Storage に接続するには、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 組み込みロールの Storage BLOB データ閲覧者以上が必要です。 詳細については、List Blobs (REST API) の「認可」のガイダンスを参照してください。
BLOB の一覧表示オプションについて
BLOB をコードから一覧表示する際に、Azure Storage から結果を返す方法を管理するための多くのオプションを指定できます。 各結果セットで返す結果の数を指定し、後続のセットを取得できます。 名前がその文字または文字列から始まる BLOB を返すようにプレフィックスを指定できます。 また、フラット リスト構造 (階層) で BLOB を一覧表示できます。 階層リストでは、フォルダーに整理されたかのように BLOB が返されます。
フラット リストを使用してコンテナー内の BLOB を一覧表示するには、次のメソッドを呼び出します。
階層リストを使用してコンテナー内の BLOB を一覧表示するには、コンテナー クライアント オブジェクトから次のメソッドを呼び出します。
返される結果の数を管理する
既定では、一覧表示操作では一度に最大 5000 の結果が返されます。 より小さい結果のセットが返されるようにするには、ListBlobsFlatOptions または ListBlobsHierarchyOptions の MaxResults
フィールドに 0 以外の値を指定します。
プレフィックスを使用して結果をフィルター処理する
返される BLOB の一覧をフィルター処理するには、ListBlobsFlatOptions または ListBlobsHierarchyOptions で Prefix
フィールドの文字列または文字を指定します。 プレフィックス文字列には、1 つ以上の文字を含めることができます。 Azure Storage は、名前がそのプレフィックスで始まる BLOB だけを返します。
BLOB メタデータまたはその他の情報を含める
結果に BLOB メタデータを含めるには、Metadata
フィールドを ListBlobsInclude の一部として true
に設定します。 Azure Storage では、返される各 BLOB にメタデータが含まれているため、BLOB のメタデータを個別にフェッチする必要はありません。
結果にスナップショット、バージョン、BLOB インデックス タグ、およびその他の情報を含める追加のオプションについては、ListBlobsInclude を参照してください。
フラットな一覧表示と階層的な一覧表示
Azure Storage の BLOB は、(従来のファイル システムのような) 階層的なパラダイムではなく、フラットなパラダイムで組織化されます。 ただし、フォルダー構造を模倣するために、BLOB を仮想ディレクトリに組織化することができます。 仮想ディレクトリは BLOB 名の一部を形成し、区切り文字によって示されます。
BLOB を仮想ディレクトリに組織化するには、BLOB 名に区切り文字を使用します。 既定の区切り文字はスラッシュ (/) ですが、区切り文字として任意の文字を指定できます。
区切り記号を使用して BLOB に名前を付ける場合、BLOB を階層的に一覧表示することを選択できます。 階層的な一覧表示操作の場合、Azure Storage は、親オブジェクトの下にあるすべての仮想ディレクトリと BLOB を返します。 従来のファイル システムをプログラムで走査するのと同じような方法で、一覧表示操作を再帰的に呼び出して階層を走査することができます。
Note
BLOB のスナップショットは、階層的な一覧表示操作では一覧表示できません。
フラットな一覧表示を使用する
既定では、一覧表示操作はフラットな一覧表示で BLOB を返します。 フラットな一覧表示では、BLOB は仮想ディレクトリ別に整理されません。
次の例では、フラットな一覧表示を使用して、指定されたコンテナー内の BLOB を一覧表示します。 次の例では、BLOB スナップショットおよび BLOB バージョンが存在する場合は、それが表示されます:
func listBlobsFlat(client *azblob.Client, containerName string) {
// List the blobs in the container
pager := client.NewListBlobsFlatPager(containerName, &azblob.ListBlobsFlatOptions{
Include: azblob.ListBlobsInclude{Snapshots: true, Versions: true},
})
fmt.Println("List blobs flat:")
for pager.More() {
resp, err := pager.NextPage(context.TODO())
handleError(err)
for _, blob := range resp.Segment.BlobItems {
fmt.Println(*blob.Name)
}
}
}
サンプル出力は次のようになります。
List blobs flat:
file4.txt
folderA/file1.txt
folderA/file2.txt
folderA/folderB/file3.txt
次の例は、特定のプレフィックスで始まるコンテナー内の BLOB を一覧表示します。
func listBlobsFlatOptions(client *azblob.Client, containerName string, prefix string) {
// List the blobs in the container with a prefix
pager := client.NewListBlobsFlatPager(containerName, &azblob.ListBlobsFlatOptions{
Prefix: to.Ptr(prefix),
})
fmt.Println("List blobs with prefix:")
for pager.More() {
resp, err := pager.NextPage(context.TODO())
handleError(err)
for _, blob := range resp.Segment.BlobItems {
fmt.Println(*blob.Name)
}
}
}
"sample" のプレフィックス文字列を渡す場合、出力は次のようになります。
List blobs with prefix:
sample-blob1.txt
sample-blob2.txt
sample-blob3.txt
Note
次に示すサンプル出力では、フラット型名前空間を持つストレージ アカウントがあることを前提としています。 ストレージ アカウントで階層型名前空間の機能を有効にしている場合、ディレクトリは仮想ではありません。 そうではなく、具象の独立したオブジェクトです。 その結果、ディレクトリは長さが 0 の BLOB として一覧に表示されます。
階層型名前空間を使用する場合の別のリスト オプションについては、「NewListPathsPager」を参照してください。
階層的な一覧表示を使用する
一覧表示操作を階層的に呼び出すと、Azure Storage は、階層の最初のレベルに仮想ディレクトリと BLOB を返します。
BLOB を階層的に一覧表示するには、次のメソッドを使用します。
次の例では、階層リストを使用して、指定したコンテナー内の BLOB を一覧表示します。 この例では、プレフィックス パラメーターに、最初は空の文字列が設定され、コンテナー内のすべての BLOB が一覧表示されます。 次に、リスト操作を再帰的に呼び出して、仮想ディレクトリ階層を走査し、BLOB を一覧表示します。
func listBlobsHierarchy(client *azblob.Client, containerName string, prefix string) {
// Reference the container as a client object
containerClient := client.ServiceClient().NewContainerClient(containerName)
pager := containerClient.NewListBlobsHierarchyPager("/", &container.ListBlobsHierarchyOptions{
Prefix: to.Ptr(prefix),
MaxResults: to.Ptr(int32(1)), // MaxResults set to 1 for demonstration purposes
})
for pager.More() {
resp, err := pager.NextPage(context.TODO())
handleError(err)
if resp.Segment.BlobPrefixes != nil {
for _, prefix := range resp.Segment.BlobPrefixes {
fmt.Println("Virtual directory prefix:", *prefix.Name)
// Recursively list blobs in the prefix
listBlobsHierarchy(client, containerName, *prefix.Name)
}
}
for _, blob := range resp.Segment.BlobItems {
fmt.Println("Blob:", *blob.Name)
}
}
}
サンプル出力は次のようになります。
Virtual directory prefix: folderA/
Blob: folderA/file1.txt
Blob: folderA/file2.txt
Blob: folderA/file3.txt
Virtual directory prefix: folderA/folderB/
Blob: folderA/folderB/file1.txt
Blob: folderA/folderB/file2.txt
Blob: folderA/folderB/file3.txt
Note
このガイドのコード サンプルは、Azure Blob Storage と Go の使用を開始するのに役立つことを目的としています。 エラー処理と Context
の値は、アプリケーションのニーズに合わせて変更する必要があります。
リソース
Go 用 Azure Blob Storage クライアント モジュールを使用して BLOB を一覧表示する方法の詳細については、次のリソースを参照してください。
コード サンプル
- この記事のコード サンプルを表示する (GitHub)
REST API の操作
Azure SDK for Go には Azure REST API に基づき構築されたライブラリが含まれるため、使い慣れた Go パラダイムを通じて REST API 操作を実施できます。 BLOB を一覧表示するためのクライアント ライブラリ メソッドは、次の REST API 操作を使用します。
- List Blobs (REST API)