Go言語(golang)でGoogle Cloud Storageへファイルをアップロードする

2020.02.19

今回はGoogle Cloud Storageへファイルをアップロードする方法についてご紹介したいと思います。

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

前回ご紹介した、GCSからファイルを取得する方法はこちら。

Go言語(golang)でGoogle Cloud Storageからファイルを取得する

sdkをインストールする

cloud.google.com/go/storage を使用します。

$ go mod init example.com/gcs/write
go: creating new go.mod: module example.com/gcs/write
$ go get -u cloud.google.com/go/storage
.
.
.
$ cat go.mod
$ cat go.mod 
module example.com/gcs/write

go 1.13

require (
	cloud.google.com/go v0.53.0 // indirect
	golang.org/x/exp v0.0.0-20200213203834-85f925bdd4d0 // indirect
	golang.org/x/sys v0.0.0-20200217220822-9197077df867 // indirect
	golang.org/x/tools v0.0.0-20200219054238-753a1d49df85 // indirect
	google.golang.org/genproto v0.0.0-20200218151345-dad8c97a84f5 // indirect
)

v0.53.0がインストールされました。

作っていく

前回と同様に、main.goというファイルを作成し、実装していきます。

予めお目当てのGCSバケットに接続できるサービスアカウントを発行し、jsonファイルをダウンロードしておきます。

今回もmain.goと同じフォルダに、「key.json」という名前で保存しておきました。

package main

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

	"cloud.google.com/go/storage"
	"google.golang.org/api/option"
)

func main() {
	credentialFilePath := "./key.json"

	// クライアントを作成する
	ctx := context.Background()
	client, err := storage.NewClient(ctx, option.WithCredentialsFile(credentialFilePath))
	if err != nil {
		log.Fatal(err)
	}

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

	// オブジェクトのReaderを作成
	bucketName := "xxx-bucket"
	objectPath := "yyy-obj"
	obj := client.Bucket(bucketName).Object(objectPath)
	reader, err := obj.NewReader(ctx)
	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")
}

ObjectHandleのNewWriter()メソッドを呼び出してWriterを取得し、そこにローカルファイルの内容を書き込みます。

実行してみます。

$ go run main.go 
2020/02/19 17:00:57 done

成功し、GCSにローカルファイルがアップロードされました。

まとめ

「cloud.google.com/go/storage」を使うことで、GCSへのファイルアップロードを容易に行うことができました。 次回はAzure Blob storageのファイル取得/アップロード方法について実践したいと思います。

参考リンク