0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【CloudWatch】EC2をCloudWatchで監視する方法(標準&カスタムメトリクス)

Posted at

■目的

EC2(Amazon Linux 2023)をCloudWatchの標準メトリクス、カスタムメトリクス両方で監視をする。CloudWatch…モニタリングツール

CloudWatchには標準メトリクス、カスタムメトリクスが存在する。

メトリクス 説明
標準メトリクス AWS側で設定されているもの。CloudWatchエージェントは不要。
カスタムメトリクス 標準メトリクス以外のもの監視したいときに使用。CloudWatchエージェントが必要。

標準メトリクスでの監視

  1. EC2>インスタンス>モニタリングタブ
    CPU使用率、ネットワーク受信量、送信量のグラフがあることを確認できる。

標準メトリクスは自動で監視されているので、監視に伴う作業は不要となる。

・EC2のモニタリングタブでの表示
cloudwatch_01.png

・CloudWatchでの表示
CloudWatchのほうが圧倒的に見やすい。
cloudwatch_02.png

※今回、詳細モニタリングは有効化しない。(画像の通り、追加料金が発生するので)
cloudwatch_03.png

CloudWatchでのモニタリングは、基本と詳細の2種類が存在する。

モニタリング 説明
基本モニタリング 5分間隔のモニタリング、無料
詳細モニタリング… 1分間隔のモニタリング、10個まで無料それ以降は有料

カスタムメトリクスでの監視

・カスタムメトリクス…標準メトリクス以外のもの監視したいときに使用。CloudWatchエージェントが必要。

まず、CloudWatchエージェントをインストールする。

Step 1:CloudWatchエージェントのインストール

dnfコマンドでインストールを実施。

CloudWatchエージェントインストールコマンド
dnf install -y amazon-cloudwatch-agent

[ec2-user@ip-172-31-89-5 ~]$ sudo dnf install -y amazon-cloudwatch-agent
Amazon Linux 2023 repository
Amazon Linux 2023 Kernel Livepatch repository   134 kB/s |  15 kB     00:00
Dependencies resolved.
================================================================================
 Package                   Arch     Version                 Repository     Size
================================================================================
Installing:
 amazon-cloudwatch-agent   x86_64   1.300052.1-1.amzn2023   amazonlinux   115 M

completeが表示されることを確認👏

Installed:
  amazon-cloudwatch-agent-1.300052.1-1.amzn2023.x86_64

Complete!

今回使用するコマンドは、Amazon Linux 2023なのでdnf

  • Amazon Linux 2までは:yum(YUM v3)
  • Amazon Linux 2023から:dnf(YUM v4ベース)

インストール前:インストールしていないので、もちろん見つからないと表示される。

[ec2-user@ip-172-31-89-5 ~]$ sudo systemctl status amazon-cloudwatch-agent
Unit amazon-cloudwatch-agent.service could not be found.

インストール後:inactive状態であるとの表示

[ec2-user@ip-172-31-89-5 ~]$ sudo systemctl status amazon-cloudwatch-agent
○ amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
     Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; disabled; preset: disabled)
     Active: inactive (dead)
[ec2-user@ip-172-31-89-5 ~]$

設定ファイル等は以下の場所にある

[ec2-user@ip-172-31-89-5 ~]$ ls -la /opt/aws/amazon-cloudwatch-agent/etc
total 4
drwxr-xr-x. 3 root root  65 Apr 15 02:48 .
drwxr-xr-x. 7 root root 140 Apr 15 02:48 ..
drwxr-xr-x. 2 root root   6 Feb 25 22:34 amazon-cloudwatch-agent.d
-rw-r--r--. 1 root root 959 Feb 25 22:34 common-config.toml
[ec2-user@ip-172-31-89-5 ~]$

Step 2:collectdのインストール

  • collectdのインストールコマンド

dnf install collectd でインストールを実施。
dnf list installed | grep collectd で出力があればcollectdはインストールされているので、対応不要。
出力がない場合は、インストールが必要。Amazon Linux 2023はインストールが必要。

collectd…CloudWatch Agentと連携してメモリやディスクI/Oなどの詳細なメトリクスを収集する時に使える軽量なデーモン

Step 3:rsyslogのインストール

※カスタムメトリクスで/var/log/messagesを監視したい場合。

  • インストール
    dnf install rsyslog

  • 自動起動の有効化
    systemctl enable rsyslog

  • 起動
    systemctl start rsyslog

