えいのうにっき

a-knowの日記です

Golangアプリケーションから Google Cloud Storage にアップロードする

cloud.google.com/go/storage を使う。

func uploadGcs(r *http.Request) error {
    bucketname := "bucketname" // GCSバケット名
    objname := "objname" // "foo/var/baz.png" みたいなかんじ
    ctx := r.Context()

    client, err := storage.NewClient(ctx)
    if err != nil {
        log.Printf("failed to create gcs client : %v", err)
        return err
    }

    // GCS writer
    writer := client.Bucket(bucketname).Object(objname).NewWriter(ctx)
    writer.ContentType = "image/png" // 任意のContentTypeに置き換える

    // upload : write object body
    if _, err := writer.Write(([]byte)(uploadData)); err != nil {
        log.Printf("failed to write object body : %v", err)
        return err
    }

    if err := writer.Close(); err != nil {
        log.Printf("failed to close gcs writer : %v", err)
        return err
    }
    return nil
}

GCSにアクセスするための認証情報は、認証の概要  |  Google Cloud に書いてあるとおり、

上記のことをしておけば、自動的に認証情報がロードされ、GCSへのアクセスもできるようになる。簡単。

ちなみに appengine の場合

は、context ctxgoogle.golang.org/appengine を使って ctx := appengine.NewContext(*http.Request) として取得するだけで、その appengineアプリケーションと同じプロジェクト内のGCSにアクセスできるようになる。