【CloudWatch】EC2をCloudWatchで監視する方法（標準＆カスタムメトリクス）

## ■目的

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

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

## 標準メトリクスでの監視

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

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

・EC2のモニタリングタブでの表示
![cloudwatch_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/6a04c7dd-ba47-4b38-bef1-b28b9edd0e6a.png)

・CloudWatchでの表示
CloudWatchのほうが圧倒的に見やすい。
![cloudwatch_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/606cc485-bcf2-43c6-8f5c-27bf468413f1.png)

※今回、詳細モニタリングは有効化しない。（画像の通り、追加料金が発生するので）
![cloudwatch_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/8fd2e1ec-dbb3-4914-966e-284924087927.png)

:::note info
CloudWatchでのモニタリングは、基本と詳細の２種類が存在する。
:::
| モニタリング | 説明 |
| --- | --- |
| 基本モニタリング | ５分間隔のモニタリング、無料 |
| 詳細モニタリング…| １分間隔のモニタリング、10個まで無料それ以降は有料 |



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

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

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

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

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

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

```bash
[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が表示されることを確認👏

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

Complete!
```

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

- Amazon Linux 2までは：`yum（YUM v3）`
- Amazon Linux 2023から：`dnf（YUM v4ベース）`


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

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

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

```bash
[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 ~]$
```

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

```bash
[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はインストールが必要。

:::note info
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`

```bash
[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を選択すること。

```bash
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
```
②解答が終わると、以下JSON形式の設定ファイルが作成される。（以下一部省略）

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

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

:::note info
ウィザードの設定ファイルは、`/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`

:::note info
補足
`/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`

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

```bash
[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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/abe279ab-7ba4-4bca-a2e9-cea6b5a9f9d2.png)

5.EC2>アクション＞セキュリティ＞IAMロールを変更
    
![cloudwatch_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/49cb97c3-95aa-43ad-b649-a74f70f48ea6.png)

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

### Step 7：CloudWatchの確認

- `/var/log/messages` の監視結果確認

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

![cloudwatch_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/a8573f73-499c-4ff6-aee7-f748c2eee380.png)


■タイムゾーンの変更

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

![cloudwatch_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/4b49fe6e-b2fd-40e2-adee-70b7cdb64447.png)

2.CPU Utilization

![cloudwatch_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/27df4351-1fa5-402e-8193-3598143bb360.png)

![cloudwatch_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/5d43c27a-f803-45a4-aae9-a2fb129cb0b6.png)

## ■エラー＆詰まった個所

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

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

```bash

[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のインストールが必要と知り、インストール。

```bash
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エージェントが起動しない

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

```bash
[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`が表示される

```bash

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にない。

```bash
[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に変更する。

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

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


```bash
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/45dc5bab-eb58-41d4-9bec-9d2c1f0c80b6.png)


⑤ CloudWatch Agent のログを確認する

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

```bash
[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` で確認する。

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

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

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

![cloudwatch_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4082636/2221185d-e829-4f1e-aa91-e0c2d68a98e2.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/](https://dev.classmethod.jp/articles/cloudwatchagentadminpolicy-and-cloudwatchagentserverpolicy/)

#### 今後の改善・工夫点 🛠️

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

#### 参考になったサイト 🔗

* [CloudWatch設定ファイル作成の参考記事（Qiita）](https://qiita.com/santasan1224/items/1dc5214d119ea3b9815e)



#### 次回やってみたいこと🍃

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

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/installing-cloudwatch-agent-ssm.html

https://zenn.dev/yuta28/articles/ssm-cloudwatch-get

参考サイト）

https://blog.serverworks.co.jp/al2-vs-al2023

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html

https://qiita.com/tonkatsu_oishi/items/ec163751cc7f644f9cae