表題の通り、Google App Engine上のGoアプリから
Google Cloud Storage上のあるフォルダ内のディスク容量を取得しようと思います。
まだ、GAE/Go初心者ですが、試してみたら色々とありましたのでメモしておきます。
storageを試す前に、Hello Worldなどチュートリアルを試して、
cloud shellを使っていましたが、storageを使う段階になって
cloud shellでデプロイできなくなりました。
出来ました。 参照
チュートリアルを試している時は、旧appengineパッケージを使っていて
go get もする事がなく、cloud shell上に必要なものが揃っています。
しかし、storageを使うには、 cloud.google.com/go/storage が必要になり
新appengine( google.golang.org/appengine )も必要になります。(多分)
本格的に開発していくためには、新appengineの方がいいと思うので移行しました。
移行の方法については、下記ページを参考にさせていただきました。
http://qiita.com/pside/items/72337bb5ac6571b238a4
そうして、新appengineに移行すると、 cloud shellは使えなくなります。(多分)
なので、 諦めてローカルPCからデプロイします。
(手間的には、そんなに変わらない気がします。)
そんなこんながあり、いよいよコードですが
import (
"golang.org/x/net/context"
"google.golang.org/appengine/log"
"google.golang.org/api/iterator"
"cloud.google.com/go/storage"
)
const bucketname = "hoge"
func GetUserItemSize(c context.Context, prefix string, size *int64) {
client, err := storage.NewClient(c)
if err != nil {
log.Debugf(c, "Failed to get client: %v", err)
return
}
var sum int64
sum = 0
query := &storage.Query{Prefix: prefix}
bucket := client.Bucket(bucketname)
it := bucket.Objects(c, query)
for {
obj, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
log.Debugf("listBucket: unable to list bucket %s: %v", bucketName, err)
return
}
log.Debugf(c, "objAttrs %v\n", obj)
sum += obj.Size
}
*size = sum
}
こんな感じになりました。
もっといい方法があるとか、間違いがあれば教えてください。