LoginSignup
4
4

More than 5 years have passed since last update.

CloudWatch Logsに貯めたログから Insights を使って データの抽出を行う

Posted at

やりたいこと

CloudWatch Logsに取り溜めているログに、APIサーバが受け付けたリクエストのパスと、リクエストを出したユーザIDが記録されているので、特定のAPIを呼び出した日時とユーザIDのリストを作りたいのです。

CloudWatch Logsに取り溜めているログ

CloudWatch Logsのメッセージには下の様なJOSN形式のログを出力しています。

CloudWatchLogsのmessage
{
    "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_timestampuser_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 を利用します。

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-stringfilter では CloudWatchLogsのmessageに記録されている JSON のキーを指定しています。 JSONのキー access_urllevelmethodstatus は自動的に認識されるようです。AWSのコンソールで ロググループ名を指定すると、右側の「検知されたフィールドに」にキー名が表示されるので、確認できます。

CloudWatchLogsInsightsが認識したプロパティ.png

Insights の処理が終わると queryId を得られるので、 queryId を指定して、結果を取得します。

queryIdの出力
{
    "queryId": "5000adc0-da5d-4d58-aad2-f5d4e8c32426"
}

最後に、jqを駆使して、access_timestampとuser_idを出力します。

Insightsの結果から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'
4
4
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
4
4