Step 4:CloudWatch設定ウィザードの実行

①ウィザードを起動し、設定していく。質問数は20個弱ほど。
ウィザード起動コマンド
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

[ec2-user@ip-172-31-89-5 ~]$ sudo /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.                                           =
================================================================
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:

※以下はrootを選択すること。

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

②解答が終わると、以下JSON形式の設定ファイルが作成される。(以下一部省略)

Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "cwagent"
        },

③作成後、cat /opt/aws/amazon-cloudwatch-agent/bin/config.json で設定した内容が出力されているか確認する。
ウィザードで正常に設定できてないと、catで何も表示されない。

ウィザードの設定ファイルは、/opt/aws/amazon-cloudwatch-agent/bin/config.json に保存される。

④JSONの構文チェックを行う
cat /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json | jq .

⑤構文チェックでエラーがなければ、ファイルをコピーする。
cp /opt/aws/amazon-cloudwatch-agent/bin/config.json /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json

補足
/opt/aws/amazon-cloudwatch-agent/bin/config.json …一時的なファイル
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json …実際にcloudwatchが読み込むファイル

Step 5:CloudWatch Agentの起動と有効化

CloudWatch Agentを起動し、自動起動を有効化する。

  • 起動
    systemctl start amazon-cloudwatch-agent

  • サービス自動起動を有効化
    systemctl enable amazon-cloudwatch-agent

  • ステータス確認
    systemctl status amazon-cloudwatch-agent

正常に起動できることを確認すること。起動できると以下のように表示される👏🎉

[root@test-server ec2-user]# sudo systemctl status amazon-cloudwatch-agent
**** amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
     Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; **enabled**; preset: disabled)
     Active: **active (running)** since Tue 2025-04-15 21:26:35 JST; 14s ago
   Main PID: 79028 (amazon-cloudwat)
      Tasks: 6 (limit: 1111)
     Memory: 41.1M
        CPU: 224ms
     CGroup: /system.slice/amazon-cloudwatch-agent.service
             mq79028 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml -envconfig /opt/aws/amazon-cloud>

Step 6:IAMロール作成

1.IAM>ロール>ロールを作成をクリック

信頼されたエンティティを選択:AWSのサービス
ユースケース:EC2

2.許可ポリシーのロールにて:CloudWatchAgentAdminPolicyを選択

3.名前、確認、および作成、にてロール名を記入し作成

4.作成されたことを確認

cloudwatch_04.png

5.EC2>アクション>セキュリティ>IAMロールを変更

cloudwatch_05.png

6.作成したロールをアタッチする
7. EC2>詳細タブのIAMロールに対象のポリシーが設定されていることを確認

Step 7:CloudWatchの確認

  • /var/log/messages の監視結果確認

CloudWatch>ロググループ>messagesにて確認可能✨

cloudwatch_06.png

■タイムゾーンの変更

1.タイムゾーンをローカルタイムゾーンに変更する(デフォルトはUTCタイムゾーン)

cloudwatch_07.png

2.CPU Utilization

cloudwatch_08.png

cloudwatch_09.png

■エラー&詰まった個所

①CloudWatchエージェントのインストールで[Connection timeout]が表示される

事象: [Connection timeout after 30002 ms]でエージェントのインストールができない。


[ec2-user@ip-172-31-89-5 ~]$ sudo dnf install -y amazon-cloudwatch-agent
^CAmazon Linux 2023 repository                                                    [                        ===                                               ] ---  B/s |   0  B     --:-- ETAmazon Linux 2023 repository                                                                                                                                 0.0  B/s |   0  B     02:17
Errors during downloading metadata for repository 'amazonlinux':
  - Curl error (28): Timeout was reached for https://al2023-repos-us-east-1-de612dc2.s3.dualstack.us-east-1.amazonaws.com/core/mirrors/2023.7.20250331/x86_64/mirror.list [Connection timeout after 30002 ms]

原因:アウトバウンドがマイIPのみだった。
解決策:アウトバウンドを0.0.0.0/0に設定

ありがちなミスだと思う。最小アクセス設定にしていたことを思い出し、EC2>ネットワーク&セキュリティ>セキュリティグループにて、アウトバウンドを0.0.0.0/0に設定して、インターネットへの疎通ができ、エージェントがインストールできた。

②collectdがインストールされていないのが原因のエラー

事象:E! Error parsing /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml, open /usr/share/collectd/types.db: no such file or directory
原因:collectd がインストールされてない。
↓参考サイトより

