ピロローグ

主に技術ネタについて書いてみる

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

learn.microsoft.com

サンプル

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