Amazon-CloudWatch

CloudWatch Logs で AWS EC2 インスタンスのログを管理したい

はじめに

こんにちは、ディーネットの山中です。
今回は CloudWatch Logs で AWS EC2 インスタンスのログを管理する手順についてまとめてみました。

CloudWatch Logs を使用すると、EC2 インスタンスから出力されるログを収集、監視、および格納する事ができます。

Cloudwatch の料金についてはこちらを
Amazon CloudWatch 料金表

追記:カスタムメトリクスやログファイルの追加手順も投稿しました。
[アドカレ2023] CloudWatch EC2 カスタムメトリクスとログファイルを追加したい

前提&事前準備

作業手順(簡易)

1. IAMロール作成

EC2 インスタンスで CloudWatch Logs にログを書き込むための IAM ロールを作成し、EC2に割り当てます。

2. CloudWatch Logs エージェントのインストール

EC2 インスタンスに CloudWatch Logs エージェントをインストールします。

3. CloudWatch Logs エージェントの設定ファイル作成

CloudWatch Logs エージェントを設定後、ログを CloudWatch Logs に送信するように設定します。

4. 動作確認

CloudWatch のコンパネにてログが CloudWatch Logs に送信されているか確認します。

作業手順

1. IAMロール作成

IAMロールの作成とEC2インスタンスへの割当を行っていきます。
IAM のコンパネ - [ ロール ] - [ ロールを作成 ] と進みます。

信頼されたエンティティタイプ:AWS のサービス
ユースケース:EC2
と選択し、次へ進みます。

IAM_1
IAM_1

許可ポリシーの検索欄にて
【 CloudWatchAgentServerPolicy 】と検索し、チェックを入れて次へ

IAM_2
IAM_2

ロール名と説明はお好きなものを入力 (例: CloudWatchAgentServerRole) して [ ロールを作成 ]

ロールが作成できたらEC2のコンパネに移動し、
先ほど作成したロールを対象EC2インスタンスに割り当てます。
インスタンスを選択 - [ セキュリティ ] - [ IAM ロールを変更 ]

IAM_3
IAM_3

ロール選択 - [ IAM ロールの更新 ]

IAM_4
IAM_4

2. CloudWatch Logs エージェントのインストール

インスタンスにSSH接続を行い、CloudWatch Logs エージェントをインストールしていきます。

CloudWatch Logs エージェントダウンロード

# wget https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/centos/amd64/latest/amazon-cloudwatch-agent.rpm

s3.ap-northeast-1.amazonaws.com (s3.ap-northeast-1.amazonaws.com) をDNSに問いあわせています... 52.219.197.60, 52.219.136.154, 52.219.152.120, ...
s3.ap-northeast-1.amazonaws.com (s3.ap-northeast-1.amazonaws.com)|52.219.197.60|:443 に接続しています...  接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 30689692 (29M) [application/octet-stream]
`amazon-cloudwatch-agent.rpm' に保存中

amazon-cloudwatch-agent.rp 100%[======================================>]  29.27M   110MB/s 時間 0.3s

2023-02-15 16:44:41 (110 MB/s) - `amazon-cloudwatch-agent.rpm' へ保存完了 [30689692/30689692]

CloudWatch Logs エージェントインストール

# rpm -U ./amazon-cloudwatch-agent.rpm

create group cwagent, result: 0
create user cwagent, result: 0

CloudWatch Logs エージェントのインストール確認

# yum list installed | grep amazon-cloudwatch-agent

amazon-cloudwatch-agent.x86_64              1.247357.0b252275-1                        @System

3. CloudWatch Logs エージェントの設定ファイル作成

手動で作成する事もできますが、
今回はウィザードを使用して設定ファイルの作成を行います。

# /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

質問に回答していくことで設定ファイルを作成してくれます。
以下を参考に用途に合わせて回答していってもらえればと思います。

================================================================
= Welcome to the Amazon CloudWatch Agent Configuration Manager =
=                                                              =
= CloudWatch Agent allows you to collect metrics and logs from =
= your host and send them to CloudWatch. Additional CloudWatch =
= charges may apply.                                           =
================================================================

CloudWatchエージェント動作させるOSを選択します。

On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:
1

CloudWatchエージェントを動作させるのはEC2かオンプレミスのサーバーかを選択します。

Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
1

CloudWatchエージェントを起動するマシン内のユーザー名を選択します。

Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
1

