【Amazon APIGateway】使用量プランを利用して、APIキー毎の使用回数をメトリクスに表示する(前半)

記事タイトルとURLをコピーする

こんにちは。 ディベロップメントサービス1課の山本です。

今回はAmazon APIGateway(以下、APIGateway)の使用量プランの利用法を説明します。
昔、X(旧Twitter)のAPI制限に苦しめられて、サブ垢を作ってたことを思い出しながら記載します。

はじめに

下記のような構成の時に無限にAPIを呼ばれて、無限にお金がかからないように対策します。

構成図

APIキーで識別しているクライアントを制限するために、APIGatewayの機能にある使用量プランを利用します。

ブログを前半・後半の2回に分けて説明します。

  • 前半:使用量プランの使い方
  • 後半:APIキー毎の使用回数をメトリクスに表示する

APIGatewayの使用量プランとは

REST APIでのみ利用できる機能です。
APIキーが紐づいているプラン毎に、下記のことが可能になります。

  • スロットリングの制限(頻度で制限)
  • クォータ制限(回数で制限)

docs.aws.amazon.com

実際にサンプルのAPIを構築して、使用方法を確認していきます。

APIの構築

API GatewayにてREST APIを構築します。
今回は確認のため、サンプルAPIを選択します。

REST API作成画面

サンプルAPIの内容がリソースに展開されました。
ルートに説明用のHTMLがあり、配下にペットの名前と値段のリソースを持つAPIです。

APIリソース画面

こちらはまだデプロイされていないので、APIをデプロイを選択してデプロイします。
デプロイ先のステージ名はsampleとしておきます。

デプロイ画面

無事デプロイされたら、ステージのリソースが作成されます。
エンドポイントが画面中央に表示されるので、ここにアクセスすると説明用のHTMLが返却されます。

APIステージ画面
説明用のHTML

これでサンプル用APIの構築は完了です。 次にAPIキーの設定を行います。

APIキーの設定

APIキーの必須化

サンプル用APIに対して、APIキーを必須化して再度デプロイします。
リソースのメソッドリクエストのタブから編集可能です。

メソッドリクエスト画面
編集画面に入ったら、APIキーは必須ですにチェックを入れます。
メソッドリクエスト編集画面
この後、再度ステージへとデプロイしたら反映されます。
APIキー無しではアクセスできないようになりました。
APIキーないのでアクセス禁止

APIキーの作成

次にアクセスするためのAPIキーを作成致します。
APIGatewayの左側のタブにあるAPIキーを選択し作成します。

APIキー一覧画面

今回は自動作成によるAPIキーを発行します。

自動作成のルールがAWSドキュメントに記載されていなかったのですが、何度が試すと大小英数字の40文字で生成されるようです。

APIキー作成画面

使用量プランの作成

次に使用量プランを作成して、APIキーとステージを紐づけます。
APIGatewayの左側のタブにある使用量プランを選択し作成します。

今回は制限に引っかかるようにあえて、低い基準を設定します。

使用量プラン一覧画面
使用量プラン作成画面

使用量プランにAPIキーとステージを紐づけたら、設定完了です。

関連付けられたステージ一覧
関連付けられたステージ設定
関連付けられたAPIキー一覧
関連付けられたAPIキー設定

このように、一つの使用量プランに複数のステージやAPIキーを紐づけることが可能です。

制限された時の応答

最後に制限された場合のレスポンスを確認します。
ヘッダーへのAPIキーの付与が必要なため、Postmanを利用して確認します。
AuthorizationタブにKeyとValueを入れることで、自動的にヘッダーへと追加してくれます。

まずは正常時の応答です。

  • HTTP Status: 200 OK
  • Body: 正しいHTMLの内容

正常時の応答

APIキーがない

  • HTTP Status: 403 Forbideen
  • Body: {"message": "Forbideen"}

APIキーがない場合の応答

スロットリング制限

  • 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の利用料は気を抜くとすぐ跳ね上がってしまいます。
特に外部に公開する場合は、コストと性能を考えて利用量を制限しましょう。

本ブログがどなかたのお役に立てれば幸いです。

山本 真大(執筆記事の一覧)

アプリケーションサービス部 ディベロップメントサービス1課

2023年8月入社。カピバラさんが好き。