Kongの間違えた使い方を通して、Kongとは何かをざっくり伝える


# はじめに
マイクロサービスを作ったのだが、エンドポイントや、
新しいサービスが増えるごとに管理が煩雑になってしまう。

- 新しいドメインを増やしたり
- ドキュメントがバラバラになったり

なんとかしたい、というときに、[Kong](https://getkong.org/)を知った。

Kongとは、[APIゲートウェイ](https://www.ogis-ri.co.jp/otc/hiroba/others/SilliconValley5/)をお手軽に実装できるもののようだ。

今回はそのKongの間違った使い方をして、何ができるのかを分かるようにする。

# インストール方法
Dockerのイメージから作るのが手っ取り早い。
もちろん[Docker以外にもインストール方法はある](https://getkong.org/install/)。

## docker-machineを利用しよう
ポート80が空いているほうが、あとあと面白いので、新しいdocker-machineを作る。
virtualboxを利用しているのであれば、以下の通り。
AWSを利用したいのであれば、[この記事](http://qiita.com/tomoyamachi/items/5bb3fff14dc02c51f097#docker-machine%E7%B5%8C%E7%94%B1%E3%81%A7amazon-ec2%E3%81%AB%E3%83%9B%E3%82%B9%E3%83%88%E3%82%92%E8%BF%BD%E5%8A%A0%E6%9D%B1%E4%BA%AC%E3%83%AA%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3)を参考にdocker-machineをつくる。

```
$ docker-machine create --driver virtualbox bookmark
Running pre-create checks...
(bookmark) Default Boot2Docker ISO is out-of-date, downloading the latest release...
(bookmark) Latest release for github.com/boot2docker/boot2docker is v1.12.0
(bookmark) Downloading /Users/amachi/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v1.12.0/boot2docker.iso...
...<略>
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env bookmark
```

## kong用の環境をつくる
では立ち上げたdocker-machineに入って、必要なコンテナを作ろう。
kongに入る情報を保存するために、cassandraとpostgrelが利用できるが、今回はcassandraを利用する。

```
$ docker-machine ssh bookmark
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.12.0, build HEAD : e030bab - Fri Jul 29 00:29:14 UTC 2016
Docker version 1.12.0, build 8eab29e
docker@bookmark:~$ docker run -d --name kong-database \
              -p 9042:9042 \
              cassandra:2.2

docker@bookmark:~$ docker run -d --name kong \
              --link kong-database:kong-database \
              -e "DATABASE=cassandra" \
              -p 80:8000 \
              -p 8443:8443 \
              -p 8001:8001 \
              -p 7946:7946 \
              -p 7946:7946/udp \
              --security-opt seccomp:unconfined \
              mashape/kong
```

## 起動の確認
cassandraなどの起動がすべて終わった後でないと動かないので注意。
以下のコマンドですぐにレスポンスが返ってこなくても、少し待ってみたほうがいい。

```
$ curl http://$(docker-machine ip bookmark):8001/apis
{"data":[],"total":0} # ← これが帰ってくれば成功
```

## kongにendpointを追加
docker-machine内からでも、docker-machine外からでもいいのだが、
kongサーバにAPIの情報を送る。詳しいパラメータの情報は後述する。

今回はdocker-machine内からkongサーバに登録するようにした。

```
docker@bookmark:~$ curl -i -X POST \
>   --url http://localhost:8001/apis/ \
>   --data 'name=yahoo' \
>   --data 'upstream_url=http://www.yahoo.co.jp/' \
>   --data 'strip_request_path=true' \
>   --data 'request_path=/yahoo' --data 'request_host=www.yahoo.co.jp'
HTTP/1.1 201 Created
Date: Fri, 29 Jul 2016 10:01:23 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/0.8.3

{"upstream_url":"http:\/\/www.yahoo.co.jp\/","strip_request_path":true,"request_path":"\/yahoo","id":"e980e20b-1e32-4ebf-8f78-ec0d7a17b42f","created_at":1469786483000,"preserve_host":false,"name":"yahoo","request_host":"www.yahoo.co.jp"}
docker@bookmark:~$ curl -i -X POST \
>   --url http://localhost:8001/apis/ \
>   --data 'name=qiita' \
>   --data 'upstream_url=http://qiita.com/' \
>   --data 'strip_request_path=true' \
>   --data 'request_path=/qiita' --data 'request_host=qiita.com'
HTTP/1.1 201 Created
Date: Fri, 29 Jul 2016 10:02:08 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Access-Control-Allow-Origin: *
Server: kong/0.8.3

{"upstream_url":"http:\/\/qiita.com\/","strip_request_path":true,"request_path":"\/qiita","id":"840de9fd-ae43-4b2c-84ac-e1f2fcb584b0","created_at":1469786528000,"preserve_host":false,"name":"qiita","request_host":"qiita.com"}
```

コマンドのみ抜き出し

```
curl -i -X POST \
  --url http://localhost:8001/apis/ \
  --data 'name=yahoo' \
  --data 'upstream_url=http://www.yahoo.co.jp/' \
  --data 'strip_request_path=true' \
  --data 'request_path=/yahoo' --data 'request_host=www.yahoo.co.jp'

curl -i -X POST \
  --url http://localhost:8001/apis/ \
  --data 'name=qiita' \
  --data 'upstream_url=http://qiita.com/' \
  --data 'strip_request_path=true' \
  --data 'request_path=/qiita' --data 'request_host=qiita.com'
```

## hostsにdocker-machineを追加

今回作成したdocker-machineのPrivateIPアドレスをhostsに追加する。

```
$ echo "$(echo $(docker-machine ip bookmark))  bookmark" | \
  sudo tee -a /etc/hosts
  
$ cat /etc/hosts
...<略>
192.168.99.101  bookmark
```

## ブラウザで[bookmark/qiita](http://bookmark/qiita)を開く
qiitaのトップページが開けた。
別のエンドポイントで登録したyahooも見てみる。

![yahoo.png](https://qiita-image-store.s3.amazonaws.com/0/14275/20c84bee-27fc-91a8-2f01-251101ce97e3.png "yahoo.png")

表示されている。

# まとめ
こんな感じで、それぞれのリソースを一箇所で管理できた。
そして、登録しているAPI情報を取ってくることもできる。

![apis.png](https://qiita-image-store.s3.amazonaws.com/0/14275/5b9aa228-9658-e0ed-8ca1-da64adaeb3fe.png "apis.png")

マイクロサービスを構成する複数のエンドポイントを一元管理するために利用するのによさそう。