表題の通り、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
}

こんな感じになりました。
もっといい方法があるとか、間違いがあれば教えてください。

广告
将在 10 秒后关闭
bannerAds