[アドカレ2023] CloudWatch EC2 カスタムメトリクスとログファイルを追加したい

はじめに

こんにちは、「DENET ADVENT CALENDAR 2023」12月20日担当の 山中 です。

クリスマスまであと5日となりました。
毎年クリスマスのメインが何日かを忘れてしまうので調べてみた所、

12月24日の日没後から25日の日没前までがクリスマス

との事でした。

24日と25日のどちらがメインという訳ではなかったんですが、
「クリスマスイブ」=「Christmas Eve(evening)」=「クリスマスの夜」である事や
ピークが24日の夜なので24日がメインと考えている人が多いみたいです。

本題に移りまして、
今回は CloudWatch にてカスタムメトリクスの取得・追加と、ログファイルの追加について書かせていただければと思います。

前提&事前確認

以下実施されている前提で進めさせていただければと思います。

  • OS:Almalinux 8.9
  • EC2 インスタンス構築済み
  • セキュリティグループ 22,443 許可済み
  • 【 CloudWatchAgentServerPolicy 】を割り当てた IAM ロールを EC2 に割当済み
  • CloudWatch Logs エージェントインストール

詳細はこちらを
CloudWatch Logs で AWS EC2 インスタンスのログを管理したい

手順

大まかな手順は以下となります。

  • collectd インストール
  • collectd 設定ファイル編集
  • CloudWatch Agent 設定ファイル作成
  • CloudWatch Agent 起動
  • コンパネにてカスタムメトリクスとログ出力確認

collectd インストール

collectd のインストールに必要な為 epel リポジトリのインストールを確認します。

[root@cw-test ~]# dnf repolist epel*
repo id                          repo の名前                                                                           状態
epel                             Extra Packages for Enterprise Linux 8 - x86_64                                        無効化
epel-debuginfo                   Extra Packages for Enterprise Linux 8 - x86_64 - Debug                                無効化
epel-modular                     Extra Packages for Enterprise Linux Modular 8 - x86_64                                無効化
epel-modular-debuginfo           Extra Packages for Enterprise Linux Modular 8 - x86_64 - Debug                        無効化
epel-modular-source              Extra Packages for Enterprise Linux Modular 8 - x86_64 - Source                       無効化
epel-source                      Extra Packages for Enterprise Linux 8 - x86_64 - Source                               無効化
epel-testing                     Extra Packages for Enterprise Linux 8 - Testing - x86_64                              無効化
epel-testing-debuginfo           Extra Packages for Enterprise Linux 8 - Testing - x86_64 - Debug                      無効化
epel-testing-modular             Extra Packages for Enterprise Linux Modular 8 - Testing - x86_64 - RETIRED            無効化
epel-testing-modular-debuginfo   Extra Packages for Enterprise Linux Modular 8 - Testing - x86_64 - Debug - RETIRED    無効化
epel-testing-modular-source      Extra Packages for Enterprise Linux Modular 8 - Testing - x86_64 - Source - RETIRED   無効化
epel-testing-source              Extra Packages for Enterprise Linux 8 - Testing - x86_64 - Source                     無効化

インストールが確認できない場合は以下でインストールできるかと思います。

# dnf install epel-release

epel リポジトリを有効にしつつ collectd をインストールします。

[root@cw-test ~]# dnf --enablerepo=epel install collectd
Extra Packages for Enterprise Linux 8 - x86_64                                               6.6 kB/s | 3.9 kB     00:00
Extra Packages for Enterprise Linux 8 - x86_64                                                21 MB/s |  16 MB     00:00
メタデータの期限切れの最終確認: 0:00:05 前の 2023年12月15日 20時39分27秒 に実施しました。
依存関係が解決しました。
\=============================================================================================================================
 パッケージ                  アーキテクチャー          バージョン                         リポジトリー                 サイズ
\=============================================================================================================================
インストール:
 collectd                    x86_64                    5.9.0-5.el8                        epel                         716 k
依存関係のインストール:
 yajl                        x86_64                    2.1.0-12.el8                       appstream                     40 k

トランザクションの概要
\=============================================================================================================================
インストール  2 パッケージ

ダウンロードサイズの合計: 756 k
インストール後のサイズ: 2.4 M
これでよろしいですか? [y/N]: y

collectd の起動と自動起動を行います。

