Edited at

GoでGCEからGCSにファイルを書き込む/読み込む

More than 3 years have passed since last update.

GCE(Google Compute Engine)からGCS(Google Cloud Storage)へのアクセスとても簡単に出来たのでメモメモ。

現在GCEでLinuxサーバーとWindowsサーバーを運用しているのだけど、Goのクロスコンパイルでどちらでも問題なく動いた。便利\(^o^)/


準備


import

import (

"google.golang.org/cloud/storage"
"golang.org/x/net/context"
)


認証

GCE上で動かすのであれば、そのプロジェクトからアクセス権限のあるbucketにはそのままアクセスできる。

ちなみにローカルで実行する場合でもgcloud auth loginでbucketにアクセス権限あるユーザーで認証しておけばそのまま実行できる。テストに便利。

CIとかから実行したい場合はサービスアカウント用意しておけばいいかな(多分)。

とにかくコード内に認証情報を用意しておく必要ないのは便利\(^o^)/


書き込み

func Put(bucket, path string, data []byte) error {

ctx := context.Background()
client, err := storage.NewClient(ctx)
if err != nil {
err
}
defer client.Close()

w := client.Bucket(bucket).Object(path).NewWriter(ctx)
defer w.Close()

if n, err := w.Write(data); err != nil {
return err
} else if n != len(data) {
return err
}
if err := w.Close(); err != nil {
return err
}

return nil
}


読み込み

func Get(bucket, path string) ([]byte, error) {

ctx := context.Background()
client, err := storage.NewClient(ctx)
if err != nil {
return nil, err
}
defer client.Close()

r, err := client.Bucket(bucket).Object(path).NewReader(ctx)
if err != nil {
return nil, err
}
defer r.Close()

var buf bytes.Buffer
if _, err := buf.ReadFrom(r); err != nil {
return nil, err
}

return buf.Bytes(), nil
}


参考

https://godoc.org/google.golang.org/cloud/storage