StatsDデーモンを起動するか(カスタムメトリクスを採取する際に使用します。

Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2 (CloudWatchログ用途のため 2 を選択)

CollectDでカスタムメトリクスの採取をするか

Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
1. yes
2. no
default choice: [1]:
2  (CloudWatchログ転送用途のため 2 を選択)

CPU、メモリといったシステム全体に対するカスタムメトリクスを採取するか

Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
2

移行のためにインポートする既存のCloudWatch Log エージェント設定ファイルを持っているか

Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
2  (移行はしないので 2 を選択)

CloudWatch LogsへEC2内のログを送信するか

Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
1

収集してほしいログファイルパスを入力します。

Log file path:
/var/log/messages

Cloudwatchに表示されるロググループ名を設定します。

Log group name:
default choice: [messages]
messages

Cloudwatchに表示されるログストリーム名を設定します。

Log stream name:
default choice: [{instance_id}]
{instance_id}

ログの保持期間です、-1 は無期限保存になります。

Log Group Retention in days
1. -1
2. 1
3. 3
4. 5
5. 7
6. 14
7. 30
8. 60
9. 90
10. 120
11. 150
12. 180
13. 365
14. 400
15. 545
16. 731
17. 1827
18. 2192
19. 2557
20. 2922
21. 3288
22. 3653
default choice: [1]:
1

上記のLog file path 設定以外に他に収集したいログがあるかどうか

Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2

設定ファイルは /opt/aws/amazon-cloudwatch-agent/bin/config.json に保存されたようです

Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
        "agent": {
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/messages",
                                                "log_group_name": "messages",
                                                "log_stream_name": "{instance_id}",
                                                "retention_in_days": -1
                                        }
                                ]
                        }
                }
        }
}
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.

設定ファイルをSSMパラメータストアへ保存するかどうか

Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
2
Program exits now.

↑にて作成された設定ファイルを開いて確認してみます。

# less /opt/aws/amazon-cloudwatch-agent/bin/config.json
{
        "agent": {
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/messages",
                                                "log_group_name": "messages",
                                                "log_stream_name": "{instance_id}",
                                                "retention_in_days": -1
                                        }
                                ]
                        }
                }
        }
}

ログ保存先を複数選択した場合の config.json 例も載せておきます。

Current config as follows:
{
    "agent": {
        "run_as_user": "root"
    },
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/httpd/access_log",
                        "log_group_name": "access_log",
                        "log_stream_name": "{instance_id}",
                        "retention_in_days": -1
                    },
                    {
                        "file_path": "/var/log/httpd/error_log",
                        "log_group_name": "error_log",
                        "log_stream_name": "{instance_id}",
                        "retention_in_days": -1
                    }
                ]
            }
        }
    }
}

エージェントを起動します。
このコマンドで CloudWatch エージェントが EC2 インスタンスから AWS リージョンを自動的に検出し、指定された構成ファイルを使用して開始されます。

# /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

****** processing amazon-cloudwatch-agent ******
I! Trying to detect region from ec2 D! [EC2] Found active network interface Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp
Start configuration validation...
2023/02/15 16:48:27 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp ...
2023/02/15 16:48:27 I! Valid Json input schema.
I! Detecting run_as_user...
I! Trying to detect region from ec2
D! [EC2] Found active network interface
No csm configuration found.
No metric configuration found.
Configuration validation first phase succeeded
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Configuration validation second phase succeeded
Configuration validation succeeded
amazon-cloudwatch-agent has already been stopped
Created symlink /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service → /etc/systemd/system/amazon-cloudwatch-agent.service.

ちょっとした解説

"amazon-cloudwatch-agent-ctl"
Amazon CloudWatchエージェントの起動、停止、再起動、およびエージェントの設定や動作の管理の際に使用されるコマンドです。

"-a fetch-config"
"amazon-cloudwatch-agent-ctl" のオプションです、エージェントが自動的に構成情報を取得し、その情報に基づいてメトリクスとログを収集するように設定します。

"-m ec2"
"amazon-cloudwatch-agent-ctl" のオプションです、インスタンスからメトリクスとログを収集します。

"-s"
"amazon-cloudwatch-agent-ctl" のオプションです、エージェントが収集するメトリクスとログをフィルタリングすることができます。"-s EC2MemoryUtilization"を指定すると、エージェントはEC2インスタンスのメモリ使用率に関するメトリクスのみを収集します。

"-c file://opt/aws/amazon-cloudwatch-agent/bin/config.json"
"amazon-cloudwatch-agent-ctl" のオプションです、設定ファイルを指定しています。

エージェントのステータスを確認します。

# systemctl status amazon-cloudwatch-agent

● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-02-17 17:59:37 JST; 24min ago
 Main PID: 880 (amazon-cloudwat)
    Tasks: 7 (limit: 11736)
   Memory: 78.4M
   CGroup: /system.slice/amazon-cloudwatch-agent.service
           mq880 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -config /opt/aws/amazon-cloudwatch-agent/etc/a>

 2月 17 17:59:38 almalinux-template-image start-amazon-cloudwatch-agent[880]: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cl>
 2月 17 17:59:38 almalinux-template-image start-amazon-cloudwatch-agent[880]: I! Detecting run_as_user...

自動起動の有効を確認します。

# systemctl is-enabled amazon-cloudwatch-agent
enabled

4. 動作確認

Cloudwatch のコンパネ - [ ロググループ ] - 先ほど設定したロググループ("log_group_name": "messages")と進みます。
ロググループやログストリームは自動で作成されています。

Cloudwatch_1
Cloudwatch_1

先程設定したログストリーム( "log_stream_name": "{instance_id}")を選択し、

Cloudwatch_1.5
Cloudwatch_1.5

ログが表示されていれば設定完了です。

Cloudwatch_2
Cloudwatch_2

お疲れ様でした。
以上で CloudWatch Logs で AWS EC2 インスタンスのログを管理する手順が完了しました。

最後まで読んでいただきありがとうございました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA