yn2011's blog

技術メモ

HerokuでDocker, Go, Postgresを使ってAPIサーバを動かしてみた感想

環境

モチベーション

  • データのCRUDを伴うWebAPI(とDB)をサクッと作って公開したい

どうやったか

  • ローカルはAPIとDB共にDockerで環境構築
    • APIはそのDockerfileを使ってHerokuにデプロイ
    • DBはHeroku addonsのPostgresを使用
  • APIの実装はgin, gormを使って楽をした
  • スキーマのmigrationはgoose(下の記事で使われてたのでそのまま使った)

できたもの

https://infinite-hollows-34092.herokuapp.com/api/ping

GETリクエストすると現在日時を格納する。これまでに格納された現在日時を全て返す。

github.com

手順

以下の手順に従って進めた。上記のコードはほぼ以下の記事のコードの写経に近い。フロントエンドがないのとgormを使っている点が違うだけ。

以下、感想を書きます。

Heroku addonsのPostgresについて

今まで使ったことなかったけど、コマンド1つでクラウド上にDBを作成できてここまで色々できるの凄いなと思った。

Dataclips

data.herokuのDataclipsを使うとブラウザからPostgresを参照できる。参照系のクエリを書くのでViewみたいな感じ。 このViewに対するURLを発行することもできて外部連携も可能な模様。

f:id:pokuwagata:20200222155840p:plain

pgsql

ターミナルからpg:psqlで接続することも可能。

❯ heroku pg:psql
--> Connecting to postgresql-rectangular-83658
psql (12.1)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

infinite-hollows-34092::DATABASE=> delete from ping_timestamp where id = 4;
DELETE 1
infinite-hollows-34092::DATABASE=> select * from ping_timestamp;
 id |           occurred
----+-------------------------------
  1 | 2020-02-22 06:06:15.302206+00
  2 | 2020-02-22 06:06:26.004438+00
  3 | 2020-02-22 06:06:33.051055+00
(3 rows)

infinite-hollows-34092::DATABASE=> \q

Dockerを利用したHeroku デプロイについて

Dockerfileを使ってHerokuにデプロイするためにheroku.ymlを書く。例えば今回は以下になる。

build:
  docker:
    web: Dockerfile
    worker:
      dockerfile: Dockerfile
      target: builder    
release:
  image: worker
  command:
    - ./migrate.sh

ちょっとイメージしにくかったのがreleaseフェーズで使用されるworkerの部分

  • このDockerfileではmulti stage buildをしていて、Goのモジュールのビルドと実行を分離している
  • releaseフェーズではPostgresに対してmigrationを実行するだけだが、その実行環境をworkerとしてbuildフェーズで事前にビルドしている
    • なので同一のDockerfileを元に2つのイメージを作成している。webの方はGoのビルドと実行までで、workerはGoのビルドまで。

これは実際に$ git push heroku masterしてHerokuが出力してくれるログを眺めると何をしているのかが分かって良かった

その他

  • Netlify, Heroku, Firebase等、遊びで何かを作って公開するのが楽な時代になった
  • 業務のサービス開発にいつも使えるとは限らないけど、選択肢として持っておくべきと思う
    • 仮説検証的・速度重視の開発や、パフォーマンスを求められない単機能なWebAPIの開発など?