[root@cw-test ~]# systemctl enable --now collectd.service
Created symlink /etc/systemd/system/multi-user.target.wants/collectd.service → /usr/lib/systemd/system/collectd.service.

起動と自動起動を確認します。

[root@cw-test ~]# systemctl status collectd.service
● collectd.service - Collectd statistics daemon
   Loaded: loaded (/usr/lib/systemd/system/collectd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-12-15 20:40:33 JST; 13s ago

collectd 設定ファイル編集

collectd インストール時は出力ログレベルが info になっています。
この状態だと以下のように大量のログが発生してしまうのでログレベルは notice に変更しておきます。

collectd
collectd

設定ファイルのバックアップを取得します。

[root@cw-test ~]# ll /etc/collectd.conf
-rw-r--r-- 1 root root 44650 11月 11  2019 /etc/collectd.conf
# cp -p /etc/collectd.conf{,_`date "+%Y%m%d"`}
[root@cw-test ~]# ll /etc/collectd.conf*
-rw-r--r-- 1 root root 44650 11月 11  2019 /etc/collectd.conf
-rw-r--r-- 1 root root 44650 11月 11  2019 /etc/collectd.conf_20231218

バックアップ元と差異がない事を確認します、何も出力されていなければOKです。

# diff /etc/collectd.conf{_`date "+%Y%m%d"`,}

中身も確認しておきます。

# cat /etc/collectd.conf_`date "+%Y%m%d"`

バックアップの取得が確認できたので設定ファイルを編集していきます。

# vim /etc/collectd.conf
#<Plugin syslog>
#       LogLevel info
#</Plugin>

<Plugin syslog>
       LogLevel notice
</Plugin>

編集内容を確認し、

[root@cw-test ~]# diff /etc/collectd.conf{_`date "+%Y%m%d"`,}
77,79c77,79
< #<Plugin syslog>
< #     LogLevel info
< #</Plugin>
\---
> <Plugin syslog>
>       LogLevel notice
> </Plugin>

collectd を再起動します。

# systemctl status collectd
# systemctl restart collectd
# systemctl status collectd

以下の警告は Write プラグインに関するもので、今回不要なのでそのままで大丈夫です。

plugin_dispatch_values: No write callback has been registered...


collectdのログ出力を抑制する

通常collectdは少なくとも1つのWriteプラグインを有効にして使用するものですが、CloudWatchエージェントから使うだけならWriteプラグインは不要です。

CloudWatch Agent 設定ファイル作成

CloudWatch Agent のインストールを確認します。

[root@cw-test ~]# dnf list installed | grep amazon-cloudwatch-agent
amazon-cloudwatch-agent.x86_64              1.300032.0b330-1                                  @System

インストール確認できない場合は以下でインストールしてもらえればと思います。

# wget https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/centos/amd64/latest/amazon-cloudwatch-agent.rpm
# rpm -U ./amazon-cloudwatch-agent.rpm
# dnf list installed | grep amazon-cloudwatch-agent

エージェントを起動して設定ファイルを作成していきます。

# /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...
I! imds retry client will retry 1 timesAre 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. cwagent
2. root
3. others
default choice: [1]:
2

# StatsDデーモンを起動するか(カスタムメトリクスを採取する際に使用します。
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
1

# StatsDデーモンが使用するポートを指定します。
Which port do you want StatsD daemon to listen to?
default choice: [8125]
8125

# StatsDデーモンの収集間隔を指定します。
What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:
1

# StatsDデーモンのデータ集約間隔を指定します。
What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:
4

# 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]:
1

# CPU、メモリといったシステム全体に対するカスタムメトリクスを採取するかを選択します。
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1

# CPUコア単位での使用率を取得するか
Do you want to monitor cpu metrics per core?
1. yes
2. no
default choice: [1]:
1

# ImageId、InstanceId、InstanceType、AutoScalingGroupNameを取得するか
Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:
1

# メトリクスをInstanceIdで集約するか
Do you want to aggregate ec2 dimensions (InstanceId)?
1. yes
2. no
default choice: [1]:
1

# 高解像度メトリクスの収集間隔
Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
4

# メトリクスの収集レベルを指定します、レベルによって取得できるメトリクスが異なります。
# https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
1

# 作成された設定ファイル
Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "metrics": {
                "aggregation_dimensions": [
                        [
                                "InstanceId"
                        ]
                ],
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 60
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        }
                }
        }
}

