クイックスタート: Go 用 Azure Blob Storage クライアント モジュール
Go 用の Azure Blob Storage クライアント モジュールの使用を開始して、BLOB とコンテナーを管理します。 以下の手順に従って、パッケージをインストールし、基本タスクのコード例を試してみましょう。
API リファレンスのドキュメント | ライブラリのソース コード | パッケージ (pkg.go.dev)
前提条件
- Azure サブスクリプション - 無料アカウントを作成する
- Azure Storage アカウント - ストレージ アカウントの作成
- Go 1.18+
設定
このセクションでは、Go 用 Azure Blob Storage クライアント モジュールを操作するためのプロジェクトの準備について説明します。
サンプル アプリケーションのダウンロード
このクイックスタートで使うサンプル アプリケーションは、基本的な Go アプリケーションです。
アプリケーションのコピーを開発環境にダウンロードするには、git を使います。
git clone https://github.com/Azure-Samples/storage-blobs-go-quickstart
このコマンドは、ローカルの git フォルダーにリポジトリを複製します。 BLOB ストレージ用の Go サンプルを開くには、storage-quickstart.go
という名前のファイルを探します。
パッケージのインストール
ストレージ アカウント内の BLOB およびコンテナー リソースを操作するには、次のコマンドを使用して 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
Azure に対する認証と BLOB データへのアクセスの認可
Azure Blob Storage に対するアプリケーション要求は、認可されている必要があります。 DefaultAzureCredential
および Azure Identity クライアント ライブラリを使用することは、Blob Storage などのコード内の Azure サービスへのパスワードレス接続を実装するための推奨される方法です。
アカウント アクセス キーを使用して、Azure Blob Storage への要求を認可することもできます。 ただし、この方法は慎重に使用する必要があります。 開発者は、セキュリティで保護されていない場所にアクセス・キーを公開しないように注意する必要があります。 アクセス キーを持つすべてのユーザーは、ストレージ アカウントに対する要求を承認でき、実質的にすべてのデータにアクセスできます。 DefaultAzureCredential
はアカウント・キーよりも管理しやすく、セキュリティが優れており、パスワードレス認証が可能になります。 両方のオプションの例を次に示します。
DefaultAzureCredential
は、Go 用 Azure ID クライアント ライブラリによって提供される資格情報チェーン実装です。 DefaultAzureCredential
は複数の認証方法をサポートしており、実行時に使用する方法が決定されます。 このアプローチを採用すると、環境固有のコードを実装することなく、異なる環境 (ローカルと運用環境) で異なる認証方法をアプリに使用できます。
DefaultAzureCredential
が資格情報を検索する順序と場所については、Azure ID ライブラリの概要に関する記事を参照してください。
たとえば、ローカルで開発するときに、アプリから Azure CLI のサインイン資格情報を使って認証することができます。 アプリを Azure にデプロイした後は、マネージド ID を使用できます。 この環境間の切り替えでは、コードを変更する必要はありません。
Microsoft Entra ユーザー アカウントにロールを割り当てる
ローカルで開発する場合は、BLOB データにアクセスするユーザー アカウントに正しいアクセス許可があることを確認します。 BLOB データの読み取りと書き込みを行うには、ストレージ BLOB データ共同作成者が必要です。 このロールを自分に割り当てるには、ユーザー アクセス管理者ロール、または Microsoft.Authorization/roleAssignments/write アクションを含む別のロールに割り当てられている必要があります。 Azure portal、Azure CLI、または Azure PowerShell を使用して、ユーザーに Azure RBAC ロールを割り当てることができます。 ロールの割り当てに使用できるスコープの詳細は、スコープの概要ページでご覧いただけます。
このシナリオでは、最小限の特権の原則に従って、ストレージ アカウントに限定したアクセス許可をユーザー アカウントに割り当てます。 この方法を使って、ユーザーに必要最小限のアクセス許可のみを与え、より安全な運用環境を作成します。
次の例では、ストレージ BLOB データ共同作成者ロールを自分のユーザー アカウントに割り当てます。これにより、そのストレージ アカウント内の BLOB データに対する読み取りと書き込みの両方のアクセス権が付与されます。
重要
ほとんどの場合、ロールの割り当てが Azure に反映されるまでの時間は 1 分から 2 分ですが、まれに 8 分程度までかかる場合があります。 初めてコードを実行したときに認証エラーを受け取る場合は、しばらく待ってから再試行してください。
Azure portal で、メインの検索バーまたは左側のナビゲーションを使ってストレージ アカウントを見つけます。
ストレージ アカウントの概要ページで、左側のメニューから [アクセス制御 (IAM)] を選びます。
[アクセス制御 (IAM)] ページで、[ロールの割り当て] タブを選びます。
上部のメニューから [+ 追加] を選択し、次に結果のドロップダウン メニューから [ロールの割り当ての追加] を選択します。
検索ボックスを使って、結果を目的のロールに絞り込みます。 この例では、ストレージ BLOB データ共同作成者を検索し、一致する結果を選び、[次へ] を選びます。
[アクセスの割り当て先] で、[ユーザー、グループ、またはサービス プリンシパル] を選び、[+ メンバーの選択] を選びます。
ダイアログで、自分の Microsoft Entra ユーザー名 (通常は user@domain メール アドレス) を検索し、ダイアログの下部にある [選択] を選びます。
[レビューと割り当て] を選んで最終ページに移動し、もう一度 [レビューと割り当て] を行ってプロセスを完了します。
DefaultAzureCredential を使用して Azure にサインインしてアプリ コードを接続する
次の手順を使用して、ストレージ アカウント内のデータへのアクセスを認可できます。
必ず、ストレージ アカウントにロールを割り当てたときと同じ Microsoft Entra アカウントを使って認証を受けてください。 次の例は、Azure CLI を使用して認証する方法を示しています。
az login
Go アプリケーションで
DefaultAzureCredential
を使用するには、次のコマンドを使用して azidentity モジュールをインストールします。go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
Azure で実行されるアプリケーションに対して、Azure CLI 認証は推奨されていません。 Azure にデプロイした場合は、同じコードを使用して、Azure で実行されているアプリケーションから Azure Storage への要求を認可できます。 ただし、Azure のアプリでマネージド ID を有効にし、そのマネージド ID が接続できるようにストレージ アカウントを構成する必要があります。 この Azure サービス間の接続を構成する詳細な手順については、Azure ホステッド アプリからの認証に関するチュートリアルを参照してください。
さまざまな認証方法の詳細については、「Azure SDK for Go での Azure 認証」を参照してください。
サンプルを実行する
このコード例で次のアクションが実行されます。
DefaultAzureCredential
を介したデータ アクセスが承認されるクライアント オブジェクトを作成します- ストレージ アカウントにコンテナーを作成します
- BLOB をコンテナーにアップロードします
- コンテナー内の BLOB を一覧表示します
- BLOB データをバッファーにダウンロードします
- アプリによって作成された BLOB およびコンテナー リソースを削除します
サンプルを実行する前に、storage-quickstart.go ファイルを開きます。 <storage-account-name>
は、実際の Azure Storage アカウントの名前に置き換えてください。
その後、次のコマンドを使用してアプリケーションを実行します。
go run storage-quickstart.go
アプリの出力は、次の例のようになります。
Azure Blob storage quick start sample
Creating a container named quickstart-sample-container
Uploading a blob named sample-blob
Listing the blobs in the container:
sample-blob
Blob contents:
Hello, world! This is a blob.
Press enter key to delete resources and exit the application.
Cleaning up.
Deleting the blob sample-blob
Deleting the container quickstart-sample-container
プロンプトで Enter キーを押すと、アプリによって作成された BLOB およびコンテナー リソースがサンプル プログラムによって削除されます。
ヒント
Azure Storage Explorer などのツールを使って、Blob Storage のファイルを表示することもできます。 Microsoft Azure Storage Explorer は無料のクロスプラットフォーム ツールであり、ストレージ アカウントの情報にアクセスできます。
サンプル コードを理解する
次に、しくみを理解するためにサンプル コードを見ていきましょう。
アクセスの認可とクライアント オブジェクトの作成
SDK を使用して Azure リソースを操作するには、まずクライアント オブジェクトを作成します。 クライアント オブジェクトを作成するために、コード サンプルでは、次の値を持つ azblob.NewClient を呼び出します。
- serviceURL - ストレージ アカウントの URL
- cred -
azidentity
モジュールを介して取得された Microsoft Entra 資格情報 - options - クライアント オプション。既定値を受け入れるには nil を渡します
次のコード例では、ストレージ アカウント内のコンテナーおよび BLOB リソースを操作するクライアント オブジェクトを作成します。
// TODO: replace <storage-account-name> with your actual storage account name
url := "https://<storage-account-name>.blob.core.windows.net/"
ctx := context.Background()
credential, err := azidentity.NewDefaultAzureCredential(nil)
handleError(err)
client, err := azblob.NewClient(url, credential, nil)
handleError(err)
コンテナーを作成する
このコード サンプルでは、ストレージ アカウントに新しいコンテナー リソースを作成します。 同じ名前のコンテナーが既に存在する場合は、ResourceExistsError
が発生します。
重要
コンテナーの名前は小文字にする必要があります。 コンテナーと BLOB の名前付けに関する要件の詳細については、「コンテナー、BLOB、メタデータの名前付けと参照」を参照してください。
次のコード例では、ストレージ アカウントに quickstart-sample-container という名前の新しいコンテナーを作成します。
// Create the container
containerName := "quickstart-sample-container"
fmt.Printf("Creating a container named %s\n", containerName)
_, err = client.CreateContainer(ctx, containerName, nil)
handleError(err)
コンテナーの作成の詳細と、その他のコード サンプルについては、「Go を使用して BLOB コンテナーを作成する」を参照してください。
BLOB をコンテナーにアップロードする
このコード サンプルでは、データを含むバイト配列を作成し、指定したコンテナー内の新しい BLOB リソースにバッファーとしてデータをアップロードします。
次のコード例では、UploadBuffer メソッドを使用して、指定したコンテナーに BLOB データをアップロードします。
data := []byte("\nHello, world! This is a blob.\n")
blobName := "sample-blob"
// Upload to data to blob storage
fmt.Printf("Uploading a blob named %s\n", blobName)
_, err = client.UploadBuffer(ctx, containerName, blobName, data, &azblob.UploadBufferOptions{})
handleError(err)
BLOB のアップロードの詳細と、その他のコード サンプルについては、Go を使用した BLOB のアップロードに関する記事を参照してください。
コンテナー内の BLOB を一覧表示する
コード サンプルでは、指定したコンテナー内の BLOB を一覧表示します。 この例では 、NewListBlobsFlatPager を使用します。これは、指定したマーカーから始まる BLOB のページャーを返します。 ここでは、空のマーカーを使用して最初から列挙を開始し、結果が表示されなくなるまでページングを続けます。 このメソッドは、辞書の順序で BLOB 名を返します。
次のコード例では、指定されたコンテナー内の BLOB を一覧表示します。
// List the blobs in the container
fmt.Println("Listing the blobs in the container:")
pager := client.NewListBlobsFlatPager(containerName, &azblob.ListBlobsFlatOptions{
Include: azblob.ListBlobsInclude{Snapshots: true, Versions: true},
})
for pager.More() {
resp, err := pager.NextPage(context.TODO())
handleError(err)
for _, blob := range resp.Segment.BlobItems {
fmt.Println(*blob.Name)
}
}
BLOB の一覧表示の詳細と、その他のコード サンプルについては、「Go を使用して BLOB を一覧表示する」を参照してください。
BLOB をダウンロードする
このコード サンプルでは、DownloadStream メソッドを使用して BLOB をダウンロードし、データを読み取るための再試行リーダーを作成します。 読み取り中に接続に失敗すると、接続を再確立して読み取りを続行するために、再試行リーダーによって他の要求が行われます。 RetryReaderOptions 構造体を使用して、再試行リーダー オプションを指定できます。
次のコード例では、BLOB をダウンロードし、その内容をコンソールに書き込みます。
// Download the blob
get, err := client.DownloadStream(ctx, containerName, blobName, nil)
handleError(err)
downloadedData := bytes.Buffer{}
retryReader := get.NewRetryReader(ctx, &azblob.RetryReaderOptions{})
_, err = downloadedData.ReadFrom(retryReader)
handleError(err)
err = retryReader.Close()
handleError(err)
// Print the contents of the blob we created
fmt.Println("Blob contents:")
fmt.Println(downloadedData.String())
BLOB のダウンロードの詳細と、その他のコード サンプルについては、Go を使用した BLOB のダウンロードに関する記事を参照してください。
リソースをクリーンアップする
このクイックスタートでアップロードされた BLOB が不要になった場合は、DeleteBlob メソッドを使用して個々の BLOB を削除するか、DeleteContainer メソッドを使用してコンテナー全体とその内容を削除できます。
// Delete the blob
fmt.Printf("Deleting the blob " + blobName + "\n")
_, err = client.DeleteBlob(ctx, containerName, blobName, nil)
handleError(err)
// Delete the container
fmt.Printf("Deleting the container " + containerName + "\n")
_, err = client.DeleteContainer(ctx, containerName, nil)
handleError(err)
BLOB とコンテナーの削除の詳細と、その他のコード サンプルについては、Go を使用した BLOB の削除と Go を使用したコンテナーの削除に関する記事を参照してください。