GoogleAppEngineのstandard environmentでgolang+martiniを動かしてみた
はじめに
slackのbot作りたいなぁ、と思ってGoogleAppEngine Flexible Environment+Djangoで環境構築してみた・・・というのが前の記事でのお話。
環境構築してみたのはいいものの、FlexibleEnvironmentは無料枠がなくて結構インスタンス代が嵩むので、 StandardEnvironmentで再構築しよう、というのが今回の動機です。 (他サービスでmicroインスタンスを常時動かしているのですが、デフォルト設定で何も考えずにデプロイすると、少なくともそれよりはインスタンス代が嵩んでいました)
そして、せっかくGoogleのインフラ使うんならGolang使ってみよう、という感じです。 ドキュメントをさっと読んでみたところ、StandardEnvironmentとの相性も良さそう。
APIを実装するだけならデフォルトで入っているnet/httpだけで実現可能ですが、 ゆくゆくはWebアプリ的な何かも実装したいと思ったのでmartiniを利用することにします。
Golangのインストール
Getting Started - The Go Programming Language
基本はここに書いてあることをやるだけ。 開発環境はInteliJ IDEAを利用します。
IntelliJ IDEA :: Download Latest Version of IntelliJ IDEA
ここからCommunity Editionをダウンロード。 起動後、 File -> settings -> plugins -> browse repositories -> 'go'と検索 すれば、Golang開発用のプラグインが見つかります。
Google App Engine SDK for Goのインストール
GAEへのデプロイのために必要になります。 開発環境に応じたバージョンをインストールします。
Download the Google App Engine SDK | App Engine | Google Cloud Platform
デプロイしてみる
Google App Engine SDK for Goを/usr/local/
以下に置いていることを前提にします。
デプロイされたアプリは、init()関数をエントリポイントとして動作するので、
うっかりmain()とかにしないよう注意しましょう。
(initが複数定義されていたら・・・どうなるんでしょう)
ひな形として、
Quickstart for Go App Engine Standard Environment | Go | Google Cloud Platform
にあるサンプルプロジェクトを利用するといいでしょう。
まず、GCEのコンソールからプロジェクトを作成した上で、
/usr/local/go_appengine/appcfg.py -A project-id -V v1 update app/
とやれば、v1としてGAE上にデプロイされます。 注意点としては、デフォルトのpythonインタプリタが使われ、かつ3系だとエラーが出るので、 もしデフォルトを3系にしている場合は以下のように明示的に指定しましょう。 anacondaとか入れてるとさもありなんですね。
/usr/bin/python2.7 /usr/local/go_appengine/appcfg.py -A project-id -V v1 update app/
martiniを入れてみる
ひろぽっぽれす - いくらが大好きです。Webの開発やってます - GoのフレームワークのMartiniで簡単なDEMOをつくってみた
基本的にはこちらを参考にさせていただきました。
import
import( "github.com/go-martini/martini" "github.com/martini-contrib/render" )
goapp get
go getではなく、/usr/local/go_appengine/goapp get
を使います。
GOPATH未設定の場合はgo_appengine/gopath/srcにインストールされますが、特にこれで問題はないかと思います。
なお、アプリケーションがGOPATH管理下に無い場合(GOPATH未設定の場合とか)に
go install: no install location for directoryほにゃらら
みたいなメッセージが出ますが、別にインストールに失敗している訳ではなく、ただの警告なので問題ないでしょう。多分。
ちょっと修正
m.Run()
ではなく、
import ( "net/http" ) http.Handle("/", m)
に修正する必要があります。
deploy
後は、
/usr/bin/python2.7 /usr/local/go_appengine/appcfg.py -A project-id -V v1 update app/
すれば動くはずです。