🍣
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時点)
プロジェクト作成
ディレクトリ作成
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