Go製のフレームワークechoを使ってJSONを返すWebサーバーを作り、GoogleAppEngineで動かす
という記事を書きましたが、GoogleAppEngineではなくHerokuで動かしたという例があまりなさそうだったので調べてみました。
Golang on Heroku
Herokuは昨年からGoの正式サポートを開始しています。
https://devcenter.heroku.com/articles/getting-started-with-go#introduction
introductionを見ると、
- a free Heroku account.
- Go 1.6+ installed.
- $GOPATH/bin has been added to your $PATH.
ということなので、これを前提として進めます。
echoフレームワークはv2.0.1
で動作確認しています。
まずはlocalで
手元で動かしてみます。
公式のサンプル https://echo.labstack.com/recipes/hello-world をそのまま使います。
go getで取得していない場合は取得します
go get github.com/labstack/echo/...
$GOPATH/srcの下にechoproject
というディレクトリを作って作業します。
package main
import (
"net/http"
"os"
"github.com/labstack/echo"
"github.com/labstack/echo/engine/standard"
"github.com/labstack/echo/middleware"
)
func main() {
// Echo instance
e := echo.New()
// Middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
// Route => handler
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!\n")
})
// Start server
// ポート番号は環境変数から取得
e.Run(standard.New(":" + os.Getenv("PORT")))
}
ポイントとしてはHerokuは起動時にポート番号を環境変数から指定するので、"os"をインポートして可変にできるようにしました。
ローカルでは8080番で起動してみます。
cd $GOPATH/src/echoproject
export PORT=8080
go run main.go
# http://localhost:8080 に "Hello, World!"と表示されていればOK
Herokuに乗せる準備
Herokuで動かす際、echoフレームワーク本体の依存関係を保存してHeroku側に伝える必要があります。glide を使えば良いのかと思いましたが、下記によるとgodep、govendor、GBの3つしか対応していないようなので、ここではgodepを使います。
https://devcenter.heroku.com/articles/go-support#supported-dependency-vendor-managers
# godepの取得
go get github.com/kr/godep
# 私の環境では以下も必要でした
go get golang.org/x/sys/unix
# 依存関係を保存します
godep save
また、Herokuが起動するためにProcfileというファイルが必要なので作成します。
echo "web: $(basename `pwd`)" > Procfile
Procfileに "web: echoproject" とディレクトリの名前を書き込みます。
(最初ここでディレクトリの名前を echo
にしていたらシステムのコマンド名とバッティングして起動できずにハマりました...よく考えたら当たり前なんですが、echoという名前ありきたりすぎませんかね。検索もしにくいし...😓)
ここまでやると以下のような構成になります。
$GOPATH/src/echoproject
├── Godeps
│ ├── Godeps.json
│ └── Readme
├── Procfile
├── main.go
└── vendor
├── github.com
│ ├── dgrijalva
│ │ └── jwt-go
│ ├── labstack
│ │ ├── echo
│ │ └── gommon
│ ├── mattn
│ │ ├── go-colorable
│ │ └── go-isatty
│ └── valyala
│ └── fasttemplate
└── golang.org
└── x
├── net
└── sys
Herokuにデプロイ
まずはgitで管理します。
git init
git add .
git commit -m "initial commit"
Herokuにデプロイします。
# heroku側にアプリを作ります
heroku create
git push heroku master
# ブラウザで開きます
heroku open
これで完了です。うまく動かない場合はログを見てみると良いかもしれません。
heroku logs --tail
> 2016-07-03T02:36:24.386962+00:00 heroku[slug-compiler]: Slug compilation started
> 2016-07-03T02:36:24.386967+00:00 heroku[slug-compiler]: Slug compilation finished
> 2016-07-03T02:36:24.858458+00:00 heroku[web.1]: Starting process with command `echoproject`
> 2016-07-03T02:36:28.518721+00:00 heroku[web.1]: State changed from starting to up
まとめ
Go製のフレームワークechoをHerokuで動かす、ということで手順をまとめました。
HerokuがGoに正式対応しているので、少し古めの記事に出てくる .godir
のファイルを作ったり、buildpackを指定したりする作業は不要でした。とても気軽にできるようになってますね。