# 作成された設定ファイルに問題ないか
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:
1

# 移行のためにインポートする既存の 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

# 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 logs に表示されるロググループ名を設定します。
Log group name:
default choice: [messages]
cw-test_/var/log/messages

# ログクラスを指定します。
# https://aws.amazon.com/jp/blogs/news/new-amazon-cloudwatch-log-class-for-infrequent-access-logs-at-a-reduced-price/
Log group class:
1. STANDARD
2. INFREQUENT_ACCESS
default choice: [1]:
1

# CloudWatch logs に表示されるログストリーム名を設定します。
Log stream name:
default choice: [{instance_id}]
{instance_id}

# ログの保持期間を指定します。
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. 1096
18. 1827
19. 2192
20. 2557
21. 2922
22. 3288
23. 3653
default choice: [1]:
1

# 他に収集してほしいログファイルが存在するか
Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2

# X-ray を使用するか
Do you want the CloudWatch agent to also retrieve X-ray traces?
1. yes
2. no
default choice: [1]:
2

# これまでの設定を元に作成された設定ファイル
Existing config JSON identified and copied to:  /opt/aws/amazon-cloudwatch-agent/etc/backup-configs
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/messages",
                                                "log_group_class": "STANDARD",
                                                "log_group_name": "cw-test_/var/log/messages",
                                                "log_stream_name": "{instance_id}",
                                                "retention_in_days": -1
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "aggregation_dimensions": [
                        [
                                "InstanceId"
                        ]
                ],
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 60
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 60,
                                "metrics_collection_interval": 10,
                                "service_address": ":8125"
                        }
                }
        }
}
# 上記で問題あるかどうか、ここで設定ファイルのパスを確認できます。
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.

作成された設定ファイルを確認します。

  • "files" セクション

    • ログファイル "/var/log/messages" の内容を
    • ロググループ名 "cw-test_/var/log/messages"
    • ログストリーム名をインスタンスIDとしてコンパネ上に出力します。
  • "metrics"-"metrics_collected" セクション

    • "disk"
    • "used_percent"
       - ディスク使用率を取得
    • "mem"
    • "mem_used_percent"
       - メモリ使用率
    • "statsd"
       - StatsD のメトリクス収集間隔や使用ポートを設定しています。
# cat /opt/aws/amazon-cloudwatch-agent/bin/config.json
{
  "agent": {
    "metrics_collection_interval": 60,
    "run_as_user": "root"
  },
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/var/log/messages",
            "log_group_class": "STANDARD",
            "log_group_name": "cw-test_/var/log/messages",
            "log_stream_name": "{instance_id}",
            "retention_in_days": -1
          }
        ]
      }
    }
  },
  "metrics": {
    "aggregation_dimensions": [["InstanceId"]],
    "append_dimensions": {
      "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
      "ImageId": "${aws:ImageId}",
      "InstanceId": "${aws:InstanceId}",
      "InstanceType": "${aws:InstanceType}"
    },
    "metrics_collected": {
      "collectd": {"metrics_aggregation_interval": 60},
      "disk": {
        "measurement": ["used_percent"],
        "metrics_collection_interval": 60,
        "resources": ["*"]
      },
      "mem": {
        "measurement": ["mem_used_percent"],
        "metrics_collection_interval": 60
      },
      "statsd": {
        "metrics_aggregation_interval": 60,
        "metrics_collection_interval": 10,
        "service_address": ":8125"
      }
    }
  }
}

CloudWatch Agent 起動

CloudWatch Agent を起動します。

「amazon-cloudwatch-agent-ctl」が存在するディレクトリに移動し、

# cd /opt/aws/amazon-cloudwatch-agent/bin/
[root@cw-test bin]# ll amazon-cloudwatch-agent-ctl
-rwxr-xr-x 1 root root 14103 12月  1 06:24 amazon-cloudwatch-agent-ctl

CloudWatch Agent を起動します。

# 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 I! imds retry client will retry 1 timesSuccessfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp
Start configuration validation...
2023/12/18 10:19:28 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp ...
2023/12/18 10:19:28 I! Valid Json input schema.
2023/12/18 10:19:28 D! ec2tagger processor required because append_dimensions is set
2023/12/18 10:19:28 D! pipeline hostDeltaMetrics has no receivers
2023/12/18 10:19:28 Configuration validation first phase succeeded
I! Detecting run_as_user...
I! Trying to detect region from ec2
D! [EC2] Found active network interface
I! imds retry client will retry 1 times
/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.

