Posted at

Go製のフレームワークechoをHerokuで動かす

More than 3 years have passed since last update.

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というディレクトリを作って作業します。


$GOPATH/src/echoproject/main.go

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を指定したりする作業は不要でした。とても気軽にできるようになってますね。