こんにちは。 ディベロップメントサービス1課の山本です。
今回はAmazon APIGateway(以下、APIGateway)の使用量プランの利用法を説明します。
昔、X(旧Twitter)のAPI制限に苦しめられて、サブ垢を作ってたことを思い出しながら記載します。
はじめに
下記のような構成の時に無限にAPIを呼ばれて、無限にお金がかからないように対策します。
APIキーで識別しているクライアントを制限するために、APIGatewayの機能にある使用量プランを利用します。
ブログを前半・後半の2回に分けて説明します。
- 前半:使用量プランの使い方
- 後半:APIキー毎の使用回数をメトリクスに表示する
APIGatewayの使用量プランとは
REST APIでのみ利用できる機能です。
APIキーが紐づいているプラン毎に、下記のことが可能になります。
- スロットリングの制限(頻度で制限)
- クォータ制限(回数で制限)
実際にサンプルのAPIを構築して、使用方法を確認していきます。
APIの構築
API GatewayにてREST APIを構築します。
今回は確認のため、サンプルAPIを選択します。
サンプルAPIの内容がリソースに展開されました。
ルートに説明用のHTMLがあり、配下にペットの名前と値段のリソースを持つAPIです。
こちらはまだデプロイされていないので、APIをデプロイ
を選択してデプロイします。
デプロイ先のステージ名はsample
としておきます。
無事デプロイされたら、ステージのリソースが作成されます。
エンドポイントが画面中央に表示されるので、ここにアクセスすると説明用のHTMLが返却されます。
これでサンプル用APIの構築は完了です。 次にAPIキーの設定を行います。
APIキーの設定
APIキーの必須化
サンプル用APIに対して、APIキーを必須化して再度デプロイします。
リソースのメソッドリクエストのタブから編集可能です。
APIキーは必須です
にチェックを入れます。
この後、再度ステージへとデプロイしたら反映されます。APIキー無しではアクセスできないようになりました。
APIキーの作成
次にアクセスするためのAPIキーを作成致します。
APIGatewayの左側のタブにあるAPIキー
を選択し作成します。
今回は自動作成によるAPIキーを発行します。
自動作成のルールがAWSドキュメントに記載されていなかったのですが、何度が試すと大小英数字の40文字で生成されるようです。
使用量プランの作成
次に使用量プランを作成して、APIキーとステージを紐づけます。
APIGatewayの左側のタブにある使用量プラン
を選択し作成します。
今回は制限に引っかかるようにあえて、低い基準を設定します。
使用量プランにAPIキーとステージを紐づけたら、設定完了です。
このように、一つの使用量プランに複数のステージやAPIキーを紐づけることが可能です。
制限された時の応答
最後に制限された場合のレスポンスを確認します。
ヘッダーへのAPIキーの付与が必要なため、Postmanを利用して確認します。
AuthorizationタブにKeyとValueを入れることで、自動的にヘッダーへと追加してくれます。
まずは正常時の応答です。
- HTTP Status: 200 OK
- Body: 正しいHTMLの内容
APIキーがない
- HTTP Status: 403 Forbideen
- Body: {"message": "Forbideen"}
スロットリング制限
- HTTP Status: 429 Too Many Request
- Body: {"message": "Too Many Request"}
クォータ制限
- HTTP Status: 429 Too Many Request
- Body: {"message": "Limit Exceeded"}
使用量データの確認方法
クォータ制限に関して、現在どれだけの量を利用しているか確認することができます。
使用量プランを選択後に、'使用量データをエクスポート'を選択するとJSONまたはCSVファイルにて取得することが可能です。
試しに10月1日~10月11日の使用量をJSONで取得しました。
APIキー毎の1日の使用量と残使用量がリストで返却されます。
{ "{APIキーID}": [ [0, 1000], # 10月1日の使用量, 残使用量 [0, 1000], # 10月2日の使用量, 残使用量 [0, 1000], # 10月3日の使用量, 残使用量 [0, 1000], # 10月4日の使用量, 残使用量 [0, 1000], # 10月5日の使用量, 残使用量 [0, 1000], # 10月6日の使用量, 残使用量 [0, 1000], # 10月7日の使用量, 残使用量 [0, 1000], # 10月8日の使用量, 残使用量 [0, 1000], # 10月9日の使用量, 残使用量 [266, 734], # 10月10日の使用量, 残使用量 [0, 734] # 10月11日の使用量, 残使用量 ] }
わかりづらい上に、取得しづらいですね。。。
これを解決するために、次回のブログにてAmazon CloudWatchのメトリクスに表示させる方法を紹介します。
さいごに
AWSの利用料は気を抜くとすぐ跳ね上がってしまいます。
特に外部に公開する場合は、コストと性能を考えて利用量を制限しましょう。
本ブログがどなかたのお役に立てれば幸いです。