ゴール
- ローカルでAppEngineSDKを使ってサーバを動かす
- それをAppEngineServiceにデプロイして確認する
docs
結論から言うと5分ではなく10分だった
ローカルで動かすまで
% cd $GOPATH/src % mkdir oppai % cd oppai % vi main.go
package oppai import ( "net/http" "github.com/otiai10/marmoset" // 自前のルーター ) func init() { router := marmoset.NewRouter() router.GET("/foo", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("おっぱい")) }) http.Handle("/", router) }
ListenAndServeはGAE側がやるっぽいな
% vi app.yaml
runtime: go api_version: go1 handlers: - url: /.* script: _go_app
SDKをインストールしなきゃいけない。
Download the Google App Engine SDK - App Engine — Google Cloud Platform
ここからGoの、MacOS 64bitのzipのやつを落としてきて、そのまま解凍。~/Downloadに入ってるので、これを直接叩いてみる
% ~/Downloads/go_appengine/goapp serve oppai INFO 2016-03-18 11:26:21,459 devappserver2.py:769] Skipping SDK update check. INFO 2016-03-18 11:26:21,488 api_server.py:205] Starting API server at: http://localhost:59920 INFO 2016-03-18 11:26:21,491 dispatcher.py:197] Starting module "default" running at: http://localhost:8080 INFO 2016-03-18 11:26:21,492 admin_server.py:116] Starting admin server at: http://localhost:8000 INFO 2016-03-18 11:26:24,449 module.py:787] default: "GET /foo HTTP/1.1" 200 12
で、http://localhost:8080/fooを見ると
動いてる。8000番では
こういうのが動いてるけど、とりあえず知らんぷり。
8080番ではファイルの編集を検知して自動ビルドが走るっぽくて、たとえば/
に対するハンドラを追加して、(再起動せずに)リロードすると
INFO 2016-03-18 12:09:29,706 module.py:787] default: "GET / HTTP/1.1" 404 19 INFO 2016-03-18 12:09:51,401 module.py:401] [default] Detected file changes: /Users/otiai10/proj/go/src/github.com/otiai10/oppai/main.go INFO 2016-03-18 12:09:53,684 module.py:787] default: "GET / HTTP/1.1" 200 21
となって404だったのが200を返すようになった
AppEngineServiceにデプロイ
ここから、
プロジェクト新規作成で gae-oppai
というプロジェクトを作成した
で、ローカルのほうで、(まだ~/Downloadにコマンド置きっぱなしなので)
% ~/Downloads/go_appengine/appcfg.py -A gae-oppai -V v1 update oppai/ # Google Authenticateなページが一瞬開く # ... 中略 01:18 PM Checking if updated app version is serving. 01:18 PM Completed update of app: gae-oppai, version: v1
いけたっぽい雰囲気あるんじゃないか
うごいたやん。
雑感
- Goは、ペライチのバイナリをビルドするのが得意で、依存パッケージの管理が(今んとこ)不得意で、なので、ローカルでバイナリをビルドしちゃってそれをサーバにあげるというGAE/Goとは相性がいい気がした(開発的な意味で)
- あーでも複数人で開発してると、依存パッケージのバージョン合わせることになって、結局godepsとか使うんなら、godepsを通して
appcfg.py
経由のビルドできなきゃいけないんじゃないか? - あと、GAE/Goから(なんらかの)DBへの接続はどうするんだろ
- お値段も確認せねば
DRY