LoginSignup
28
19

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-02-28

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
}

参考

28
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
19