CloudWatch Agent の起動を確認し

[root@cw-test bin]# 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 Mon 2023-12-18 10:19:29 JST; 51s ago

自動起動を有効にします。

# systemctl enable amazon-cloudwatch-agent
[root@cw-test bin]# systemctl is-enabled amazon-cloudwatch-agent
enabled

コンパネ確認

CloudWatch にてカスタムメトリクスの取得と、ログファイルの出力を確認します。

カスタムメトリクスの取得確認

CloudWatch コンソールを開いて左側メニューから [ すべてのメトリクス ] を選択し、検索欄に インスタンスID を入力します。

カスタムメトリクス確認①
カスタムメトリクス確認①

[ CWAgent > InstanceId ] をクリックすると、

カスタムメトリクス確認②
カスタムメトリクス確認②

ディスク使用率、メモリ使用率を取得できている事が確認できます。

カスタムメトリクス確認③
カスタムメトリクス確認③

ログファイルの出力確認

CloudWatch コンソールを開いて左側メニューから [ ロググループ ] を選択し、検索欄にロググループ名を入力する事でログの出力を確認できます。

ログファイル確認①
ログファイル確認①

以上でカスタムメトリクスの取得とログファイルの出力が確認できました。

もしカスタムメトリクスの取得やログファイルの出力が確認できない場合は以下確認してもらえればと思います。

・EC2 に割り当てられている IAM ロール
・セキュリティグループ インバウンドルール 443 許可
・CloudWatch Agent のステータス
・CloudWatch Agent ログ

# less /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log

続いて、カスタムメトリクスとログファイルの追加を行っていきます。

カスタムメトリクス、ログファイル追加手順

メトリクスやログファイルを追加したい場合の大まかな手順は以下となります。

  • CloudWatch Agent 設定ファイル編集
  • CloudWatch Agent 再起動
     - CloudWatch Agent 停止
     - CloudWatch Agent 設定ファイルの再読み込み
     - CloudWatch Agent 起動
  • コンパネにてカスタムメトリクスとログ出力の確認

今回は対象が1台のみなのでサーバ内で直接設定ファイルを編集しています。
台数増える場合は AWS Systems Manager の使用を検討していただければと思います。

CloudWatch Agent 設定ファイル編集

最初に設定ファイル config.json の場所と中身を確認します。

[root@cw-test ~]# ll /opt/aws/amazon-cloudwatch-agent/bin/
合計 328836
-rw-r--r-- 1 root root        15 12月  1 06:24 CWAGENT_VERSION
-rwxr-xr-x 1 root root 112617512 12月  1 06:24 amazon-cloudwatch-agent
-rwxr-xr-x 1 root root  12472776 12月  1 06:24 amazon-cloudwatch-agent-config-wizard
-rwxr-xr-x 1 root root     14103 12月  1 06:24 amazon-cloudwatch-agent-ctl
-rwxr-xr-x 1 root root  11859960 12月  1 06:24 config-downloader
-rwxr-xr-x 1 root root 108156968 12月  1 06:24 config-translator
-rw-r--r-- 1 root root      1217 12月 18 10:03 config.json
-rwxr-xr-x 1 root root  91579944 12月  1 06:24 start-amazon-cloudwatch-agent

設定ファイル見つからない場合は以下のように "config.json" で検索かけてもらえればと思います。

[root@cw-test ~]# find /* -name "config.json" -type f
/opt/aws/amazon-cloudwatch-agent/bin/config.json

設定ファイルのバックアップを取得します。

# ll /opt/aws/amazon-cloudwatch-agent/bin/config.json*
# cp -p /opt/aws/amazon-cloudwatch-agent/bin/config.json{,_`date "+%Y%m%d"`}
[root@cw-test ~]# ll /opt/aws/amazon-cloudwatch-agent/bin/config.json*
-rw-r--r-- 1 root root 1217 12月 18 10:03 /opt/aws/amazon-cloudwatch-agent/bin/config.json
-rw-r--r-- 1 root root 1131 12月 15 20:52 /opt/aws/amazon-cloudwatch-agent/bin/config.json_20231218

