AthenaとFluentdと色々でログ集約をしてみたお話し

1.7K Views

March 07, 21

スライド概要

こちらの記事をベースにしたLT資料です。
https://zenn.dev/yuta28/articles/ae8b1379aa873c

profile-image

インターネットメディアでWebメディアサイトのサーバー構築やインフラ運用改善を担当しているインフラエンジニアです。 ブログでまとめたLTスライドをアップロードします。

シェア

埋め込む »CMSなどでJSが使えない場合

各ページのテキスト
1.

AthenaとFluentdと色々でログ集 約をしてみたお話し

2.

自己紹介 Name:ユータ Occupation:SRE Twitter:@Y0u281 (オーでなくゼロです) ブログ:https://zenn.dev/yuta28 → 普段触るもの:AWS Ansible Linux Mint Twitter

3.

目次 ● 背景 ● やったこと ● 構築完成予想図 ● 運用開始後のフィードバック ● まとめ

4.

背景

5.

やったこと ● 各種EC2にFluentdを導入し、ログをS3に転送する ● S3に格納されたログをGlueを使ってテーブル定義づけする ● Athenaでクエリを発行して、複数ログを検索して一覧化できるようにする ● CloudWatch LogsのログはKinesisを用いてS3へ転送

6.

構築完成予想図 ● 対象ログ ○ ○ ○ ○ ○ Apacheログ Railsログ Postfixログ SlowQueryログ (CloudTrailログ)

7.

運用開始後のフィードバック ● ● ● ApacheログとRailsの日付ログフォーマットが異なっており、同一時間帯で比較 ができない Fluentdはログデータを加工された状態で転送するので生データのログも参照で きるようにしたい SlowQueryログのクエリタイムでソートできるようにしてほしい

8.

日付ログフォーマット異なる問題 Apacheログの日付フォーマット→ 08/Dec/2020:19:13:01 +0900 Railsログの日付フォーマット→ 2020-12-08T23:41:30.980713

9.

日付ログフォーマット異なる問題 解決方法① UNIXTIMEを新規にカラムに追加 <inject> time_key fluentd_time time_type unixtime </inject> 2020/12/9 00:29:52なら 1607441392秒となる

10.
[beta]
ログの生データも検索できるようにしたい ApacheのログはFluentdのプラグインで 綺麗にパースできる。 ログの中身が加工されるが、場合によっては 生データが欲しい場合がある。 https://docs.fluentd.org/config uration/parse-section <parse> @type apache2 </parse> time: 1362020400 (28/Feb/2013:12:00:00 +0900) record: { "user" : nil, "method" : "GET", "code" : 200, "size" : 777, "host" : "192.168.0.1", "path" : "/", "referer": nil, "agent" : "Opera/12.0" }
11.

ログの生データも検索できるようにしたい 解決方法② raw_data(生データ)というレコードを末尾に追記した。 <filter td.apache.access**> @type record_transformer <record> raw_data ${record["host"]} ${record["user"]} ${record["time"]} ${record["method"]} ${record["path"]} ${record["code"]} ${record["size"]} ${record["referer"]} ${record["agent"]} </record> </filter>

12.

ログの生データも検索できるようにしたい time: 1362020400 (28/Feb/2013:12:00:00 +0900) raw_dataに全て のレコード情報が 書き込まれた record: { "user" : nil, "method" : "GET", "code" : 200, "size" : 777, "host" : "192.168.0.1", "path" : "/", "referer": nil, "agent" : "Opera/12.0" “raw_data” : 192.168.0.1 nil 28/Feb/2013:12:00:00 +0900 GET / 777 nil Opera/12.0 }

13.

クエリタイムでソートできるようにしたい select query_time,messege from slowquery; みたいにしたい

14.
[beta]
クエリタイムでソートできるようにしたい import base64 解決方法③ いい手が思いつかず… import gzip import io import json def lambda_handler(event, context): records = [process_record(r) for r in event['records']] return {'records': records } def process_record(record): record_id = record['recordId'] CWLにSlowQueryログが来たら→の data = base64.b64decode(record['data']) iodata = io.BytesIO(data) with gzip.GzipFile(fileobj=iodata, mode='r') as f: data = json.loads(f.read()) Lambdaを実行してKinesisでS3に転送 processed_data = process_data(data) + '\n' return { 'data': base64.b64encode(processed_data.encode('utf-8')).decode('utf-8'), 'result': 'Ok', 'recordId': record_id } def process_data(data): return '\n'.join([format_log_event(json) for json in data['logEvents']]) def format_log_event(j): return json.dumps({'timestamp': j['timestamp'], 'message': j['message']})
15.
[beta]
クエリタイムでソートできるようにしたい 暫定的な対応策としてawslogsを使用(https://github.com/jorgebastida/awslogs) $ awslogs get <SlowQueryログ> --start='MM/DD/YYYY' --end=’MM/DD/YYYY’ 踏み台サーバにインストールして ターミナル上から SlowQueryログの 中身を表示 <SlowQueryログ> <リージョン> # Time: 180606 15:00:02 # User@Host: rdsadmin[rdsadmin] @ localhost [] Id: 18 # Query_time: 0.507831 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0 SET timestamp=1528297202; FLUSH SLOW LOGS ; とは言えAthenaで他のログと 一緒に検索できないのは悔しい
16.

まとめ ・ログを集約することで検索性UP ・SlowQueryログどうしよう🤔

17.

ありがとうございました より詳しい内容は私のブログで⇓ FluentdとAWS Athenaでログ集約 してみた https://zenn.dev/yuta28/articles/a e8b1379aa873c