0
0

More than 3 years have passed since last update.

CloudWatch Logs InsightにてAPI Gatewayのアクセスログ用のクエリを書いてみた

Posted at

背景

API Gatewayを外部からの窓口とするシステムにて、システムへのアクセス数を集計する必要があったので、CloudWatchに出力しているアクセスログをインプットにAPI Gatewayへのリクエスト数を集計することにした。

アクセスログは、API にアクセスしたユーザーと、呼び出し元が API にアクセスした方法を記録するログで、アクセスが発生する度に以下の形式のログレコードが生成される。

アクセスログの形式
{ 
  "requestId":"8d2f5138-019f-449c-bde7-432ff3cb49a1", 
  "ip": "103.4.xxx.xxx", 
  "caller":"-", 
  "user":"-",
  "requestTime":"13/Feb/2021:07:45:36 +0000", 
  "httpMethod":"GET",
  "resourcePath":"/hello", 
  "status":"200",
  "protocol":"HTTP/1.1", 
  "responseLength":"26" 
}

CloudWatchのCloudWatch Logs Insights という機能を利用すると、特定のロググループに対してクエリを実行してログを検索/分析することができる。

やったこと

CloudWatch Logs Insightsにて以下の手順でクエリを実行し、結果を出力した。
1. 分析したい期間を指定
2. 分析したいAPI Gatewayのアクセスログのロググループを指定
3. 実行したいクエリを入力して「クエリの実行」をクリック
4. クエリの結果を「結果をエクスポート」から出力
image.png

今回は1日ごとのリクエスト数を集計したかったので、以下のクエリを用意した。

fields @message
| stats count(*) as count by substr(requestTime,0,11) as date
| limit 100

クエリの内容

  • 「fields」ではログイベントから収集したいフィールドを指定。利用したいアクセスログのフィールドは@messagesフィールドだったので「fields @message」と指定

  • 「stats」は集約統計用のコマンド。今回使った「count()」などがサポートされている

  • 「count(*) as count by substr(requestTime,0,11) as date」の部分は、アクセスログのrequestTime項目(例:13/Feb/2021:07:45:36 +0000)の先頭から11文字(13/Feb/2021 の部分)をdateと名付け、dateが同じであるログイベントごとにログイベント数をcountという項目名で集約するという意味。

  • 「limit」では表示したい件数を指定。10000まで指定可能

参考

CloudWatch Logs Insights クエリ構文

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0