何も出力されなければOKです。

# diff /opt/aws/amazon-cloudwatch-agent/bin/config.json{_`date "+%Y%m%d"`,}
# cat /opt/aws/amazon-cloudwatch-agent/bin/config.json_`date "+%Y%m%d"`

バックアップの取得が確認できたら設定ファイルを編集していきます。

# vim /opt/aws/amazon-cloudwatch-agent/bin/config.json

ログファイル追加

以下ログファイル追加時の一例となります。

  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/var/log/messages",
            "log_group_class": "STANDARD",
            "log_group_name": "cw-test_/var/log/messages",
            "log_stream_name": "{instance_id}",
            "retention_in_days": -1
          }
        ]
      }
    }
  },

  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/var/log/messages",
            "log_group_class": "STANDARD",
            "log_group_name": "cw-test_/var/log/messages",
            "log_stream_name": "{instance_id}",
            "retention_in_days": -1
          },
          {
            "file_path": "/var/log/httpd/access_log",
            "log_group_class": "STANDARD",
            "log_group_name": "cw-test_/var/log/httpd/access_log",
            "log_stream_name": "{instance_id}",
            "retention_in_days": -1
          }
        ]
      }
    }
  },

カスタムメトリクス追加

カスタムメトリクスはプロセス監視の際 procstat プラグインを使用して "pid_file", "exe", "pattern" の 3 パターンで追加する事ができます。

今回は 3 つのパターンで sshd, httpd, php-fpm プロセス数を監視するように設定しています。

procstat 向けの CloudWatch エージェントの設定

procstat プラグインを使用するには、CloudWatch エージェント設定ファイルの procstat セクションに metrics_collected セクションを追加します。
モニターリングするプロセスを指定するには 3 つの方法があります。これらの方法のうち使用できるのは 1 つのみですが、この 1 つの方法を使用して複数のプロセスを指定してモニターリングできます。

pid_file: 作成するプロセス識別番号 (PID) ファイルの名前でプロセスを選択します。

exe: 正規表現の照合ルールを使用して、指定した文字列と一致するプロセス名のプロセスを選択します。
一致は「含む」一致です。つまり、一致する用語として agent を指定した場合、cloudwatchagent のような名前を持つプロセスは、その用語に一致します。詳細については、「Syntax」を参照してください。

pattern: プロセスの起動に使用するコマンドラインでプロセスを選択します。
正規表現の照合ルールを使用して指定した文字列と一致するコマンドラインを持つすべてのプロセスが選択されます。コマンドで使用されるパラメータやオプションも含めて、コマンドライン全体がチェックされます。
一致は「含む」一致です。つまり、一致する用語として -c を指定した場合、-config のようなパラメータを持つプロセスは、その用語に一致します。

Linux サーバーの場合、exe セクションまたは pattern セクションで指定した文字列は正規表現として評価されます。

procstat プラグインでプロセスメトリクスを収集する

CPU、ディスク、メモリのメトリクスについてはこちらを参考にしていただければと思います。
CloudWatch エージェントにより収集されるメトリクス

以下プロセス監視を行うカスタムメトリクス追加時の設定例となります。

"pid_file" で取得する場合

  • pid ファイルを指定します。
  • /var/run/ 配下で対象を確認できます。
[root@cw-test ~]# ll /var/run/ | grep sshd
-rw-r--r--  1 root           root              5 12月 18 09:11 sshd.pid

{
  "pid_file": "/var/run/sshd.pid",
  "measurement": ["pid_count"],
  "metrics_collection_interval": 10
}

"exe" で取得する場合

  • プロセス名を指定します。
[root@cw-test ~]# ps aux | grep httpd | grep -v grep
root        4536  0.0  0.7 274248 15632 ?        Ss   14:04   0:00 /usr/sbin/httpd -DFOREGROUND
apache      4537  0.0  0.4 277908  9444 ?        S    14:04   0:00 /usr/sbin/httpd -DFOREGROUND
apache      4538  0.0  0.4 279148  9600 ?        S    14:04   0:00 /usr/sbin/httpd -DFOREGROUND
apache      4539  0.0  0.6 1795608 13088 ?       Sl   14:04   0:01 /usr/sbin/httpd -DFOREGROUND
apache      4540  0.0  0.8 1926744 17480 ?       Sl   14:04   0:01 /usr/sbin/httpd -DFOREGROUND
apache      4541  0.0  0.9 1795608 19336 ?       Sl   14:04   0:01 /usr/sbin/httpd -DFOREGROUND
[root@cw-test ~]# ls -ald /proc/4536/exe
lrwxrwxrwx 1 root root 0 12月 18 14:04 /proc/4536/exe -> /usr/sbin/httpd