Amazon Linux 2 にはデフォルトで collectd がインストールされていないにも関わらず、エージェントの設定ファイルを作成した際に collectd のメトリクスを有効にしていたため、上記のエラーが発生しました。

解決策:collectd をインストールした。

dnf list installed | grep collectd でインストールされているか確認可能。以下のエラーを検索した際に、引用したサイトを見つけた。collectedのインストールが必要と知り、インストール。

2025/04/15 04:14:19 E! Error in reading old python config from file /var/awslogs/etc/awslogs. conf: open /var/awslogs/etc/awslogs.conf: no such file or directory panic: E! Error in reading old python config from file /var/awslogs/etc/awslogs.conf: open /v ar/awslogs/etc/awslogs.conf: no such file or directory

③amazon-cloudwatch-agent.json does not exist or cannot read. Skipping

事象:設定ファイル作成後の、エージェント起動でエラー。
意味:CloudWatch Agent の設定ファイルが見つからないか、読み取りできないから起動できない。
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json does not exist or cannot read. Skipping

原因:今回設定している、CloudWatchAgentServerPolicy だと、ssm:PutParameter がないのでエラーが出た模様。(GPTに聞いた)

原因:エージェントが /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl-config-wizard を通じて設定を SSM Parameter Store に保存しようとしたけど、IAMロールに適切なポリシーが付与されていないのが原因です。

解決策:ロールの変更
ロールをssm:PutParameter が含まれているCloudWatchAgentAdminPolicyに変更する。

/opt/aws/amazon-cloudwatch-agent/bin/config.json を削除。
IAMロールを作成、アタッチしてもう一度ウィザードを実行。が、最後に以下のエラーが。

Please make sure the creds you used have the right permissions configured for SSM access. Error in putting config to parameter store AmazonCloudWatch-linux: AccessDeniedException: User: arn:aws:sts::061039765808:assumed-role/CloudWatchAgentServerPolicy/i-068418e463bb52509 is not authorized to perform: ssm:PutParameter on resource: arn:aws:ssm:us-east-1:061039765808:parameter/AmazonCloudWatch-linux because no identity-based policy allows the ssm:PutParameter action
→ロールをssm:PutParameter が含まれているCloudWatchAgentAdminPolicyに変更したら解消した。

④CloudWatch Agentが「amazon-cloudwatch-agent.json': No such file or directory」で起動しない!

事象:CloudWatchエージェントが起動しない

原因:設定ファイルがない。

[ec2-user@ip-172-31-89-5 ~]$ ls -l /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
ls: cannot access '/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json': No such file or directory

解決策:ファイルのコピー
sudo cp /opt/aws/amazon-cloudwatch-agent/bin/config.json /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json

💡補足

パス 役割 備考
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json 🌟メイン設定ファイル 一番よく使う。start-amazon-cloudwatch-agent 実行時にこのファイルが読み込まれる
/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/ 📂追加設定のディレクトリ .json ファイルを置くと、メイン設定とマージされる。存在しないと警告が出るけど、問題なし
/opt/aws/amazon-cloudwatch-agent/bin/config.json ⚙️保存された設定のキャッシュ amazon-cloudwatch-agent-ctl-a fetch-config などで取得した設定がここに保存されることが多い。直接編集は基本しない

⑤CloudWatchエージェントの起動失敗。

事象:Cannot access /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.dが表示される


Apr 15 22:37:26 test-server start-amazon-cloudwatch-agent[81801]: Cannot access /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d: lstat /opt/aws/amazon-cloudwatch-agent/etc/a>

原因:
↓参考サイトより

CloudWatch Agent は .json 設定ファイルに加えて、/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d というディレクトリ内の追加設定ファイルも読み込もうとしているけど、その ディレクトリが存在しない というだけの警告

解決策:amazon-cloudwatch-agent.d のディレクトリを作成

⑥/var/log/messagesの値が取得できない

事象:/var/log/messagesの値が取得できない

原因:/var/log/messagesがそもそも存在しない!!

Amazon Linux 2023は、/var/logの配下にmessagesがありません。

解決策:rsyslogをインストール

  • インストール
    dnf install rsyslog

  • 自動起動の有効化
    systemctl enable rsyslog

  • 起動
    systemctl start rsyslog

⑦CloudWatchのロググループが表示されない。

事象:CloudWatchのロググループが表示されない。

原因:/var/log/messagesの読み取り権限がCloudWatch Agentにない。

