Amazon API Gatewayの「使用量プラン」を試す


APIキー別にAPIの利用量を設定できるということだったので、試してみた。

- Amazon API Gateway 使用量プランのご紹介:https://aws.amazon.com/jp/about-aws/whats-new/2016/08/introducing-amazon-api-gateway-usage-plans/
- 【新機能】Amazon API Gatewayに「使用量プラン」機能が追加。キーごとにスロットリングやリクエストの制限が可能に:http://dev.classmethod.jp/cloud/aws/usage-plan-for-api-gateway/

なお、API自体は[Sample APIとかいうの](http://qiita.com/motchi0214/items/7db24b76d17c51f26ed8)を使ってみました。

##コンソールから「使用量プラン」を選択
![スクリーンショット 2016-08-16 15.34.40.png](https://qiita-image-store.s3.amazonaws.com/0/23936/bc21b96b-937f-07a1-de2d-0aa8b4177973.png "スクリーンショット 2016-08-16 15.34.40.png")

「使用量プランの有効化」をクリックするとリスト画面に移動します。

![スクリーンショット 2016-08-16 15.34.59.png](https://qiita-image-store.s3.amazonaws.com/0/23936/f1dbd811-a94c-be8b-4ecd-aa4274850e9e.png "スクリーンショット 2016-08-16 15.34.59.png")

左上の「作成」をクリックしてプランを作りましょう。

##プランを作成する
### 関連付けるAPIステージを選択
![スクリーンショット 2016-08-16 15.36.01.png](https://qiita-image-store.s3.amazonaws.com/0/23936/3cd42712-5b80-0b36-1ff1-2554c7953c85.png "スクリーンショット 2016-08-16 15.36.01.png")
プランを設定するAPIステージを聞かれるので設定します。

### 関連付けるAPIキーを選択
![スクリーンショット 2016-08-16 15.52.58.png](https://qiita-image-store.s3.amazonaws.com/0/23936/e00af9db-9b0b-78d5-ea38-b9129b28cbe2.png "スクリーンショット 2016-08-16 15.52.58.png")
プランで使用するAPIキーを設定します。

作ってない場合は「APIキーを作成して利用量プランに追加」で作成できます。
![スクリーンショット 2016-08-16 15.53.16.png](https://qiita-image-store.s3.amazonaws.com/0/23936/de6b237a-d370-8b32-761c-3c5c62fa93ac.png "スクリーンショット 2016-08-16 15.53.16.png")

###プラン設定
秒間・月間リクエスト数上限やトークンバケットの容量を指定します。
![スクリーンショット 2016-08-16 15.53.32.png](https://qiita-image-store.s3.amazonaws.com/0/23936/ff202fc1-aa77-49a4-4c0f-94a31ded2ce4.png "スクリーンショット 2016-08-16 15.53.32.png")

##APIにキーを設定する
APIキーの設定は、「認証の設定」から「APIキーの必要性」をtrueにすればOKです。
![スクリーンショット 2016-08-16 15.54.19.png](https://qiita-image-store.s3.amazonaws.com/0/23936/52af208b-8f46-b0ad-65d2-22cf589daebb.png "スクリーンショット 2016-08-16 15.54.19.png")


## APIを叩いてみる
```
$ curl https://wXXXXX.execute-api.us-west-2amazonaws.com/prod/pets/
{"message":"Forbidden"}
```
エラーになる。

## APIキーをつけて送る
APIキーは「表示」を押すと確認できる。多分SDKとかでも取れるはずだから、実運用時はその辺を使うと思われる。

で、リクエストを出す時は「x-api-key」ヘッダを追加すればOK

```
$ curl https://wXXXXX.execute-api.us-west-2amazonaws.com/prod/pets/ --header 'x-api-key: XXXXXXXXXXXXXX'
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]
```

##エラーになるまで叩く
ちゃんとリクエストを送り過ぎた時にエラーになるか確認してみます。

```check.sh

#/bin/bash
for i in `seq 1 25`
do
  echo $i
  curl https://wXXXXX.execute-api.us-west-2amazonaws.com/prod/pets/ --header 'x-api-key: XXXXXXXXXXXXXX'
done
```
こんな感じでループさせてみました。

###実行結果

```
16
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]
17
{"message":"Limit Exceeded"}
18
{"message":"Limit Exceeded"}
19
{"message":"Limit Exceeded"}
20
{"message":"Limit Exceeded"}
21
{"message":"Limit Exceeded"}
22
{"message":"Limit Exceeded"}
23
{"message":"Limit Exceeded"}
24
```

17回目からエラーになっているのが確認できます。

##拡張する
APIへの月間リクエスト回数は増やすことができます。

「使用量プラン」の「拡張」を選択して、増やしましょう。
![スクリーンショット 2016-08-16 16.30.07.png](https://qiita-image-store.s3.amazonaws.com/0/23936/1fcaf431-3d25-14ed-1101-bbee3dfd085d.png "スクリーンショット 2016-08-16 16.30.07.png")

20回まで増やしたので、もう一度試します。
*なお、反映まで2〜3分ラグがある様子です。

###リトライ
もう一度curlしてみます。

```
20
[
  {
    "id": 1,
    "type": "dog",
    "price": 249.99
  },
  {
    "id": 2,
    "type": "cat",
    "price": 124.99
  },
  {
    "id": 3,
    "type": "fish",
    "price": 0.99
  }
]
21
{"message":"Limit Exceeded"}
22
{"message":"Limit Exceeded"}
23
{"message":"Limit Exceeded"}
24
{"message":"Limit Exceeded"}
25
{"message":"Limit Exceeded"}
```
増やしたのが20なので、21回目からエラーになっています。

##使用状況も確認できる
![スクリーンショット 2016-08-16 16.34.09.png](https://qiita-image-store.s3.amazonaws.com/0/23936/9ab886d7-149e-2434-56ca-3d41c8b95f34.png "スクリーンショット 2016-08-16 16.34.09.png")
どれくらいAPIにリクエストがきたのかを確認することもできます。
![スクリーンショット 2016-08-16 16.34.47.png](https://qiita-image-store.s3.amazonaws.com/0/23936/f06e3a4d-f227-3b8b-714e-600e61d5d8ac.png "スクリーンショット 2016-08-16 16.34.47.png")

JSON / CSV でエクスポートできる様子なのでJSONをエクスポートしてみました。

```
{
  "thisPeriod": {
    "XXXXXX": [
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        0,
        20
      ],
      [
        40,
        0
      ]
    ]
  },
  "startDate": "2016-08-01",
  "endDate": "2016-08-16"
}
```

リクエスト数と利用数が配列で入っているっぽいですね。

多分SDKとかで取れるか、将来的に取れるようになるはずなんで追い追い調べてみます。