🙆

AWS CloudWatch LogsをS3に出力し、Athenaを活用したログ分析

2023/03/20に公開

書くこと

  • CloudWatch LogsからS3へ出力する方法と注意点
  • Athenaでログをクエリ実行する方法

データの流れ

データは次のような流れで取得されます:

CloudWatch Logs => S3 => Athena

想定

Cloudwatch logsに以下のようなtimestampmessageがある状態。

timestamp message
2023-03-16T02:00:15.955Z system_booting_string
2023-03-16T02:00:15.955Z {"id": 1}
2023-03-16T02:00:15.955Z {"id": 2}

Cloudwatch LogsからS3へ出力する方法と注意点

方法

  1. CloudWatch Logsのログ出力先S3バケットを作成
  2. CloudWatch Logsから、エクスポートしたいロググループを選択
  3. アクションのプルダウンから「データをAmazon S3にエクスポート」を選択
  4. 「データをAmazon S3にエクスポート」詳細画面で、出力内容や出力先を選択します。

「データをAmazon S3にエクスポート」選択画面

「データをAmazon S3にエクスポート」詳細画面

注意

  1. AWSコンソール上から出力すると、出力形式を選ぶことができません。出力形式はプレーンテキストになります。
    例: 2023-03-16T02:00:15.955Z system_booting_string
  2. 約60分程度を超えるエクスポートを実行するとタイムアウトすることがあります。

Athenaでログをクエリ実行する方法

  1. テーブル作成
  2. クエリの実行

テーブル作成

Athenaのクエリエディタで以下を実行します。

CREATE EXTERNAL TABLE IF NOT EXISTS export_cloudwatch_logs (timestamp string, message string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
	'input.regex' = '^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z)\\s+(.*)$',
	'output.format.string' = '%1$s %2$s'
)
LOCATION 's3://your_export_bucket/exportedlogs/';

クエリの実行

message部分は文字列形式のJSONなので、JSONをパースします。

SELECT json_extract_scalar(message, '$.id')
FROM "default"."export_cloudwatch_logs" 

Discussion