[root@test-server ec2-user]# cat /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log | tail -50
2025-04-16T01:11:30Z E! [inputs.logfile] Failed to tail file /var/log/messages with error: open /var/log/messages: permission denied
2025-04-16T01:11:31Z E! [inputs.logfile] Failed to tail file /var/log/messages with error: open /var/log/messages: permission denied
2025-04-16T01:11:32Z E! [inputs.logfile] Failed to tail file /var/log/messages with error: open /var/log/messages: permission denied

解決策:CloudWatch Agentを root権限で起動・実行するよう変更。

vi less /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
cwagentをrootに変更する。

{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": **"root"**
}

CloudWatch Agentの設定ウィザードでは、デフォルトでCwagetになっている。

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

やったこと:

/var/log/messages は存在しているか?
ls -l /var/log/messages

② rsyslog の状態確認
systemctl status rsyslog

③ CloudWatch Agent のログ設定確認

                                    {
                                            "file_path": "/var/log/messages",
                                            "log_group_class": "STANDARD",
                                            "log_group_name": "messages",
                                            "log_stream_name": "{instance_id}",
                                            "retention_in_days": -1
                                    }

④IAM 権限確認
IAM>ポリシー>許可にて、logs:CreateLogGroup があることを確認

cloudwatch_10.png

⑤ CloudWatch Agent のログを確認する

cat /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log

[root@test-server ec2-user]# cat /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log | tail -50
2025-04-16T01:11:30Z E! [inputs.logfile] Failed to tail file /var/log/messages with error: open /var/log/messages: permission denied
2025-04-16T01:11:31Z E! [inputs.logfile] Failed to tail file /var/log/messages with error: open /var/log/messages: permission denied
2025-04-16T01:11:32Z E! [inputs.logfile] Failed to tail file /var/log/messages with error: open /var/log/messages: permission denied

→権限なし!これが原因

CloudWatch Agent はデフォルトで cwagent というユーザー(または root じゃないユーザー)で動いていて、/var/log/messages の読み取りができないと、ログを CloudWatch に送信できません。

less /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json で確認する。

{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "cwagent"
}

→rootで動かそうと思うので、CWagentからrootに変更

{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
}

cloudwatch_11.png

■所感

CloudWatchエージェントの監視設定を触ってみた感想 🖥️🔍

CloudWatchの監視設定は、想像以上に考慮すべき点が多かった。特にCloudWatchエージェントのウィザード設定は、内容を理解せずに進めるとトラブルになりやすいと感じた。

印象に残った点 ✍️

  • 設定の複雑さ:ウィザードの質問数が多く、すべてエンターで進められると思っていたが、ログ監視設定で「2」を選択しないとループし続ける仕様だった。

  • 設定ファイルの再利用:一度作成したamazon-cloudwatch-agent.jsonを他のサーバに配布することで、運用が楽になると感じた。

  • ウィザードの再実行注意:再実行すると、既存の設定ファイルが上書きされることを学んだ。

  • GUIの情報量:CloudWatchのGUIは情報量が多く、初見では戸惑うことが多かった。

  • ログの思い込み/var/log/messagesがあると勝手に思い込んでいたが、Amazon Linux 2023には存在しておらず、驚いた。

  • パッケージ管理の違い:Amazon Linux 2023ではdnfが使われており、yumとは操作感が異なっていた。

  • JSON構文チェックの便利さ:設定ファイルの編集時にJSON構文チェックが非常に役立ち、効率的だった。

  • 許可ポリシーの多さ:IAMのポリシー数が非常に多く(1000件近く)て圧倒されたが、CloudWatchエージェント用に用意されている管理ポリシーは以下の2つだった。

    🔹 CloudWatchAgentAdminPolicy
    🔹 CloudWatchAgentServerPolicy
    → 違いは「パラメータストアへの書き込み権限の有無」とのことだった。

 参考:https://dev.classmethod.jp/articles/cloudwatchagentadminpolicy-and-cloudwatchagentserverpolicy/

今後の改善・工夫点 🛠️

  • よく使う設定はテンプレート化して、再利用性を高めておきたい。
  • ウィザードの内容は事前に確認し、設定の意図を理解した上で選択する必要があると感じた。

参考になったサイト 🔗

次回やってみたいこと🍃

  • Cloudwatchエージェントのインストールで、以下を参考にSSMを使用してインストールする方法もあったので今度実施したい。

参考サイト)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?