Go言語(golang)で、Azure Blob Storageからファイルを取得する

2020.03.11

データアナリティクス事業本部の森脇です。

今回はAzure Blob Storageからファイルを取得する方法についてご紹介したいと思います。

使用するGo言語のバージョンは1.13.6です。

sdkをインストールする

github.com/Azure/azure-sdk-for-go/storage を使用します。

$ go mod init example.com/azure_blob/read
go: creating new go.mod: module example.com/azure_blob/read
$ go get -u github.com/Azure/azure-sdk-for-go/storage
.
.
.
$ cat go.mod 
module example.com/azure_blob/read

go 1.13

require (
	github.com/Azure/azure-sdk-for-go v40.3.0+incompatible // indirect
	github.com/Azure/go-autorest/autorest v0.10.0 // indirect
	github.com/satori/go.uuid v1.2.0 // indirect
)

v40.3がインストールされました。

作る

main.goファイルを作成し、実装していきます。

クライアントを作成する

Blob Storageを操作するには、まずClientを作成します。 今回はストレージアカウント名とアクセスキーを用いたシンプルなクライアントを作成します。

package main

import (
	"log"

	"github.com/Azure/azure-sdk-for-go/storage"
)

func main() {
	storageAccountName := "xxxx"
	accessKey := "yyyyy"

	// clientを作成
	client, err := storage.NewBasicClient(storageAccountName, accessKey)
	if err != nil {
		log.Fatal(err)
	}
}

このclientを利用してBlobストレージにアクセスします。

ファイル(Blob)を取得する

package main

import (
	"bufio"
	"io"
	"log"
	"os"

	"github.com/Azure/azure-sdk-for-go/storage"
)

func main() {
	storageAccountName := "xxxx"
	accessKey := "yyyyy"

	// clientを作成
	client, err := storage.NewBasicClient(storageAccountName, accessKey)
	if err != nil {
		log.Fatal(err)
	}

	// コンテナを取得
	containerName := "zzz-container"
	blobService := client.GetBlobService()
	container := blobService.GetContainerReference(containerName)

	// Blobオブジェクトを書き込むファイルの作成
	f, err := os.Create("sample.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer f.Close()

	// パスからreaderを取得
	filePath := "sample.txt"
	blob := container.GetBlobReference(filePath)
	opt := &storage.GetBlobOptions{}
	reader, err := blob.Get(opt)
	if err != nil {
		log.Fatal(err)
	}
	defer reader.Close()

	// ローカルファイルに書き込み
	tee := io.TeeReader(reader, f)
	s := bufio.NewScanner(tee)
	for s.Scan() {
	}
	if err := s.Err(); err != nil {
		log.Fatal(err)
	}

	log.Println("done")
}

実行してみます。

$ go run main.go 
2020/03/11 16:15:32 done

実行が完了し、ローカルに取得することができました。

まとめ

「github.com/Azure/azure-sdk-for-go/storageを使うことで、簡単にファイルを取得することができました。 今回は一番シンプルな認証方法でClientを作成しましたが、SASを用いたClient作成も行えるようでした。

参考リンク