ことりのえさば

ひよっこエンジニアがつらつらと書き綴るブログです。記事の内容に責任は負えませんのでご容赦ください。

GoogleAppEngineのstandard environmentでgolang+martiniを動かしてみた

はじめに

slackのbot作りたいなぁ、と思ってGoogleAppEngine Flexible Environment+Djangoで環境構築してみた・・・というのが前の記事でのお話。

littlebird.hatenablog.jp

環境構築してみたのはいいものの、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/

すれば動くはずです。