スポンサーリンク

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

環境

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時点)

heroku/heroku-buildpack-go
Heroku Go Buildpack. Contribute to heroku/heroku-buildpack-go development by creating an account on GitHub.

プロジェクト作成

ディレクトリ作成

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

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

動作確認 on Heroku

Herokuでアプリを作成しデプロイします。(手順は割愛)
上記のmain.goをそのまま利用する場合は、
以下の環境変数が必要ですのでセットしてください。

ENV=staging

そこまでできれば動作確認ができるようになります。

$ curl https://${YOUR_APP_NAME}.herokuapp.com/
Hello, World!

おわりに

サクッとechoを使用してHerokuにできました。
これをベースにDBへの接続設定を追加したり、コントローラを切り分けたりすれば、自前のアプリのテンプレートができそうです!

コメント

タイトルとURLをコピーしました