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 に書いてあるとおり、
- 認証情報 JSON ファイルを取得する
- ちょっと古いけど Google Cloud Platform のサービスアカウントを作成する(2016年9月版) - えいのうにっき この方法から大きくは変わってないはず(たぶん)
- JSONファイルを、上記 Golangアプリケーションが動作する環境の任意の場所に配置する
- 配置したファイルパスを、環境変数
GOOGLE_APPLICATION_CREDENTIALS
として設定する
上記のことをしておけば、自動的に認証情報がロードされ、GCSへのアクセスもできるようになる。簡単。
ちなみに appengine の場合
は、context ctx
を google.golang.org/appengine
を使って ctx := appengine.NewContext(*http.Request)
として取得するだけで、その appengineアプリケーションと同じプロジェクト内のGCSにアクセスできるようになる。