Go
golang
GoogleCloudStorage
googlecomputeengine
GoogleCloudPlatform

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

More than 1 year has 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