tl;dr
- 従来までの
appengine.Context
と、GCS にアクセスする際に使用する際の contextcontext.Context
は別物 - 1.9.0 以前に作成した app の場合、Application Settings > Cloud Integration を実施する必要アリ(下のスクリーンショットは実施済みの状態)
- これをしてない場合は
API error 1002 (app_identity_service: NOT_A_VALID_APP)
エラーになる
- これをしてない場合は
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 には下記のようにある。
この内の真ん中は、下記のように go get
しろ、ということ。
$ go get golang.org/x/oauth2 $ go get google.golang.org/cloud/storage
ちなみにドキュメントでは goapp get
になっているのだけど、これは某 GCP マイスターや GAE/Go 界隈では有名な御方によると下記の通り。ややこしや。
@a_know go app getも結局はapp engine sdkの中に入っているgoコマンドを呼んでいる感じなので、だいたい一緒。
— 真 (@sinmetal) 2015, 4月 18
@a_know 環境変数GOPATHが設定されていないとSDKのデフォルトが使用されること・・・とか。
— Daigo Ikeda (@hogedigo) 2015, 4月 18
ちなみに If developing on Managed VMs
という断りの上で、 google.golang.org/appengine
も go 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
にあるサンプルコードを元に実装してみたんだけど、コンパイルが通らない。
その旨をついったに吐き出してみると、某プロからリプライが。
@a_know その辺最近コードが変わったり。client libraryの中にサンプルコードあるますよ^_^
— Daigo Ikeda (@hogedigo) 2015, 4月 18
"変わった" というその理由の根源は、マイスターがプルリクエストにコメントをしてくれたこの件に起因することの様子。
これが特に厄介だった。
サンプルコードをそのまま参考にして進めるんだけど、既存のコードでは当然 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 を取得しなおしたらできたよ、とある。...正気の沙汰とは思えない(`;ω;´)カオスすぎる。
その他にもエラーが。
その他にも、↓こんなエラーも出たりした。
帰宅っても GAE/Go からの GCS アップロードを粘ってるんだけど、 `API error 1002 (app_identity_service: NOT_A_VALID_APP)` エラーでもうだめぽ...、、どういうエラーなのこれ(´・ω・`)
— いのうえ (@a_know) 2015, 4月 18
これもわからなすぎたんだけど、結局ここ に書いてある 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実践ガイド
- 作者: 小川信一
- 出版社/メーカー: インプレス
- 発売日: 2012/03/16
- メディア: 大型本
- クリック: 12回
- この商品を含むブログ (14件) を見る