🎉

HerokuにGoアプリをデプロイした

2021/07/26に公開

はじめに

この記事ではHerokuにGoアプリをデプロイする方法について書きます。

この記事では以下を前提としています。

  • Heroku CLIをインストールし、ログインしている
  • GoアプリはGitで管理している
  • Goアプリの依存管理はGo Modulesを使用している

この記事が他の人の参考になれば幸いです。
また、この記事の内容に間違った記載がありましたら、指摘してもらえるとありがたいです。

環境

名前 バージョン
macOS Big Sur 11.5
Go 1.16.5
Heroku CLI 7.56.1

デプロイ

最初のデプロイ

初回のHerokuへのデプロイは以下の手順で行います。

  1. go.modでHerokuで使用するGoのバージョンを指定する
  2. Procfileを作成する
  3. Heroku CLIでデプロイする

まず、go.modファイルにHerokuで使用するGoのバージョンを指定します。
// +heroku goVersion go1.16のコメントで指定しています。

go.mod
module github.com/minguu42/myapp

go 1.16
// +heroku goVersion go1.16

...

次に、Procfileを作成します。
Procfileでは実行するバイナリを指定します。
バイナリが一つの場合などではProcfileを作成しなくてもHerokuが自動でバイナリを選択しますが、ローカルでの実行時などには必要なので作成します。
myappは自分のmainパッケージ名に合わせて変更してください。

Procfile
web: bin/myapp

最後に以下の一連のコマンドでデプロイできます。
Goアプリのビルドや実行などはHeroku側で自動的に行ってくれます。

terminal
# Heroku アプリを作成する
heroku create [appName]

# Heroku にデプロイする
git push heroku main

以後のデプロイ

初回のデプロイ後は以下のコマンドでデプロイできます。

terminal
git push heroku main

環境変数

Heroku環境での環境変数は以下のコマンドで扱えます。

環境変数を一覧表示

terminal
heroku config

環境変数の追加

KEYVALUEは適切な値に変更してください。

terminal
heroku config:set KEY=VALUE

環境変数の削除

terminal
heroku config:unset KEY

データベース

Herokuではプラグインを使用し、データベースを扱えます。
ここではMySQLを扱う方法を見ていきます。

以下のコマンドでMySQLのプラグインを追加します。

heroku addons:create jawsdb:kitefin

コマンドの実行後は複数の環境変数が追加されます。
GoアプリのDBと接続するコードで環境変数を読み込み、DBと接続するようにして下さい。

実際にデータベースが立ち上がっているかは以下のコマンドで接続し、確認できます。
userpasswordhostdatabaseは上記のコマンドで追加された環境変数から確認できます。

terminal
mysql -u <user> -p -h <host> -D <database>

main ブランチ以外のブランチでデプロイしたい

実行に必要な秘密ファイルをGitHubに上げたくないがHerokuには上げたい場合などmainブランチ以外のブランチをデプロイしたい場合はあると思います。
Herokuはmainブランチのみをビルドし、デプロイするのでそのままプッシュしてもデプロイできません。
以下のコマンドでHerokuにプッシュしてデプロイできます。

terminal
git push heroku <branch name>:main

Heroku CLIの便利なコマンド

ローカルで実行する

ローカルでビルドし、Procfileに従って実行します。
環境変数は.envファイルを読み込みます。
myappは適宜変更して下さい。

terminal
# Go アプリをビルドする
go build -o bin/myapp -v .

# Heroku をローカルで実行する
heroku local web

ログを表示する

terminal
heroku logs --tail

Herokuアプリの名前を変更する

terminal
heroku apps:rename <appName>

参考

GitHubで編集を提案

Discussion