GolangのWebアプリケーションをとにかく簡単に公開したいのでHerokuにデプロイしてみた
はじめに
フロントエンドエンジニアとしてお仕事をさせていただいている私ですが、HTTPやデータベースなどを学びたくて勉強がてらGolangで簡単なAPIを作ってみました。
DockerやAWSを使ってデプロイしたいと考えましたが現在学びたい領域はインフラではないので、とにかく簡単に公開するために普段使い慣れているHerokuを使って公開してみました。
本当に分からない事だらけなので、間違っている点があれば優しくご指摘いただけると幸いです。
概要
GitHubにソースコードをpushするとあらかじめ連携しておいたHerokuに自動でデプロイされる様に設定しています。また、データベースはPostgreSQLを使用しています。
リポジトリは下記になりますが、これから手を加えていく予定ですので2021/02/15時点のコードを参考にしてもらえればと思います。
コードの変更
Herokuに公開する場合は一部コードを変更する必要があります。
Herokuにデプロイする場合はポート番号を自由に設定できない様なので環境変数からポート番号を読み取るように変更します。
server := http.Server{
// 環境変数からポート番号を取得
Addr: ":" + os.Getenv("PORT"),
}
次に、データベースドライバ名とデータソース名を指定する記述を変更します。こちらも環境変数から取得される様に設定しておきます。
// データソース名を環境変数から取得
DB, err = sql.Open("postgres", os.Getenv("DATABASE_URL"))
依存ファイル郡を取得
Helokuではgodepを使って依存ファイルを管理します。go get
でgodepを取得します。
$ go get github.com/tools/godep
次にWebアプリケーションのルートディレクトリで下記コマンドを実行します。これによって依存ファイルがディレクトリ内に作成されます。
$ godep save
Procfileの作成
ルートディレクトリにProcfile
の名前でファイルを作成します。これはHerokuのビルドが完了した後に実行するファイルを指定しています。
web: gocomm
HerokuにPostgreSQLを用意
まずはHerokuにログインします。
$ heroku login
アドオンを使ってデータベースを追加します。--app=go-comm
のgo-comm
はご自身のサービスに変更してください。
$ heroku addons:create heroku-postgresql:hobby-dev --app=go-comm
これによってデータベースが作成され環境変数が設定されます。以下のコマンドでアプリの構成変数を一覧表示し、DATABASE_URL
の値を確認することができます。
$ heroku config --app go-comm
=== go-comm Config Vars
DATABASE_URL: postgres://dlrhbionqjnobw:988d2b~~~~~
データベースが作成できたら、Herokuのpsqlにログインします。
$ heroku pg:psql --app go-comm
ログインした状態でテーブルを作成します。今回はセットアップ用のSQLファイルを用意していたのでそれを実行しました。適宜書き換えてください。
$ \i ./data/setup.sql
テーブルが作成されているのを確認できればOKです。
$ \d
GitHubとHerokuの連携
HerokuのプラットフォームにログインしてDeploy
タブから対象のGitHubリポジトリの設定と自動デプロイを有効化するだけで連携は完了です。
連携が完了したらあとはGitHubにコードの変更をpushすると自動デプロイが実行されるはずです。
curlでAPIの動作確認
API自体の説明は記事の趣旨から逸れるので省きますが、curlを使ってAPIが正常に動作するか確認してみます。新しい投稿を追加するためにJSONデータをPOSTします。
$ curl -i -X POST -H "Content-Type: application/json" -d '{"content": "My first post", "author": "kazuhe"}' https://go-comm.herokuapp.com/post/
先ほどPOSTした投稿をGETリクエストで取得してみます。
$ curl -i -X GET https://go-comm.herokuapp.com/post/1
キター----!!
意図したレスポンスを取得できたのでこれにて公開完了です。
注意
ひとまず公開は完了しましたが今のままでは誰でもAPIを叩けてしまいます。
セキュリティ的によろしくないと思うのでAPIキーの設定等(まだ勉強不足ですが他にもやるべきことはありそう..)を今後していこうと思います。
※このWebアプリケーション(Herokuサービス)は一旦非公開にしています。
参考
公式が分かりやすいので詳細はこちらからご確認ください。日本語対応もしているみたいです。
Discussion