Go を使用してブロック BLOB をアップロードする

この記事では、Go 用の Azure Storage クライアント モジュールを使用して BLOB をアップロードする方法について説明します。 ファイル パス、ストリーム、バイナリ オブジェクト、またはテキスト文字列からブロック BLOB にデータをアップロードできます。 インデックス タグを使用して BLOB をアップロードすることもできます。

前提条件

環境を設定する

既存のプロジェクトがない場合、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 データ共同作成者以上が必要です。 詳細については、「Put BLOB (REST API)」と「Put Block (REST API)」の認可ガイダンスを参照してください。

ブロック BLOB にデータをアップロードする

BLOB をアップロードするには、クライアント オブジェクトから次のいずれかのメソッドを呼び出します。

アップロードを実行するために、クライアント ライブラリは Put BLOB、または Put Block 呼び出しとその後に続く Put Block List のどちらかを使用する可能性があります。 この動作は、オブジェクトの合計サイズと、データ転送オプションの設定方法によって異なります。

ローカル ファイル パスからブロック BLOB をアップロードする

次の例では、ローカル ファイルをブロック BLOB にアップロードします。

func uploadBlobFile(client *azblob.Client, containerName string, blobName string) {
    // Open the file for reading
    file, err := os.OpenFile("path/to/sample/file", os.O_RDONLY, 0)
    handleError(err)

    defer file.Close()

    // Upload the file to the specified container with the specified blob name
    _, err = client.UploadFile(context.TODO(), containerName, blobName, file, nil)
    handleError(err)
}

ストリームからブロック BLOB をアップロードする

次の例では、Reader インスタンスを作成し、バイト ストリームであるかのように文字列から読み取ります。 その後、ストリームはブロック BLOB にアップロードされます。

func uploadBlobStream(client *azblob.Client, containerName string, blobName string) {
    data := "Hello, world!"
    blobContentReader := strings.NewReader(data)

    // Upload the file to the specified container with the specified blob name
    _, err := client.UploadStream(context.TODO(), containerName, blobName, blobContentReader, nil)
    handleError(err)
}

ブロック BLOB にバイナリ データをアップロードする

次の例では、ブロック BLOB にバイナリ データをアップロードします。

func uploadBlobBuffer(client *azblob.Client, containerName string, blobName string) {
    // Create a buffer with the content of the file to upload
    data := []byte("Hello, world!")

    // Upload the data to a block blob
    _, err := client.UploadBuffer(context.TODO(), containerName, blobName, data, nil)
    handleError(err)
}

インデックス タグ付きのブロック BLOB をアップロードする

次の例では、インデックス タグを含むブロック BLOB をアップロードします。

func uploadBlobWithIndexTags(client *azblob.Client, containerName string, blobName string) {
    // Create a buffer with the content of the file to upload
    data := []byte("Hello, world!")

    // Upload the data to a block blob with index tags
    _, err := client.UploadBuffer(context.TODO(), containerName, blobName, data, &azblob.UploadBufferOptions{
        Tags: map[string]string{
            "key1": "value1",
            "key2": "value2",
        },
    })
    handleError(err)
}

構成オプションを使用したブロック BLOB のアップロード

BLOB をアップロードするときに、クライアント ライブラリの構成オプションを定義できます。 これらのオプションは、パフォーマンスを向上させたり、信頼性を高めたり、コストを最適化したりするために調整できます。 次のコード例は、アップロード操作の構成オプションを定義する方法を示しています。

アップロード時のデータ転送オプションの指定

BLOB をアップロードするときに構成オプションを設定して、パフォーマンスを最適化できます。 アップロード操作には、次の構成オプションを使用できます。

  • BlockSize: ブロック BLOB をアップロードするときの各ブロックのサイズ。 既定値は 4 MB です。
  • Concurrency: アップロード中に使用する並列接続の最大数。 既定値は 5 です。

これらの構成オプションは、次の方法を使用してアップロードするときに使用できます:

Upload メソッドは、これらのオプションをサポートせず、1 つの要求でデータをアップロードします。

Blob Storage での転送サイズの制限の詳細については、「Blob Storage のスケール ターゲット」を参照してください。

次のコード例は、UploadFileOptions を使用してデータ転送オプションを指定する方法を示しています。 このサンプルで提供される値は、推奨を意図したものではありません。 これらの値を適切にチューニングするには、アプリの特定のニーズを考慮する必要があります。

func uploadBlobWithTransferOptions(client *azblob.Client, containerName string, blobName string) {
    // Open the file for reading
    file, err := os.OpenFile("path/to/sample/file", os.O_RDONLY, 0)
    handleError(err)

    defer file.Close()

    // Upload the data to a block blob with transfer options
    _, err = client.UploadFile(context.TODO(), containerName, blobName, file,
        &azblob.UploadFileOptions{
            BlockSize:   int64(4 * 1024 * 1024), // 4 MiB
            Concurrency: uint16(2),
        })
    handleError(err)
}

データ転送オプションのチューニングについて詳しくは、「Go を使用したアップロードとダウンロードのパフォーマンス チューニング」をご参照ください。

Note

このガイドのコード サンプルは、Azure Blob Storage と Go の使用を開始するのに役立つことを目的としています。 エラー処理と Context の値は、アプリケーションのニーズに合わせて変更する必要があります。

リソース

Go 用 Azure Blob Storage クライアント モジュールを使用した BLOB のアップロードの詳細については、次のリソースを参照してください。

コード サンプル

REST API の操作

Azure SDK for Go には Azure REST API に基づき構築されたライブラリが含まれるため、使い慣れた Go パラダイムを通じて REST API 操作を実施できます。 BLOB をアップロードするためのクライアント ライブラリ メソッドでは、次の REST API 操作を使用します。

クライアント モジュール リソース

関連項目

  • この記事は、Go の Blob Storage 開発者ガイドの一部です。 詳細については、「Go アプリのビルド」にある開発者ガイドの記事の完全な一覧を参照してください。