Golang EchoプロジェクトをHerokuにデプロイしてみた (依存パッケージ管理: go module)

Go modulesが入って、GolangのHerokuへのデプロイがだいぶ簡単になっていたので、備忘録のためプロジェクトの作成から確認までの手順を書いておきます。

環境

  • go 1.13
  • echo v3.3.10

前提

ローカルで動くまで

プロジェクトディレクトリ作成

以下のようなディレクトリを作ります。

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

http://localhost:8080/books/1

をブラウザで開きます。

こんな感じの見た目になります。

f:id:moritamorie:20200520011205p:plain

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

f:id:moritamorie:20200520011205p:plain

作ったGolangサンプルプロジェクト

github.com

参考