読者です 読者をやめる 読者になる 読者になる

えいのうにっき

あたまのなかのデトックスを、不定期的に。主に Web 系技術ネタ。

GAE/Go の app から Google Cloud Storage にファイルを出力する(3.9章の GAE/Go 写経メモ・その1)

GAE/G

tl;dr

  • 従来までの appengine.Context と、GCS にアクセスする際に使用する際の context context.Context は別物
  • 1.9.0 以前に作成した app の場合、Application Settings > Cloud Integration を実施する必要アリ(下のスクリーンショットは実施済みの状態)
    • これをしてない場合は API error 1002 (app_identity_service: NOT_A_VALID_APP) エラーになる

f:id:a-know:20150419005106p:plain

3.9章 Blobstore Service / File Service の写経

久々(約半年ぶり!)の「GAE/J 本を Go で写経しちゃうよ」シリーズ。今回は 3.9章、Blobstore Service / File Service。

本書では FileService を使って、削除対象のメモの内容を tsv ファイルとして出力しているところがあるんだけど、FileService は既に deprecated。今これ相当のことをやろうとすると Go Client for Google Cloud Storage を用いることになるので、今回はこれにトライ。つまりもう殆ど写経ではない。w

Getting Started には下記のようにある。

  • You have activated your project for GCS and App Engine, including creating at least one GCS bucket.
  • You have downloaded the client lib and installed it.
  • You have installed the Cloud SDK.

この内の真ん中は、下記のように go get しろ、ということ。

$ go get golang.org/x/oauth2
$ go get google.golang.org/cloud/storage

ちなみにドキュメントでは goapp get になっているのだけど、これは某 GCP マイスターや GAE/Go 界隈では有名な御方によると下記の通り。ややこしや。

ちなみに If developing on Managed VMs という断りの上で、 google.golang.org/appenginego get しろとあるんだけど、go get せずにいたら下記のようなエラーがでてにっちもさっちも行かない感じになっちゃったので go get しますた。

ERROR    2015-04-18 07:55:35,659 go_runtime.py:170] Failed to build Go application: /Users/a-know/dev/go/workspace/shakyo-with-go/src/golang.org/x/oauth2/client_appengine.go:16: can't find import: "google.golang.org/appengine/urlfetch"

これは後々にうっすらわかるんだけど、 on Managed VMs かどうかに加えて、GCS Client Library を使うかどうか、にも左右されるみたいだ。

サンプルコードを "写経"

その後、 ここUnderstanding the Example にあるサンプルコードを元に実装してみたんだけど、コンパイルが通らない。

その旨をついったに吐き出してみると、某プロからリプライが。

"変わった" というその理由の根源は、マイスターがプルリクエストにコメントをしてくれたこの件に起因することの様子。

f:id:a-know:20150419005438p:plain

これが特に厄介だった。

サンプルコードをそのまま参考にして進めるんだけど、既存のコードでは当然 c := appengine.NewContext(request.Request) しているのでその context を流用するんだけど、そのままだと、GCS へのアップロードのところで not an App Engine context なんていって怒られたりする。少し調べてみると、こんな issue もあったりした。

どうやらこれが、マイスターの言っている「App Engine SDKのContextと、MVMs用のContextの型が違う」ことより起きている問題の様子。ここ とかを見ると、今は過渡期?か何かで If you don't want to update your entire app to use the new App Engine packages, とあって、各自新しい context を使うように update しなさいよ、ということ?なのかもだけど、...うーん。

諦めきれずに悪あがきのつもりでさっきの issue をさらに見ていると、ここ にあるような感じで newappengine として別パッケージをインポートしなおしてそれを使って context を取得しなおしたらできたよ、とある。...正気の沙汰とは思えない(`;ω;´)カオスすぎる。

その他にもエラーが。

その他にも、↓こんなエラーも出たりした。

これもわからなすぎたんだけど、結局ここ に書いてある If your app was created before the App Engine 1.9.0 release これに該当する app だったことが原因だった。ここに書いてあるとおり、 Cloud Integration の手続きでこのエラーは出なくなった。。ドキュメント嫁 、ってことなんだけどさ。。

とまぁ、約半年ぶりというブランクも手伝って盛大に躓きまくったわけだけど、でも今回のこれはあくまで "今だからこそ" 躓いた問題、な気もする。

ゆくゆくは context も統一される?だろうし、app だってそもそも最近作っていれば問題なかったわけだし...。

ともかくも、ここまでで GCS の指定した bucket にファイルを出力できるようにはなった! 次はまたいつになるかわからないけど、今度はこのファイル(の内容)を app 経由でダウンロードできるようにしたい。

作業を行っているプルリクエスト→ [WIP] 3.9章 Blobstore Service / File Service

Google API Expertが解説する Google App Engine for Java実践ガイド

Google API Expertが解説する Google App Engine for Java実践ガイド

follow us in feedly