KONG v1.3.0 環境構築とルート設定まで

# 環境

* vagrant (coreos)
* docker (docker-compose)
* postgresql
* kong (1.3.0)



# 参考にしたページ

* [Qiita - Docker for MacからVagrant + CoreOSに切り替えた](https://qiita.com/Ucan/items/545ce4d8e32580091bc9)
    * 固定IPとかポートフォワードとかは作業しやすいよう修正
* [DockerHub - kong](https://hub.docker.com/_/kong)
    * DESCRIPTIONを参考にdocker-composeを記述
* [Kong - GettingStarted](https://docs.konghq.com/1.3.x/getting-started/introduction/)
* [Kongの使い方を知る①　～Service & Route編～
](https://b-rabbit.jp/article/article01/index.html)
    * 今回kongaは使ってないです

# 環境構築

## vagrant

coreosのVagrantfileをコピーして終了
docker-composeは好きな方法でインストールしてください。

* [Qiita - Docker for MacからVagrant + CoreOSに切り替えた](https://qiita.com/Ucan/items/545ce4d8e32580091bc9)

ブラウザとかでもアクセスできるように、8000と8001をフォワード。

## docker設定

kongのdockerhubのページにpostgresから設定する方法が全部書いてある。
環境変数とポートの設定をそのまま記述してdocker-compose upする

```docker-compose.yml
version: "3"
volumes:
  kong-vol:

services:
  kong-db:
    image: "postgres:9.6"
    container_name: "kong-db"
    environment:
      POSTGRES_USER: "kong"
      POSTGRES_PASSWORD: "kong"
      POSTGRES_DB: "kong"

  kong-migrate:
    image: "kong:latest"
    container_name: "kong-migrate"
    depends_on:
      - "kong-db"
    environment:
      KONG_DATABASE: "postgres"
      KONG_PG_HOST: "kong-db"
      KONG_PG_USER: "kong"
      KONG_PG_PASSWORD: "kong"
      KONG_CASSANDRA_CONTACT_POINTS: "kong-db"
    command: "kong migrations bootstrap"
    restart: "on-failure:3"

  kong:
    image: "kong:latest"
    container_name: "kong"
    environment:
      KONG_DATABASE: "postgres"
      KONG_PG_HOST: "kong-db"
      KONG_PG_USER: "kong"
      KONG_PG_PASSWORD: "kong"
      KONG_CASSANDRA_CONTACT_POINTS: "kong-db"
      KONG_PROXY_ACCESS_LOG: "/dev/stdout"
      KONG_ADMIN_ACCESS_LOG: "/dev/stdout"
      KONG_PROXY_ERROR_LOG: "/dev/stderr"
      KONG_ADMIN_ERROR_LOG: "/dev/stderr"
      KONG_ADMIN_LISTEN: "0.0.0.0:8001, 0.0.0.0:8444 ssl"
    ports:
      - "8000:8000"
      - "8443:8443"
      - "8001:8001"
      - "8444:8444"
    depends_on:
      - "kong-migrate"
    restart: "on-failure:3"
```

DBの初期化タイミングの問題でkong-migrateとkongの起動が失敗するためrestartを設定してる。
他にいい方法があったら教えてクレメンス。

## service登録

[Kong - GettingStarted](https://docs.konghq.com/1.3.x/getting-started/introduction/)

管理API(:8001)の `/services` を叩くとサービス登録できる

```bash
$ curl -X POST http://localhost:8001/services --data 'name=example-service' --data 'url=http://mockbin.org' | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                                                                                                                                   
                                 Dload  Upload   Total   Spent    Left  Speed                                                                                                                                                     
100   339  100   296  100    43    977    142 --:--:-- --:--:-- --:--:--   980                                                                                                                                                    
{                                                                                                                                                                                                                                 
  "host": "mockbin.org",                                                                                                                                                                                                          
  "created_at": 1570950317,                                                                                                                                                                                                       
  "connect_timeout": 60000,                                                                                                                                                                                                       
  "id": "18e5e341-14bf-4998-849e-31d7c10194ef",                                                                                                                                                                                   
  "protocol": "http",                                                                                                                                                                                                             
  "name": "example-service",                                                                                                                                                                                                      
  "read_timeout": 60000,                                                                                                                                                                                                          
  "port": 80,                                                                                                                                                                                                                     
  "path": null,                                                                                                                                                                                                                   
  "updated_at": 1570950317,                                                                                                                                                                                                       
  "retries": 5,                                                                                                                                                                                                                   
  "write_timeout": 60000,                                                                                                                                                                                                         
  "tags": null,                                                                                                                                                                                                                   
  "client_certificate": null                                                                                                                                                                                                      
}               
```

example-serviceというサービスを登録
渡せるパラメータの説明は以下が優しい
[Kongの使い方を知る①　～Service & Route編～
](https://b-rabbit.jp/article/article01/index.html)

## route設定

`/services/<service name>` を叩くとルート設定できる

```bash
$ curl -X POST --url http://localhost:8001/services/example-service/routes --data 'hosts[]=localhost' --data 'paths[]=/test' | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   443  100   412  100    31  14531   1093 --:--:-- --:--:-- --:--:-- 14714
{                                                       
  "id": "44f2c7b0-f263-4faa-af5e-681093067d21",
  "tags": null,                                         
  "updated_at": 1570950317,                             
  "destinations": null,                                 
  "headers": null,                                      
  "protocols": [                                        
    "http",                                             
    "https"                                             
  ],                                                    
  "created_at": 1570950317,                             
  "snis": null,                                         
  "service": {                                          
    "id": "18e5e341-14bf-4998-849e-31d7c10194ef"
  },                                                    
  "name": null,                                         
  "preserve_host": false,                               
  "regex_priority": 0,                                  
  "strip_path": true,                                   
  "sources": null,                                      
  "paths": [                                            
    "/test"                                             
  ],                                                    
  "https_redirect_status_code": 426,
  "hosts": [                                            
    "localhost"                                         
  ],                                                    
  "methods": null                                       
}
```

上記の場合は、`localhost:8000/test` にアクセスがきた時にさっき登録したexample-serviceのurlにフォワードする設定ができる