GolangおよびDockerを用いた簡単なREST APIを作成した.
Userに関するName, Emailのカラムの登録および取得が可能になっている.
変えたよ
root/
├ postgres/ Postgresqlを初期化するためのsqlのスクリプト
│
├ .env localで実行する際のポート番号などの環境変数
│
├ Dockerfile docker立ち上げに必要な処理など
│
├ docker-compose.yml dbとappを同時に立ち上げる
│
└ main.go REST APIをここで提供
手元の環境でビルドを行うにはrootディレクトリで以下のコマンドを実行する.
$ docker-compose build
$ docker-compose up -d
その後,以下のURLにアクセスすることでレスポンスが表示される.
http://localhost:8080/
リクエスト
$ curl -XGET -H 'Content-Type:application/json' http://localhost:8080/
レスポンス(json)
{"message":"Hello, World!!"}
リクエスト
$ curl -XGET -H 'Content-Type:application/json' http://localhost:8080/users
レスポンス(json)
[{"id":1,"name":"sugiyama","email":"fuga.com"},{"id":2,"name":"tanaka","email":"hoge.com"}]
リクエスト
$ curl -XGET -H 'Content-Type:application/json' http://localhost:8080/users/1
レスポンス(json)
{"id":1,"name":"sugiyama","email":"fuga.com"}]
リクエスト
$ curl -XPOST -H 'Content-Type:application/json' http://localhost:8080/users -d '{"name": "test", "email": "[email protected]" }'
レスポンス(json)
{"id":3,"name":"test","email":"[email protected]"}
このあと/usersにアクセスすると追加されていることがわかる.
[{"id":1,"name":"sugiyama","email":"fuga.com"},{"id":2,"name":"tanaka","email":"hoge.com"},{"id":3,"name":"test","email":"[email protected]"}]
(値の更新および削除は時間がなかったため省略しました)
今回はDockerを簡単にデプロイすることのできるPaaSとしてHerokuを選択した.
以下にデプロイまでの手順を示す. heroku cliを予めインストールしておく.
- herokuへログイン
$ heroku login
- 新しいappを作成
$ heroku create docker-webapp-2
- ローカルのディレクトリをpushし,その結果をheroku側に反映させる
$ heroku container:push web --app docker-webapp-2
$ heroku container:release web --app docker-webapp-2
- 公開が完了したのでURLにアクセスする.
今回は以下のURLにサンプルプログラムをデプロイした.
http://docker-webapp-2.herokuapp.com/
ローカルで実行したリクエストのURL部分を "http://docker-webapp-2.herokuapp.com/" に置き換えることで同様の結果を得ることができる.
## 達成したこと
- ローカルでのdocker-composeを用いたappとdbの同時起動
- Postgresqlに対する読み書きの実装
- Golangを用いたGET, POSTリクエストの受付およびレスポンスの返却
- Herokuへのdocker環境のデプロイ
- エラー処理
あらゆるパターンに対するエラー処理を実装する余裕がなかった. 存在しないIDのデータにアクセスしようとするなどの例外に対応しきれていない.
parseの仕方などを自己流で書いたため冗長な部分も多い. - Heroku環境へのPostgresqlの反映
docker-composeでPostgresqlのDBをHeroku上に生成するように設定しようとしたが,様々な方法を用いてもうまくいかなかった.
Heroku上に手動でPostgresqlを作成しそのDBに関する情報を環境変数として持つことで仮の接続状態を作ったが,今回の目標であるdockerによる自動生成はできていない.