親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

herokuでGoのGinを動かしてみる

herokuでGo

herokuは非常に便利なPaasですよね。
アプリケーション開発では、せっかく開発が終わったのにも関わらず、サーバの準備でまた時間がかかってしまうのが面倒ですよね。
それほどインフラ面にこだわりがあるわけではないのに。
そんな時にherokuはとても便利です。
あらゆる言語やフレームワークのアプリが、迅速にデプロイできるようになります。
しかも無料枠もあるので、ちょっと作ってみたサービスをデプロイしてみたい時など、herokuはもってこいのサービスです。

あらゆる言語やフレームワークが簡単にデプロイできると述べましたが、もちろんGoも例外ではありません。
通常のサーバであれば、Nginxを準備して...などしなくてはいけませんが、herokuではソースにちょっとひと工夫で十分です。

Goのソースでやること

今回はGoをポート8080で動かすものとします。
GoのフレームワークとしてはGinを使用しています。
また、アカウントの作成等は既に済んでおり、デプロイの準備が整っているものとします。

記述する内容としては非常にシンプルで簡単です。

Ginのソースには「gin.Default()」と「Run()」を使用した以下の記述が書かれていると思います。

func main() {
    ・
    ・
  r := gin.Default()
  r.Run(":8080")
    ・
    ・
}

ここをherokuでは以下のように「http.ListenAndServe()」を使用するように変更すれば良いのです。

import (
  "net/http" // httpをインポート
)
func main() {
    ・
    ・
  r := gin.Default()
  http.ListenAndServe(":8080", r)
    ・
    ・
}

この状態で同じみの

git push heroku master

を打ってソースをアップすればOKです。

非常に簡単ですよね。
ではローカル環境と本番環境(herokuの環境)でどうやったら切り分けたら良いのでしょう?
それについては以下のような記事を書いているので参考にしてみてください。
ti-tomo-knowledge.hatenablog.com

最終形(まとめ)

最終的に、なんとなく以下のようにできればローカル環境でもherokuの環境でも起動します。

import (
  "net/http" // httpをインポート
)
func main() {
    ・
    ・
  r := gin.Default()
  EnvErr := godotenv.Load(fmt.Sprintf("./%s.env", os.Getenv("GO_ENV")))
  if EnvErr != nil {
    http.ListenAndServe(":8080", r)
  } else {
    r.Run(":9000")
  }
    ・
    ・
}