{
  "pid_file": "httpd",
  "measurement": ["pid_count"],
  "metrics_collection_interval": 10
}

もしくは

{
  "pid_file": "/usr/sbin/httpd",
  "measurement": ["pid_count"],
  "metrics_collection_interval": 10
}

"pattern" で取得する場合

  • コマンドラインを指定します。
  • 指定したコマンドラインを含むすべてのプロセスを監視します。
[root@cw-test ~]# ps aux | grep php | grep -v grep
root        4505  0.0  1.7 498076 34620 ?        Ss   14:03   0:00 php-fpm: master process (/etc/php-fpm.conf)
apache      4506  0.0  0.8 503120 17220 ?        S    14:03   0:00 php-fpm: pool www
apache      4507  0.0  0.8 503120 17220 ?        S    14:03   0:00 php-fpm: pool www
apache      4508  0.0  0.8 503120 17220 ?        S    14:03   0:00 php-fpm: pool www
apache      4509  0.0  0.8 503120 17220 ?        S    14:03   0:00 php-fpm: pool www
apache      4510  0.0  0.8 503120 17220 ?        S    14:03   0:00 php-fpm: pool www

コマンドライン

php-fpm: master process (/etc/php-fpm.conf)
php-fpm: pool www
php-fpm: pool www...

{
  "pid_file": "php-fpm",
  "measurement": ["pid_count"],
  "metrics_collection_interval": 10
}

設定ファイル編集内容

  "metrics": {

                ~中略~

      "statsd": {
        "metrics_aggregation_interval": 60,
        "metrics_collection_interval": 10,
        "service_address": ":8125"
      }
    }
  }
}

  "metrics": {

                ~中略~

      "statsd": {
        "metrics_aggregation_interval": 60,
        "metrics_collection_interval": 10,
        "service_address": ":8125"
      },
      "procstat": [
        {
          "pid_file": "/var/run/sshd.pid",
          "measurement": ["pid_count"],
          "metrics_collection_interval": 10
        },
        {
          "exe": "httpd",
          "measurement": ["pid_count"],
          "metrics_collection_interval": 10
        },
        {
          "pattern": "php-fpm",
          "measurement": ["pid_count"],
          "metrics_collection_interval": 10
        }
      ]
    }
  }
}

設定ファイル全体

# cat /opt/aws/amazon-cloudwatch-agent/bin/config.json
{
  "agent": {
    "metrics_collection_interval": 60,
    "run_as_user": "root"
  },
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "/var/log/messages",
            "log_group_class": "STANDARD",
            "log_group_name": "cw-test_/var/log/messages",
            "log_stream_name": "{instance_id}",
            "retention_in_days": -1
          },
          {
            "file_path": "/var/log/httpd/access_log",
            "log_group_class": "STANDARD",
            "log_group_name": "cw-test_/var/log/httpd/access_log",
            "log_stream_name": "{instance_id}",
            "retention_in_days": -1
          }
        ]
      }
    }
  },
  "metrics": {
    "aggregation_dimensions": [["InstanceId"]],
    "append_dimensions": {
      "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
      "ImageId": "${aws:ImageId}",
      "InstanceId": "${aws:InstanceId}",
      "InstanceType": "${aws:InstanceType}"
    },
    "metrics_collected": {
      "collectd": {"metrics_aggregation_interval": 60},
      "disk": {
        "measurement": ["used_percent"],
        "metrics_collection_interval": 60,
        "resources": ["*"]
      },
      "mem": {
        "measurement": ["mem_used_percent"],
        "metrics_collection_interval": 60
      },
      "statsd": {
        "metrics_aggregation_interval": 60,
        "metrics_collection_interval": 10,
        "service_address": ":8125"
      },
      "procstat": [
        {
          "pid_file": "/var/run/sshd.pid",
          "measurement": ["pid_count"],
          "metrics_collection_interval": 10
        },
        {
          "exe": "httpd",
          "measurement": ["pid_count"],
          "metrics_collection_interval": 10
        },
        {
          "pattern": "php-fpm",
          "measurement": ["pid_count"],
          "metrics_collection_interval": 10
        }
      ]
    }
  }
}

