やりたいこと
CloudWatch Logsに取り溜めているログに、APIサーバが受け付けたリクエストのパスと、リクエストを出したユーザIDが記録されているので、特定のAPIを呼び出した日時とユーザIDのリストを作りたいのです。
CloudWatch Logsに取り溜めているログ
CloudWatch Logsのメッセージには下の様なJOSN形式のログを出力しています。
{
"access_timestamp": "2019-02-13T10:54:25+09:00",
"level": "info",
"method": "POST",
"path": "/path/to/resource/sub_resource",
"query": {
"param1": "value1",
"param2": "value2",
"param3": "value3",
},
"user_id": "dfc269bf-c08a-48a2-a6e3-14dd25f5350a",
"status": "200",
}
作りたいもの
上のJSONに対して 目的の path を指定して、statusが"200"(成功)のログを抽出して、 access_timestamp
と user_id
のリストを作ります。
"2019-02-13T10:54:25+09:00","dfc269bf-c08a-48a2-a6e3-14dd25f5350a"
"2019-02-13T10:55:16+09:00","908cbf68-744f-41ea-a202-667b129029ca"
"2019-02-13T10:56:14+09:00","5000adc0-da5d-4d58-aad2-f5d4e8c32426"
aws cli で頑張る
aws logs start-query
で Insights を利用します。
aws logs start-query --log-group-name 'my-log-group' --start-time 1550012400 --end-time 1550014200 \
--query-string 'fields, @message
| filter ( access_url =~ "/path/to/resource/" and level ="INFO" and method = "POST" and status = "200")
'
引数 --query-string
の filter
では CloudWatchLogsのmessageに記録されている JSON のキーを指定しています。 JSONのキー access_url 、 level 、 method 、 status は自動的に認識されるようです。AWSのコンソールで ロググループ名を指定すると、右側の「検知されたフィールドに」にキー名が表示されるので、確認できます。
Insights の処理が終わると queryId
を得られるので、 queryId
を指定して、結果を取得します。
{
"queryId": "5000adc0-da5d-4d58-aad2-f5d4e8c32426"
}
最後に、jqを駆使して、access_timestampとuser_idを出力します。
aws logs get-query-results --query-id 5000adc0-da5d-4d58-aad2-f5d4e8c32426 | \
jq -r '.results[] | map ( select( .field == "@message")) | .[].value ' | jq -r '[. access_timestamp, .user_id] | @csv'