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

DRYな備忘録

Don't Repeat Yourself.

AppEngine GoでHello,Worldやってみたログ

ゴール

  • ローカルでAppEngineSDKを使ってサーバを動かす
  • それをAppEngineServiceにデプロイして確認する

docs

cloud.google.com

結論から言うと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を見ると

f:id:otiai10:20160318203545p:plain

動いてる。8000番では

f:id:otiai10:20160318203700p:plain

こういうのが動いてるけど、とりあえず知らんぷり。

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にデプロイ

ここから、

console.cloud.google.com

プロジェクト新規作成で 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

いけたっぽい雰囲気あるんじゃないか

f:id:otiai10:20160318212416p:plain

うごいたやん。

雑感

  • Goは、ペライチのバイナリをビルドするのが得意で、依存パッケージの管理が(今んとこ)不得意で、なので、ローカルでバイナリをビルドしちゃってそれをサーバにあげるというGAE/Goとは相性がいい気がした(開発的な意味で)
  • あーでも複数人で開発してると、依存パッケージのバージョン合わせることになって、結局godepsとか使うんなら、godepsを通してappcfg.py経由のビルドできなきゃいけないんじゃないか?
  • あと、GAE/Goから(なんらかの)DBへの接続はどうするんだろ
    • 環境変数とかにDBのURIを書きたいわけだけど、どこでそれは設定すればいいか
    • コネクションプーリングとかも大丈夫か
  • お値段も確認せねば

DRY