編集内容確認

[root@cw-test ~]# diff /opt/aws/amazon-cloudwatch-agent/bin/config.json{_`date "+%Y%m%d"`,}
15a16,22
>           },
>           {
>             "file_path": "/var/log/httpd/access_log",
>             "log_group_class": "STANDARD",
>             "log_group_name": "cw-test_/var/log/httpd/access_log",
>             "log_stream_name": "{instance_id}",
>             "retention_in_days": -1
44c51,68
<       }
---
>       },
>       "procstat": [
>         {
>           "pid_file": "/var/run/sshd.pid",
>           "measurement": ["pid_count"],
>           "metrics_collection_interval": 10
>         },
>         {
>           "exe": "httpd",
>           "measurement": ["pid_count"],
>           "metrics_collection_interval": 10
>         },
>         {
>           "pattern": "php-fpm",
>           "measurement": ["pid_count"],
>           "metrics_collection_interval": 10
>         }
>       ]

CloudWatch Agent 再起動

設定ファイルの内容を反映させるため CloudWatch Agent の再起動を行います。

# cd /opt/aws/amazon-cloudwatch-agent/bin/

起動前ステータスを確認します。

# ./amazon-cloudwatch-agent-ctl -a status

CloudWatch Agent を停止します。

# ./amazon-cloudwatch-agent-ctl -m ec2 -a stop

読み込む設定ファイルを指定して起動を行います。

[root@cw-test 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 I! imds retry client will retry 1 timesSuccessfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp
Start configuration validation...
2023/12/18 17:33:47 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_config.json.tmp ...
2023/12/18 17:33:47 I! Valid Json input schema.
2023/12/18 17:33:47 D! ec2tagger processor required because append_dimensions is set
2023/12/18 17:33:47 D! pipeline hostDeltaMetrics has no receivers
2023/12/18 17:33:47 Configuration validation first phase succeeded
I! Detecting run_as_user...
I! Trying to detect region from ec2
D! [EC2] Found active network interface
I! imds retry client will retry 1 times
/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

起動後のステータスを確認します。

[root@cw-test bin]# ./amazon-cloudwatch-agent-ctl -a status
{
  "status": "running",
  "starttime": "2023-12-18T08:33:47+00:00",
  "configstatus": "configured",
  "version": "1.300032.0b330"
}

コンパネにてカスタムメトリクスとログ出力の確認

CloudWatch にてカスタムメトリクスとログ出力が追加されている事を確認します。

カスタムメトリクス追加の確認

CloudWatch コンソールを開いて左側メニューから [ すべてのメトリクス ] を選択し、検索欄に インスタンスID を入力します。

カスタムメトリクス取得項目が増えている事が確認できます。

追加後カスタムメトリクス確認①
追加後カスタムメトリクス確認①

sshd

追加後カスタムメトリクス確認_sshd
追加後カスタムメトリクス確認_sshd

httpd

追加後カスタムメトリクス確認_httpd
追加後カスタムメトリクス確認_httpd

php-fpm

追加後カスタムメトリクス確認_php-fpm
追加後カスタムメトリクス確認_php-fpm

ログファイル出力追加の確認

CloudWatch コンソールを開いて左側メニューから [ ロググループ ] を選択し、検索欄にロググループ名を入力する事でログの出力を確認できます。

追加後ログファイル確認①
追加後ログファイル確認①

もしカスタムメトリクスの取得やログファイルの出力が確認できない場合は以下確認してもらえればと思います。

・EC2 に割り当てられている IAM ロール
・セキュリティグループ インバウンドルール 443 許可
・設定ファイル記述内容
・CloudWatch Agent のステータス
・CloudWatch Agent ログ

# less /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log

お疲れ様でした。
以上でカスタムメトリクスの取得とログファイルの追加が確認できました。

この記事がエンジニア初学者の参考になれば幸いです。
最後まで読んでいただきありがとうございました。

返信を残す

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

CAPTCHA