GoogleAppEngine(GAE)でGo/Martiniを動かすまで

以下の手順は下記を参考にしました。簡単でした。10分程度で出来ると思います。

[API on Google App Engine with Martini and Go](http://techslides.com/api-on-google-app-engine-with-martini-and-go/)

GAE SDKのインストール
----

まず下記のリンクから「go_appengine_sdk_darwin_amd64-1.9.10.zip」をダウンロードし任意のディレクトリに解凍します。$HOME直下が良いと思います。

[Download the Google App Engine SDK](https://developers.google.com/appengine/downloads#Google_App_Engine_SDK_for_Go)

    vi ~/.bash_profile

をして、下記を末尾に追記します。

    export PATH=”$HOME/go_appengine:$PATH”

viを保存する時は、Escを押してから:wqでOKです。保存したら読み直しておきます。

    source ~/.bash_profile

次のコマンドでSDKが有効になってるか確認します。

    goapp version

サンプルの実装（net/http）
----

下記からサンプルのソースコードをダウンロードします。

[サンプルのソース](https://github.com/GoogleCloudPlatform/appengine-guestbook-go/archive/part1-helloworld.zip)

    mkdir gae_go
    cd gae_go
    mkdir myapp

myappフォルダの中にダウンロードしたソースコード（hello.go, app.yaml）をコピーします。そしてhello.goのあるフォルダの中で下記のコマンドで実行します。

    goapp serve

実行すると下記のURLで確認できます。

[http://localhost:8080](http://localhost:8080)

サンプルの実装（Martini）
----

myappをコピーします。そしてアプリケーションの名前を変えます。

    cd ..
    cp -R myapp api 
    vi api/app.yaml

application: myapp の箇所を application: api に変えて保存します。次にhello.goを下記のように書き換えます。

    package hello
    import (
        "net/http"
        "github.com/go-martini/martini"
    )
    func init() {
        m := martini.Classic()
        m.Get("/", func() string {
            return "Hello world!"
        })
        http.Handle("/", m)
    }    

次にMartiniをインストールします。

    goapp get github.com/go-martini/martini

そして、動作を確認します。

    cd api
    goapp serve

同じく実行すると下記のURLで確認できます。

[http://localhost:8080](http://localhost:8080)

GAEにデプロイする
----

下記でアプリを登録する

[Google Developer Console](https://console.developers.google.com/project)

    Project Name: Playing Cards API
    Project ID: playing-cards-api-<xxxxx>

app.yamlのapplicationを上記で入力したplaying-cards-api-<xxxxx>に変更する。

    vi app.yaml

そしてデプロイする。

    cd ..
    goapp deploy api

すると下記のようにコンソールが走る。途中でGoogleアカウントの認証が求められる。

    $ goapp deploy api
    06:38 PM Application: playing-cards-api-timanish; version: 1
    06:38 PM Host: appengine.google.com
    06:38 PM 
    Starting update of app: playing-cards-api-timanish, version: 1
    06:38 PM Getting current resource limits.
    Email: hoge@example.com
    Password for hoge@example.com: 
    06:39 PM Scanning files on local disk.
    06:39 PM Cloning 11 application files.
    06:39 PM Uploading 2 files and blobs.
    06:40 PM Uploaded 2 files and blobs
    06:40 PM Compilation starting.
    06:40 PM Compilation: 10 files left.
    06:40 PM Compilation completed.
    06:40 PM Starting deployment.
    06:40 PM Checking if deployment succeeded.
    06:40 PM Deployment successful.
    06:40 PM Checking if updated app version is serving.
    06:40 PM Completed update of app: playing-cards-api-timanish, version: 1

下記のURLで動作を確認できる。簡単だった。
[http://playing-cards-api-timanish.appspot.com/](http://playing-cards-api-timanish.appspot.com/)

通常のコードとGAE用のコード
----

ちなみに昨日投稿したコードと比べると下記のようになる。下記はローカルで動作するMartiniのコード。

    package main    

    import "github.com/go-martini/martini"    

    func main() {
      m := martini.Classic()
      m.Get("/", func() string {
        return "Hello world!"
      })
      m.Run()
    }

これはgo run server.goという形で実行した。

次にappengine用のコード。

    package hello
    import (
        "net/http"
        "github.com/go-martini/martini"
    )
    func init() {
        m := martini.Classic()
        m.Get("/", func() string {
            return "Hello world!"
        })
        http.Handle("/", m)
    }    

これはgoapp serveという形で実行する。m.Run()がhttp.Handle("/", m)になっている。