API Gatewayの使用量プランでのStatus Code 429をCloudWatch Metricsにパブリッシュする

2020.11.05

どうも、もこ@札幌オフィスです。

API Gatewayには使用量プラン(Usage Plans)が存在して、プランごとにAPI Gatewayへのリクエストレート(秒間リクエスト)、バースト数、クォータ(累積Call回数を日〜月単位)を指定する事ができ、指定した上限を超えたAPI KeyからのリクエストをAPI Gatewayで弾く仕組みがあります。

ちょっとしたTIPs記事となりますが、API Gatewayの使用量プランで設定したリクエストレート、とバースト数を超過した際にAPI Gatewayから発行されるStatus Code 429(Too Many Requests)の数をCLoudWatch LogsのMetrics Filterを用いてCloudWatch Metricsにパブリッシュして、監視できるような構成をご紹介します。

前提

今回ご紹介する環境の前提条件を記載します。

  • AWS SAMのHello World Exampleを利用した環境
  • プロトコル: REST
  • 既に監視対象の使用量プランがあるとする

API Gatewayのログを有効化する

API Gatewayではログ/トレースをCloudWatch Logsに出力する機能がありますので、こちらを有効化します。

ログレベルについては、ERRORを選択のうえ、変更を保存します。

CloudWatch Logsにログが出力されていることを確認する

API Gatewayに429となるようなリクエストを送信した後、 CloudWatch Logsのロググループに API-Gateway-Execution-Logs_xxxxxx/Env があることを確認します。

中を掘っていくと、 API Key **********************************av1m2E exceeded throttle limit for API Stage wv5vis0w60/Prod: Key throttle limit exceeded for Usage Plan ID jvqhpe. Limit: 1.00 Burst: 1 のようなエラーログを確認できるかと思います。

Metrics Filterを利用してCloudWatchへPublishする

CloudWatch Logsに出力されていることを確認出来たら、後はメトリクスフィルターを作成してCloudWatchへパブリッシュすれば、CloudWatch Alarmで敷居を設定して監視をすることができます。

「exceeded throttle limit for API」をフィルターパターンとして設定して、下記のようなMetrics Filterを用意しました。メトリクス名前空間とメトリクス名は任意の名前を指定する必要があります。

Metrics Filterを設定後、エラーログを流して暫く経った後にCloudWatch Metricsを確認すると、正常にパブリッシュされていることを確認できます。

まとめ

API GatewayのエラーログからMetrics Filterを利用しCloudWatch Metricsにパブリッシュする例をご紹介しました。

CloudWatchのMetrics Filterではログをベースにメトリクスをパブリッシュできますので、API Gatewayだけに関わらず、より監視の幅が広がるかと思います。