GoアプリをHerokuにデプロイする

Go on Heroku!

Heroku Advent Calendar 2014 - Qiita の23日目です、たぶん。

最近、僕の周りの人らがGO!GO!うるさいので、ついつい僕もそそのかされてGo言語やりたいなーと思ったのです。Go 1.4も出たしね。

ひととおりチュートリアルはやってみたんですけど、やっぱりWeb上で動かしたいわけですよ。そうゆうわけで、Heroku上でGoアプリを動かしてみようと思います。

Go on Heroku

まぁ、上記の記事を参考にしたらちゃんとGoアプリをHerokuで稼働させることができます。以下は自分の備忘録代わりということで。

Install Go

goenvというGoのバージョン管理ツールもあるみたいだけど、初心者なのでHomebrewで入れることにする。

$ brew install go
$ go version
go version go1.3.3 darwin/amd64

わーい、かんたん٩(๑❛ᴗ❛๑)۶

Go Environment

$GOPATH等を設定する。ここで指定したパス以下がGoのワークスペースとなる。お好きなシェルプロファイルに記述。

$ echo 'export GOPATH=$HOME' >> $HOME/.bash_profile
$ echo 'export PATH=$PATH:$GOPATH/bin'  >> $HOME/.bash_profile

以下のようなディレクトリ構成で管理される。

$GOPATH
├── bin(コンパイルしたバイナリファイル)
├── pkg(パッケージオブジェクトファイル)
└── src(Goの作業ソースファイル)

GitHub上に置かれているソースファイルは、 ~/src/github.com/{USER_NAME}/{REPOSITORY_NAME} みたいに管理される。

だもんでghqの方もそっち合わせてpecoとか使うと捗るらしいよ。

git config --global ghq.root ~/src

ghqでgetしてきたリポジトリの保存先の設定。

  • motemen/ghq(Go言語製、リポジトリ管理ツール)
  • peco/peco(Go言語製、フィルタリングツール)
  • typester/gh-open(Go言語製、GitHubのレポジトリURLを開くツール)

まとめると、上みたいな感じ。世の中便利ですな。

ちなみに、Intellij IDEAでGolangのプラグイン(0.9.15)を入れると、ちゃんと指定しているのにもかかわらず、$GOROOTと$GOPATH設定しろや、(゚Д゚)ゴルァ!!って言われるけど、0.9.16-alpha入れると治った٩(๑❛ᴗ❛๑)۶

んで、$GOROOTは設定しなくてもいいらしい。

Go Web App

話が逸れたので戻すと~/src/demoappのディレクトリを作ってそこで作業する。

$ mkdir $GOPATH/src/demoapp
$ cd $GOPATH/src/demoapp

web.goのファイルを作成する。

// web.go
package main

import (
    "fmt"
    "net/http"
    "os"
)

func main() {
    http.HandleFunc("/", hello)
    fmt.Println("listening...")
    err := http.ListenAndServe(":"+os.Getenv("PORT"), nil)
    if err != nil {
      panic(err)
    }
}

func hello(res http.ResponseWriter, req *http.Request) {
    fmt.Fprintln(res, "hello, world")
}

んで、go get(コンパイル、インストール)して、demoappをバイナリで動かすようにする。

$ PORT=5000 demoapp
$ open http://localhost:5000/

ローカル環境で動いてることを確認する。

Heroku Setup

heroku loginとかしとく。

$ echo 'web: demoapp' > Procfile

Procfileを作る。

$ go get github.com/kr/godep

Godepという依存性の管理ツールをインスコ。

$ godep save

依存性を保存。

$ heroku create --buildpack https://github.com/kr/heroku-buildpack-go.git

GoのHeroku Buildpackを使ってHerokuアプリを作成する。ちなみに、BuildpackとはHeroku上でアプリをコンパイルするためのスクリプトで、Goなどのデフォルトで対応していない言語はThird-PartyのBuildpackを使ってデプロイすることになる。だもんで、Go言語以外も動かせる。

Buildpackを使ってアプリで来たら、git push heroku masterしてデプロイして完了!

わーい、できたー٩(๑❛ᴗ❛๑)۶

A fast Heroku CLI client

ちなみに、Go言語製のCLIツールが多いのにお気づきだろうか。なんか速いらしいね。ってことで、herokuコマンドもhkというGoで作らたコマンドがある。

まだBeta版でherokuにあってhkに無いコマンドもありますが。

$ L=/usr/local/bin/hk && curl -sL -A "`uname -sp`" https://hk.heroku.com/hk.gz | zcat >$L && chmod +x $L

インスコ。

t32k at MBP in ~
$ time heroku apps >/dev/null
real	0m1.980s
user	0m0.711s
sys	0m0.064s

t32k at MBP in ~
$ time hk apps >/dev/null
real	0m0.724s
user	0m0.076s
sys	0m0.019s

おぉー、桁が違うぜ!ってことで、速いもの好きなあなたはインストールしてみてはどうでしょうか。

僕もGoで作ったCLIツール作りたい٩(๑❛ᴗ❛๑)۶