まだまだ日中は暑いですが、夕方になると涼しさを感じるようになってきました。ヒグラシの鳴き声もとても心地よいですね。
今回は、Amazon CloudWatch Logs についてです。
サーバで出力するログファイルを CloudWatch に転送して効率的に分析する方法を探っていきましょう。
1. 概要
Amazon EC2 のアクセスログファイル(JSON形式)を AWS CloudWatch agent を使用して CloudWatch に転送し、CloudWatch Insights を用いてログを分析する手順を説明します。
2. 前提条件
3. AWS CloudWatch agent のインストールと設定
3.1. EC2 インスタンスに SSH 接続
3.2. CloudWatch agent をインストール
$ sudo yum install -y amazon-cloudwatch-agent
3.3. CloudWatch agent の設定ファイルを作成
/opt/aws/amazon-cloudwatch-agent/bin/
にconfig.json
ファイルを作成し、以下の内容を書き込みます。
{ "agent": { "run_as_user": "root" }, "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/path/to/your/access-log.json", "log_group_name": "EC2_Access_Logs", "log_stream_name": "{instance_id}", "retention_in_days": -1 } ] } } } }
3.4. CloudWatch agent を起動
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file://opt/aws/amazon-cloudwatch-agent/bin/config.json
3.5. CloudWatch agent の自動起動を有効化
$ sudo systemctl enable amazon-cloudwatch-agent.service
4. CloudWatch Insights を使用してログを分析
- AWS マネジメントコンソールにログインし、
CloudWatch
に移動。 - 左側のナビゲーションペインで
ロググループ
をクリック。 EC2_Access_Logs
ロググループをクリック。ログストリーム
タブを開き、対象のログストリームを選択。- ログイベントの上部にあるアクションの
Logs Insights で表示
をクリックして、ログのインサイト
を開く。 - クエリ言語を使用してログデータを分析できます。
ログデータ例(JSON形式)
{ "user": { "id": "12345", "profile": { "name": "John Doe", "email": "johndoe@example.com", "location": { "city": "Tokyo", "country": "Japan" } } }, "action": "login", "timestamp": "2023-08-20T10:00:00Z" }
CloudWatch Logs Insights
でクエリする例を以下に示します。
4.1. 特定のユーザー ID を持つログをフィルタリング
fields @timestamp, @message | filter user.id = "12345"
4.2. 特定の都市 (Tokyo) からのアクションをフィルタリング
fields @timestamp, @message, user.profile.location.city | filter user.profile.location.city = "Tokyo"
4.3. 特定の国 (Japan) でのログインアクションをフィルタリング
fields @timestamp, @message, user.profile.location.country, action | filter user.profile.location.country = "Japan" and action = "login"
4.4. ユーザーのメールアドレスをリスト
fields user.profile.email
5. 比較
AWS CloudWatch Logs Insightsは、JSON形式のログの場合、上記のようなクエリで分析できます。
一方、プレーンテキストのログの場合はどうでしょうか。
ログデータ例(プレーンテキスト)
2023-08-20T10:00:00Z user:12345 name:John Doe email:johndoe@example.com city:Tokyo country:Japan action:login device:mobile browser:chrome 2023-08-20T11:00:00Z user:67890 name:Jane Smith email:jane@example.com city:Osaka country:Japan action:logout device:desktop browser:firefox
Tokyoからログインしたモバイルユーザーをフィルタリングする場合
fields @timestamp, @message | filter @message like /city:Tokyo/ and @message like /action:login/ and @message like /device:mobile/
Chromeを使用してアクセスしたユーザーのメールアドレスを取得する場合
fields @message | filter @message like /browser:chrome/ | parse @message "* email:* city:" as email | display email
このように、プレーンテキストの場合、特定のキーワードやパターンを探すために正規表現やlike
演算子を使用する必要があります。クエリの複雑さや誤りを招く要因となりますね。
構造化されたログフォーマット(JSON)を使用することで、CloudWatch Logs Insightsでのログ分析が効率的かつ簡単になります。