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

[Go製のフレームワークechoを使ってJSONを返すWebサーバーを作り、GoogleAppEngineで動かす](http://qiita.com/qube81/items/701279c43b33ce923613)
という記事を書きましたが、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で取得していない場合は取得します

```bash
go get github.com/labstack/echo/...
```

$GOPATH/srcの下に`echoproject`というディレクトリを作って作業します。

```go:$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番で起動してみます。

```bash
cd $GOPATH/src/echoproject
export PORT=8080
go run main.go
# http://localhost:8080 に "Hello, World!"と表示されていればOK
```

## Herokuに乗せる準備
Herokuで動かす際、echoフレームワーク本体の依存関係を保存してHeroku側に伝える必要があります。[glide](https://github.com/Masterminds/glide) を使えば良いのかと思いましたが、下記によるとgodep、govendor、GBの3つしか対応していないようなので、ここではgodepを使います。
https://devcenter.heroku.com/articles/go-support#supported-dependency-vendor-managers

```bash
# godepの取得
go get github.com/kr/godep
# 私の環境では以下も必要でした
go get golang.org/x/sys/unix
# 依存関係を保存します
godep save
```

また、Herokuが起動するためにProcfileというファイルが必要なので作成します。

```bash
echo "web: $(basename `pwd`)" > Procfile
```

Procfileに "web: echoproject" とディレクトリの名前を書き込みます。

（最初ここでディレクトリの名前を `echo` にしていたらシステムのコマンド名とバッティングして起動できずにハマりました...よく考えたら当たり前なんですが、echoという名前ありきたりすぎませんかね。検索もしにくいし...😓）

ここまでやると以下のような構成になります。

```bash
$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で管理します。

```bash
git init
git add .
git commit -m "initial commit"
```

Herokuにデプロイします。

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