Azure Storage Blob SDK for Go を使ってBlobの操作を行う(接続文字列編)
最近Goに触り始めたので、アウトプットとして残してみます。 BlobuStorageから払い出される接続文字列を利用してアップロード、コンテナ内のBlob一覧表示、削除をぞれぞれサンプルコードとして残してみます。 エラーハンドリングなどは適宜追加してみてください。
前提
Go 1.17以上
Azure Storage Blob SDK for Goをインストールする
SDKインストール
クイックスタート参考にそのままインストール
go get -u github.com/Azure/azure-sdk-for-go/sdk/storage/azblob
サンプル
Upload, Delete, Listの全文コードは下記の通りです。 エラーハンドリングは要件に応じて書き換えてください。
package main import ( "context" "fmt" "os" "github.com/Azure/azure-sdk-for-go/sdk/storage/azblob" ) func Upload(ctx context.Context, cc *azblob.ContainerClient, containerName string, blobName string, fileName string) bool { blobClient, err := cc.NewBlockBlobClient(blobName) if err != nil { fmt.Print(err) return false } data, err := os.Open(fileName) defer data.Close() if err != nil { fmt.Print(err) return false } opts := azblob.UploadOption{} _, err = blobClient.UploadFile(ctx, data, opts) if err != nil { fmt.Print(err) return false } return true } func Delete(ctx context.Context, cc *azblob.ContainerClient, containerName string, blobName string) bool { blockBlob, err := cc.NewBlockBlobClient(blobName) if err != nil { return false } _, err = blockBlob.Delete(ctx, nil) if err != nil { fmt.Print(err) return false } return true } func GetBlobList(ctx context.Context, cc *azblob.ContainerClient, containerName string, prefix string) []string { pager := cc.ListBlobsFlat(&azblob.ContainerListBlobsFlatOptions{ Prefix: &prefix, }) blobs := []string{} for pager.NextPage(ctx) { res := pager.PageResponse() for _, i := range res.Segment.BlobItems { blobs = append(blobs, *i.Name) } } return blobs } func main() { conn := <Connection String> ctx := context.Background() containerName := <container> serviceClient, err := azblob.NewServiceClientFromConnectionString(conn, nil) if err != nil { fmt.Print(err) } cc, err := serviceClient.NewContainerClient(containerName) if err != nil { fmt.Print(err) } fileName := <Source file Path> //絶対パスでやってみたところ動きました blobName := <Destination file Name> // upload result := Upload(ctx, cc, containerName, blobName, fileName) fmt.Print(result) // list prefix := <prefix> list := GetBlobList(ctx, cc, containerName, prefix) fmt.Print(list) // delete for _, file := range list { result := Delete(ctx, cc, containerName, file) fmt.Print(result) } }
List
一覧取得。取得したいファイルのprefixをオプションとして引き渡してリクエストする。 ループして1つ1つファイル名を取得。
func GetBlobList(ctx context.Context, cc *azblob.ContainerClient, containerName string, prefix string) []string { pager := cc.ListBlobsFlat(&azblob.ContainerListBlobsFlatOptions{ Prefix: &prefix, }) blobs := []string{} for pager.NextPage(ctx) { res := pager.PageResponse() for _, i := range res.Segment.BlobItems { blobs = append(blobs, *i.Name) } } return blobs }
Upload
アップロードしたいファイルをopenし、BlobClientからUploadします。
func Upload(ctx context.Context, cc *azblob.ContainerClient, containerName string, blobName string, fileName string) bool { blobClient, err := cc.NewBlockBlobClient(blobName) if err != nil { fmt.Print(err) return false } data, err := os.Open(fileName) defer data.Close() if err != nil { fmt.Print(err) return false } opts := azblob.UploadOption{} _, err = blobClient.UploadFile(ctx, data, opts) if err != nil { fmt.Print(err) return false } return true }
Delete
そんなに難しいことはしてない。 削除したいBlob名を引数にclient生成してDeleteするだけ。
func Delete(ctx context.Context, cc *azblob.ContainerClient, containerName string, blobName string) bool { blockBlob, err := cc.NewBlockBlobClient(blobName) if err != nil { return false } _, err = blockBlob.Delete(ctx, nil) if err != nil { fmt.Print(err) return false } return true }
終わりに
今回は接続文字列を利用して操作を行いましたが、SASトークンを利用した操作も後日残してみたいと思います。
リファレンス
Azure クイック スタート - Go を使用してオブジェクト ストレージに BLOB を作成する | Microsoft Learn