🙆
AWS CloudWatch LogsをS3に出力し、Athenaを活用したログ分析
書くこと
- CloudWatch LogsからS3へ出力する方法と注意点
- Athenaでログをクエリ実行する方法
データの流れ
データは次のような流れで取得されます:
CloudWatch Logs => S3 => Athena
想定
Cloudwatch logsに以下のようなtimestamp
とmessage
がある状態。
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へ出力する方法と注意点
方法
- CloudWatch Logsのログ出力先S3バケットを作成
- CloudWatch Logsから、エクスポートしたいロググループを選択
- アクションのプルダウンから「データをAmazon S3にエクスポート」を選択
- 「データをAmazon S3にエクスポート」詳細画面で、出力内容や出力先を選択します。
「データをAmazon S3にエクスポート」選択画面
「データをAmazon S3にエクスポート」詳細画面
注意
- AWSコンソール上から出力すると、出力形式を選ぶことができません。出力形式はプレーンテキストになります。
例: 2023-03-16T02:00:15.955Z system_booting_string - 約60分程度を超えるエクスポートを実行するとタイムアウトすることがあります。
Athenaでログをクエリ実行する方法
- テーブル作成
- クエリの実行
テーブル作成
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