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
}