🍣

go/echoをHerokuにデプロイする

2021/09/23に公開

環境

Go 1.11+ (Go Modulesを利用 参考: Go Modules)
私の実行環境は以下

$ go version
go version go1.13.7 darwin/amd64

HerokuでサポートしているGoのバージョンは以下。
デフォルトが1.12.17で最新で1.14が利用可能となっています。(2020/07/20時点)

https://github.com/heroku/heroku-buildpack-go/blob/master/data.json#L3

プロジェクト作成

ディレクトリ作成

mkdir -p ${GOPATH}/src/github.com/${YOUR_ACCOUNT}/${NEW_PROJECT}
cd ${GOPATH}/src/github.com/${YOUR_ACCOUNT}/${NEW_PROJECT}

gitの初期化

git init

Go Modulesの初期化
↓を実行するとgo.modが生成されます。

go mod init

main.go
Herokuで実行するためにはPORTを環境変数から取得する必要があります。
ローカルで実行するときは.envファイルから取得するようにしています。
その他はお好みで..。

package main

import (
	"os"
	"github.com/sirupsen/logrus"
	"github.com/labstack/echo/v4"
	"net/http"
	"github.com/joho/godotenv"
)

func init() {

	errDotEnv := godotenv.Load()
	if errDotEnv != nil {
		logrus.WithFields(logrus.Fields{"error": errDotEnv}).Info("Failed to load .env")
	}

	// set up logger
	if os.Getenv("ENV") == "production" {
		logrus.SetLevel(logrus.InfoLevel)
	} else {
		logrus.SetLevel(logrus.DebugLevel)
	}
	logrus.SetFormatter(&logrus.JSONFormatter{})
}

func main() {

	port := os.Getenv("PORT")
	if port == "" {
		logrus.Fatal("$PORT must be set")
	}

	router := router()

	host := ""
	env := os.Getenv("ENV")
	if env == "" || env == "dev" {
		// macで毎回warningが出ないようにする
		host = "localhost"
	}
	logrus.Fatal(router.Start(host + ":" + port))
}

func router() *echo.Echo  {
	e := echo.New()
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})

	return e
}

.env

ENV=dev
PORT=8080

以上のファイルができたらローカルで実行できるか確認しましょう。

$ go run main.go

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.1.16
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on 127.0.0.1:8080

リクエストをなげてみると以下のようにレスポンスが返ってきたらOKです。

$ curl localhost:8080
Hello, World!

.gitignoreを作成。

.env
echo-heroku-template

Go Modulesの依存モジュールをインストール
go.sumとビルドされたecho-heroku-templateが生成される。

go build

Herokuでプロセスを起動するためのProcfileを生成

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

以上でプロジェクトの作成は完了です。

Discussion