Briswell Tech Blog

ブリスウェルのテックブログです

CloudWatch Logsでのログ分析について

まだまだ日中は暑いですが、夕方になると涼しさを感じるようになってきました。ヒグラシの鳴き声もとても心地よいですね。

今回は、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 を使用してログを分析

  1. AWS マネジメントコンソールにログインし、CloudWatchに移動。
  2. 左側のナビゲーションペインでロググループをクリック。
  3. EC2_Access_Logsロググループをクリック。
  4. ログストリームタブを開き、対象のログストリームを選択。
  5. ログイベントの上部にあるアクションのLogs Insights で表示をクリックして、ログのインサイトを開く。
  6. クエリ言語を使用してログデータを分析できます。

ログデータ例(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でのログ分析が効率的かつ簡単になります。