tyk で API Gateway を作ってみた【パート3: Gateway REST API作成編】

tykでAPI Gatewayを作りました。
本ページではGateway REST APIの作成手順を紹介します。
##実装環境
```Terminal
$ sw_vers

ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G1314
```
##参考文献
tyk docsの内容を日本語で紹介します。
補足説明を追加しました。

https://tyk.io/docs/get-started/with-tyk-on-premise/tutorials/tyk-on-premise-community-edition/create-api/

https://tyk.io/blog/docs/tyk-api-gateway-v1-9/tutorials/set-up-your-first-api/

##前提条件
###1. 以下の手順が完了していること。
tykでAPI Gatewayを作ってみた【パート1: コンポーネント起動編】
https://qiita.com/yuke/items/7ae1a8f128f6c9666638

tykでAPI Gatewayを作ってみた【パート2: フリーライセンス設定編】
https://qiita.com/yuke/items/3af46d5687e88df7abaf

###2. 各tykコンポーネントが起動していること。

```Terminal
$ docker ps

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                              NAMES
d2e747682911        tykio/tyk-dashboard         "/opt/tyk-dashboard/…"   2 hours ago         Up 2 hours          0.0.0.0:3000->3000/tcp, 5000/tcp   tyk_dashboard
a795dffcb319        tykio/tyk-pump-docker-pub   "/opt/tyk-pump/tyk-p…"   2 hours ago         Up 2 hours                                             tyk_pump
3ee9ce03c05d        mongo                       "docker-entrypoint.s…"   2 hours ago         Up 2 hours          27017/tcp                          tyk_mongo
b10dfc0ab897        tykio/tyk-gateway           "./entrypoint.sh"        2 hours ago         Up 2 hours          0.0.0.0:8080->8080/tcp             tyk_gateway
eddda2d57848        redis                       "docker-entrypoint.s…"   2 hours ago         Up 2 hours          6379/tcp                           tyk_redis
```

##手順
1. jsonファイルの作成
2. API Keyの作成

###1. jsonファイルの作成
####API Secretの取得 (tyk.confの"secret")
```Terminal
$ docker exec -it tyk_gateway bash
$ cat tyk.conf
{
  "listen_port": 8080,
  "secret": <<省略>>
  "template_path": "/opt/tyk-gateway/templates",
  "tyk_js_path": "/opt/tyk-gateway/js/tyk.js",
  "middleware_path": "/opt/tyk-gateway/middleware",
  "use_db_app_configs": false,
  "app_path": "/opt/tyk-gateway/apps/",
  "storage": {
    "type": "redis",
    "host": "redis",
    "port": 6379,
    "username": "",
    "password": "",
    "database": 0,
    "optimisation_max_idle": 100
  },
<<省略>>
```
###test APIのjsonファイルの作成
####api1.jsonを作成して以下のコードをコピペ
```Terminal
$ vi api1.json
```
```Terminal
  {
      "name": "Test API",
      "slug": "test-api",
      "api_id": "1",
      "org_id": "1",
      "auth": {
          "auth_header_name": "Authorization"
      },
      "definition": {
          "location": "header",
          "key": "x-api-version"
      },
      "version_data": {
          "not_versioned": true,
          "versions": {
              "Default": {
                  "name": "Default",
                  "use_extended_paths": true
              }
          }
      },
      "proxy": {
          "listen_path": "/test-api/",
          "target_url": "http://httpbin.org/",
          "strip_listen_path": true
      },
      "active": true
  }
```
####api1.jsonをtyk_gatewayの/appsに格納（パート１で作成）
```Terminal
$ mv api1.json ./apps/.
```
####tyk_gatewayを再起動。
```Terminal
$ docker restart tyk_gateway
```
####tyk_gatewayのlogでAPIのloadを確認
```Terminal
<<省略>>
time="May 20 08:19:12" level=info msg="Loading policies" 
time="May 20 08:19:12" level=info msg="Starting gateway rate limiter notifications..." 
time="May 20 08:19:12" level=info msg="Policies found (1 total):" 
time="May 20 08:19:12" level=info msg=" - default" 
time="May 20 08:19:12" level=info msg="Loading API Specification from /opt/tyk-gateway/apps/api1.json" 
time="May 20 08:19:12" level=info msg="Detected 1 APIs" 
time="May 20 08:19:12" level=info msg="Preparing new router" 
time="May 20 08:19:12" level=info msg="Initialising Tyk REST API Endpoints" 
time="May 20 08:19:12" level=info msg="Loading API configurations." 
time="May 20 08:19:12" level=info msg="Tracking hostname" api_name="Test API" domain="(no host)" 
time="May 20 08:19:12" level=info msg="Loading API" api_name="Test API" 
time="May 20 08:19:12" level=warning msg="The Health Checker is deprecated and we do no longer recommend its use." 
time="May 20 08:19:12" level=info msg="Checking security policy: Token" api_name="Test API" 
time="May 20 08:19:12" level=info msg="Processed and listening on: /test-api/{rest:.*}" 
time="May 20 08:19:12" level=info msg="Loading uptime tests..." 
time="May 20 08:19:12" level=info msg="Initialised API Definitions" 
time="May 20 08:19:12" level=info msg="API reload complete" 
<<省略>>
```
####APIの動作確認
```Terminal
$ curl -H "Authorization: null" http://dashboard.tyk.docker:8080/test-api/get

{
    "error": "Key not authorised"
}
```
###2. API Keyの作成
####test APIのAPI Keyの作成
```Terminal
$ curl -H "x-tyk-authorization: <<secret省略>>"  -s  -H "Content-Type: application/json"  -X POST  -d '{     "allowance": 1000,     "rate": 1000,     "per": 1,     "expires": -1,     "quota_max": -1,     "quota_renews": 1449051461,     "quota_remaining": -1,     "quota_renewal_rate": 60,     "access_rights": {         "1": {             "api_id": "1",             "api_name": "Test API",             "versions": ["Default"]         }     },     "meta_data": {}  }'  http://dashboard.tyk.docker:8080/tyk/keys/create | python -mjson.tool

{
    "key": <<API key省略>>,
    "status": "ok",
    "action": "added",
    "key_hash": "9efc33c0"
}
```
####APIの動作確認
```Terminal
$ curl -H "Authorization: <<API key省略>>" http://dashboard.tyk.docker:8080/test-api/get

{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip",
    "Authorization": <<API key省略>>,
    "Host": "httpbin.org",
    "User-Agent": "curl/7.35.0"
  },
  "origin": "178.62.11.62, 178.62.11.62",
  "url": "http://httpbin.org/get"
}
```