概要

azure-sdk-for-go では Azureサービスを管理、使用する為のGoパッケージが提供されているが、以下については別でパッケージが提供されている。

サービスパッケージ
ストレージ-Blobgithub.com/Azure/azure-storage-blob-go
ストレージ-ファイルgithub.com/Azure/azure-storage-file-go
ストレージ-キューgithub.com/Azure/azure-storage-queue-go
サービスバスgithub.com/Azure/azure-service-bus-go
イベントハブgithub.com/Azure/azure-event-hubs-go
Application Insightsgithub.com/Microsoft/ApplicationInsights-go

以下のURLを見る限り、azure-sdk-for-go の同等機能は将来的に廃止される予定らしい。
https://github.com/Azure/azure-sdk-for-go/tree/master/storage

なので、ここでは azure-storage-blob-go を使用してBlobのファイルを読み書きする実装について確認する。

目次

準備

Goパッケージのインストール

go get github.com/Azure/azure-storage-blob-go/azblob

ログイン

az login

リソースの作成

region=japanwest
resourceGroup=リソースグループ名
storageAccountName=ストレージアカウント名
storageContainer=sample-container

# リソースグループの作成
az group create \
  --name $resourceGroup \
  --location $region

# ストレージアカウントの作成
az storage account create \
  --name $storageAccountName \
  --location $region \
  --resource-group $resourceGroup \
  --sku $storageSku

# Storageコンテナの作成
az storage container create \
  --name $storageContainer \
  --resource-group $resourceGroup \
  --account-name $storageAccountName

実装

sample_sdk_blob.go

package main

import (
    "bytes"
    "context"
    "fmt"
    "net/url"

    "github.com/Azure/azure-storage-blob-go/azblob"
)

/**
 * 環境変数の取得.
 */
func getEnv(envName string, defaultValue string) string {

    value, exists := os.LookupEnv(envName)
    if exists {
        return value
    } else {
        return defaultValue
    }   
}

/**
  * メイン処理.
  */
func main() {

    fmt.Println("START main")

    accountName := getEnv("storageAccountName", "") 
    accountKey := getEnv("storageAccountKey", "") 
    containerName := getEnv("storageContainer", "") 
    fileName := getEnv("storageBlobFileName", "") 
    containerUrlTempl := getEnv("storageContainerUrl", "https://%s.blob.core.windows.net/%s")

    if accountName == "" || accountKey == "" || containerName == "" || fileName == "" {
        fmt.Println("環境変数が設定されていません。")
        return
    } 

    ctx := context.Background()

    containerUrlText := fmt.Sprintf(containerUrlTempl, accountName, containerName)
    u, _ := url.Parse(fmt.Sprintf("%s/%s", containerUrlText, fileName))
    credential, err := azblob.NewSharedKeyCredential(accountName, accountKey)
    if err != nil {
        fmt.Println(err)
    }   

    /****************************
     * アップロード
     ****************************/
    blockBlobURL := azblob.NewBlockBlobURL(*u, azblob.NewPipeline(credential, azblob.PipelineOptions{}))

    // サンプルデータ作成
    data := []byte("sample1\nsample2\nsample3")

    // アップロード
    bufferSize := 2 * 1024 * 1024
    maxBuffers := 3
    _, err = azblob.UploadStreamToBlockBlob(ctx, bytes.NewReader(data), blockBlobURL,
        azblob.UploadStreamToBlockBlobOptions{BufferSize: bufferSize, MaxBuffers: maxBuffers})
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println("Upload Success!")
    }   

    /****************************
     * ダウンロード
     ****************************/
    p := azblob.NewPipeline(credential, azblob.PipelineOptions{})
    cURL, _ := url.Parse(containerUrlText)
    containerURL := azblob.NewContainerURL(*cURL, p)
    blobURL := containerURL.NewBlobURL(fileName)

    // サイズを取得
    var blobSize int64 = 1024
    blobPropResponse, err := blobURL.GetProperties(ctx, azblob.BlobAccessConditions{})
    if err != nil {
        fmt.Println("GetProperties Error!")
        fmt.Println(err)
    } else {
        fmt.Println("GetProperties Success!")
        fmt.Printf("type: %s\n", blobPropResponse.ContentType())
        fmt.Printf("size: %d\n", blobPropResponse.ContentLength())
        blobSize = blobPropResponse.ContentLength()
    }   

    // バッファに取得
    downloadedData := make([]byte, blobSize)
    err = azblob.DownloadBlobToBuffer(ctx, blobURL, 0, azblob.CountToEnd, downloadedData, azblob.DownloadFromBlobOptions{})
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println("Download Success!")
        fmt.Println(string(downloadedData))
    }   

    // ファイルにダウンロード
    //err = azblob.DownloadBlobToFile(ctx, blobURL, 0, azblob.CountToEnd, file *os.File, o DownloadFromBlobOptions)

    fmt.Println("END   main")
}

動作確認

アカウントキーの確認

az storage account keys list -n $storageAccountName

実行

export storageAccountName=ストレージアカウント名
export storageAccountKey="ストレージアカウントキー"
export storageContainer=sample-container
export storageBlobFileName=sample.txt

go run sample_sdk_blob.go

START main
Upload Success!
GetProperties Success!
type: application/octet-stream
size: 23
Download Success!
sample1
sample2
sample3
END   main

ローカルエミュレータに対して実行する時

ローカル実行する場合は、アカウント名、キー 及び コンテナURLを以下の通り設定する。
https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-emulator#connect-to-the-emulator-account-using-the-well-known-account-name-and-key

export storageAccountName=devstoreaccount1
export storageAccountKey="Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="
export storageContainerUrl=http://127.0.0.1:10000/%s/%s
export storageContainer=sample-container
export storageBlobFileName=sample.txt

go run sample_sdk_blob.go

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-08-02 (日) 12:15:48 (421d)