AWS CloudWatch Log Insights便利だよね。まぁまぁコストはかかるけれど。これをプログラム的に実行するためのスニペットをChatGPT-4に書いてもらったので、その備忘録記事。
はじめに
ログ分析はシステムの監視とトラブルシューティングに不可欠です。AWSを使ったシステムにおいては、AWS CloudWatch Logs Insightsを使用すると、ログデータを対話的に検索し分析することができます。この記事では、特定の時間範囲と条件でログを効率的に抽出する方法をPythonのBoto3ライブラリを使用して説明します。
CloudWatch Logs Insightsの概要
AWS CloudWatch Logs Insightsは、Amazon CloudWatch Logs内のログデータを分析するための強力な対話型クエリエンジンです。大量のログデータから情報を素早く取得することが可能であり、運用監視やトラブルシューティングに役立ちます。
以下のような昨日を持っています。
- 対話的なクエリ言語: 特殊なクエリ言語を使用して、ログデータから必要な情報を素早く抽出できます。
- 時間範囲のフィルタリング: クエリの実行を特定の時間範囲に制限して、分析を高速化できます。
- ビジュアル化: クエリ結果をグラフやチャートで視覚的に表示できます。
- プログラムからのアクセス: Boto3などのSDKを使用して、プログラムからクエリを実行できます。
クエリの作成と実行
クエリは次のようなコンポーネントから構成されます:
fields
: 取得するフィールドを指定。例:fields @timestamp, @message
filter
: 条件に一致するログエントリをフィルタリング。例:filter level='INFO'
sort
: 特定のフィールドで結果を並べ替え。例:sort @timestamp desc
limit
: 結果の数を制限。例:limit 20
例をあげましょう。以下のような構造的なjsonデータをCloudWatch Logsに出力しているとします。
{
"level": "INFO",
"message": "..."
}
level="INFO"のものだけを抽出し、直近の時間のものから並べるのは、以下のようなクエリで可能です。
fields @timestamp, @message | filter level='INFO' | sort @timestamp desc
PythonとBoto3でのクエリの実行
PythonとBoto3を使用してクエリをプログラムで実行することもできます。以下は、特定のロググループについて、直近1時間のINFOデータを抽出するプログラムの例です。
from datetime import datetime
import boto3
import time
client = boto3.client('logs')
log_group = 'your-log-group-name'
end_time = datetime.now()
start_time = end_time - timedelta(hours=1)
start_query_response = client.start_query(
logGroupName=log_group,
startTime=start_time,
endTime=end_time,
queryString="fields @timestamp, @message | filter level='INFO' | sort @timestamp desc",
limit=1000
)
query_id = start_query_response['queryId']
while True:
response = client.get_query_results(queryId=query_id)
if response['status'] == 'Complete':
results = response['results']
break
time.sleep(1)
for result in results:
print(result)
このコードは、指定されたロググループと時間範囲でクエリを実行し、レベルがINFO
のログエントリを取得します。
まとめ
CloudWatch Logs Insightsは、大規模なログデータの分析と検索に非常に効率的なツールです。特定のフィールドのフィルタリング、並び替え、制限など、柔軟なクエリオプションが提供されています。プログラムからも簡単にアクセスできるため、自動化された分析やダッシュボードの作成にも適しています。これにより、システムの監視と分析がより効率的になります。
寸評
コードはちょっと手直しが必要だったが、普通に動いてくれたのでまぁよかったね。最初はすべてのログストリームを取得してプログラムでフィルタするという全然違うやり方を提案されて、えぇー、そんな馬鹿なと思って突っ込んで聞いたら、ちゃんとCloudWatch Logs Insightsを使ったやり方を教えてくれた。ChatGPTは本当にそういうところがある。
質問リンクは以下。興味がある人はどうぞ。
https://chat.openai.com/share/d3ae4555-46e3-4573-bc85-26ca34491ab5
Lambdaバージョン
続きの記事でLambda関数使ったやり方書きました。
