##背景
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日ごとのリクエスト数を集計したかったので、以下のクエリを用意した。
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 クエリ構文