Go modulesが入って、GolangのHerokuへのデプロイがだいぶ簡単になっていたので、備忘録のためプロジェクトの作成から確認までの手順を書いておきます。
環境
- go 1.13
- echo v3.3.10
前提
- Go(1.11+) インストール済
- Download and install - The Go Programming Language
- Go modules使えればOK
- Heroku CLIがインストール済
- 環境変数PORTが設定済 (direnv使っておくと設定が楽です)
ローカルで動くまで
プロジェクトディレクトリ作成
以下のようなディレクトリを作ります。
mkdir golang-sample cd golang-sample
簡単なリクエストを受け付けるGolangのコードを作る
簡単なリクエストを受け付ける以下のようなGolangのコード( main.go
)を golang-sample
ディレクトリ内に作ります。
package main import ( "os" "net/http" "github.com/labstack/echo" ) type Book struct { Title string `json:"title"` Author string `json:"author"` } func main() { // Echo インスタンスをNew e := echo.New() // ルーティング設定 e.GET("/books/:id", bookHandler) // サーバ起動 e.Start(":"+os.Getenv("PORT")) } // ハンドラ func bookHandler(c echo.Context) error { return c.JSON(http.StatusOK, getBook()) } func getBook() *Book { b := &Book{ Title: "Golangの本", Author: "Golangの本の著者", } return b }
HerokuではWeb worker processにポートが紐付けられるのでos.Getenv("PORT")
で、PORT番号を取ってきます。
Herokuの以下のドキュメントに記載があります。
Runtime Principles | Heroku Dev Center
echoインストール
echoインストールします。
$ go get github.com/labstack/echo
動作確認
以下を実行し
$ go run main.go
をブラウザで開きます。
こんな感じの見た目になります。
Heroku上で動くまで
Procfile作成
Procfileを作ります。HerokuのWeb Workerノードが起動したら最初に実行するコマンドを記載します。 Herokuにコードをデプロイした際に、bin配下にバイナリが生成されるので、それを起動するようにします。
web: bin/golang-sample
依存関係ファイルを作る (go modules)
以下のコマンドを実行し、go modulesの依存関係ファイルを作ります。
$ go mod init $ go build
すると、go.mod, go.sum というファイルができます。
Git初期化する
$ git init $ git add . $ git commit -m "initial commit" 5 files changed create mode 100644 .gitignore create mode 100644 Procfile create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go
Procfile, go.mod, go.sum, main.goの4ファイルがあれば動くなんてお手軽!
herokuプロジェクト作成し、デプロイする
$ heroku create golang-sample-202005 $ git push heroku master
動作確認
URLにアクセスするとローカルで確認した画面と同じものが表示されます。
https://golang-sample-202005.herokuapp.com/books/1