EC2にCloudWatchAgentを入れてメモリ使用率やディスク使用率を監視する。

EC2のメモリやディスクの使用率が見たいと思っても、そのままでは外部からは取得することができない。
AWSの管理の範囲はEC2の外部までなのでネットワークI/Oなど外部から見れるものはそのまま取得可能だが、メモリやディスクの情報を取得するにはAgentを入れて上げる必要がある。

以下のような項目はAgentを入れることで簡単に取得できるようになると思っていたのだが、案外詰まったのでメモ。
単にAgent入れただけだと`mem_used_percent`やら`disk_used_percent`とか見たいものが見れずに困る。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html#linux-metrics-enabled-by-CloudWatch-agent

# 1. EC2を用意する。

EC2を用意する。

```:インスタンス情報
AMI: Amazon Linux 2 AMI (HVM), SSD Volume Type
インスタンスタイプ: t2.micro
オンデマンドインスタンス
```

IAMロールにはデフォルトで用意されている`CloudWatchAgentServerPolicy`を使って適当なロールを作成し、それをアタッチする。

IAMロールの作り方
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent-commandline.html

# 2. CloudWatchAgentを入れる。

公式ドキュメント
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/download-cloudwatch-agent-commandline.html

3箇所くらいから選んでダウンロードする。東京リージョンならここと思われる。

```
$ wget https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
```

インストールする。

```
$ sudo rpm -U ./amazon-cloudwatch-agent.rpm
create group cwagent, result: 0
create user cwagent, result: 0
```

# 3. Configファイルを作成する。

wizardを用いてconfigファイルみたいなものを作る。質問に答えていくだけで作れる。
基本的にはデフォルトで良いが一部だけは変更。ここでの設定はSSMパラメータストアに送られる。

```
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
On which OS are you planning to use the agent?
1. linux
2. windows
default choice: [1]:           # [ ]内はデフォルト
                               # なにも指定しないでenterすればデフォルトで設定される。
      ：
     (略)
      ：
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
3                              # (＊1) 
      ：
     (略)
      ：
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
2                              # (＊2) 
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
      ：
     (略)
      ：
What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-linux]
AmazonCloudWatch-test          # 任意の名称 "AmazonCloudWatch-"は必須
      ：
     (略)
      ：
Which AWS credential should be used to send json config to parameter store?
1. ASIAWJKNSWDSLZLRBOCS(From SDK)
2. Other
default choice: [1]:
2
Please provide credentials to upload the json config file to parameter store.
AWS Access Key:
***************
AWS Secret Key:
**************************
Successfully put config to parameter store AmazonCloudWatch-test.
Program exits now.
```

※ コメント

(＊1)どのレベルでどの情報を取得できるかは以下参照。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html
(＊2)今回はメトリクスのみ見たいのでログの送信は設定しない。ここで1とすると、この後どのファイルを監視対象にするかなどが問われる(たしかそうだったはず。。)

___

動いてるかの確認。
この段階だとまだ動いていない。

```
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
  "status": "stopped",
  "starttime": "",
  "version": "1.237768.0"
}
```

# 4. CloudWatchへメトリクスを飛ばす。

以下で動かせるらしいのでやってみる。

```
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c ssm:AmazonCloudWatch-test -s

/opt/aws/amazon-cloudwatch-agent/bin/config-downloader --output-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --download-source ssm:AmazonCloudWatch-test --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
Region: ap-northeast-1
credsConfig: map[]
Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/ssm_AmazonCloudWatch-test.tmp
Start configuration validation...
/opt/aws/amazon-cloudwatch-agent/bin/config-translator --input /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json --input-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --output /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml --mode ec2 --config /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml --multi-config default
2020/04/24 13:12:57 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/ssm_AmazonCloudWatch-test.tmp ...
Valid Json input schema.
I! Detecting runasuser...
No csm configuration found.
No log 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 failed
======== Error Log ========
2020/04/24 13:12:57 I! AmazonCloudWatchAgent Version 1.237768.0.
2020/04/24 13:12:57 E! Error parsing /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml, open /usr/share/collectd/types.db: no such file or directory
```

。。。何言ってるか全然わからないけどなんかがエラーした。

> Configuration validation second phase failed

対応は以下のページに書いてあった。その通りやってみる。

* https://hacknote.jp/archives/46459/
* https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-enable-epel/

```
$ sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ yum provides /usr/share/collectd/types.db
$ sudo yum install collectd
      ：
     (略)
      ：
Downloading packages:
警告: /var/cache/yum/x86_64/2/epel/packages/collectd-5.8.1-1.el7.x86_64.rpm: ヘッダー V3 RSA/SHA256 Signature、鍵 ID 352c64e5: NOKEY
collectd-5.8.1-1.el7.x86_64.rpm の公開鍵がインストールされていません
collectd-5.8.1-1.el7.x86_64.rpm                            | 716 kB   00:00     
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 から鍵を取得中です。
Importing GPG key 0x352C64E5:
 Userid     : "Fedora EPEL (7) <epel@fedoraproject.org>"
 Fingerprint: 91e9 7d7c 5a1a 96f1 9da5 888f 6a2f aeb2 2cbb ae22
 Package    : epel-release-7-12.noarch (installed)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
上記の処理を行います。よろしいでしょうか？ [y/N]y
```

3つ目のコマンドでなんか警告されて問われるがyes。
もう一度起動のコマンド。

```
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c ssm:AmazonCloudWatch-test -s
```

成功！
ステータス確認

```
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
  "status": "running",
  "starttime": "2020-04-24T13:43:03+0000",
  "version": "1.237768.0"
}
```

ステータスは以下でも見れるらしい

```
$ systemctl status amazon-cloudwatch-agent.service
● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
   Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2020-04-24 13:43:04 UTC; 11s ago
```


# 5. CloudWatchAlarmで確認する。

このページをみてようやく理解できた。
https://www.geekfeed.co.jp/geekblog/aws-cloudwatch

CloudWatchのナビゲーションペインにある`メトリクス`の項目ではここで取得するメモリとかディスクは表示されないらしい！（EC2メトリクスの中に表示されるものだと思っていたがそうではないようだ。）

ナビゲーションペインの`Alarm`から「アラームを作成」としてメトリクスを選択する画面に移行するとカスタムメトリクスの項目が見れるようになる。この中でCWAgent内からメモリやディスクの使用率を監視することができるようになる。

ようやく`mem_used_percent`やら`swap_used_percent`やら`disk_used_percent`が見れるようになった。

インスタンスを再起動しても自動で起動するようにするには以下のコマンド。

```
$ systemctl is-enabled amazon-cloudwatch-agent.service
enabled
```

# まとめ

* Agentを入れただけだとstoppedなので起こしてあげる必要がある。
* ~~CloudWatchのナビゲーションペインにある`メトリクス`からは見れない。`アラーム`のほうから確認。~~

追記
しばらく待っていると`メトリクス`の方でも閲覧できてたので単にrunningにする操作が重要だった。

# (追) アタッチしたEBSのディスク使用率もみれた。

コンソールからEBSアタッチ。この状態だと使用されないので適当なディレクトリにマウント。

```
$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk 
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0  20G  0 disk 

$ sudo mkfs -t xfs /dev/xvdf
$ sudo mount /dev/xvdf ./test
$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk 
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0  20G  0 disk /home/ec2-user/test
$ df -h
/dev/xvdf         20G   53M   20G    1% /home/ec2-user/test
```

これがCloudWatchから見れば成功。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/9d1c7eab-2567-fed6-1742-40392cbcb467.png)

# 参考

* https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/download-cloudwatch-agent-commandline.html
* https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html
* https://www.geekfeed.co.jp/geekblog/aws-cloudwatch
* https://hacknote.jp/archives/46459/
* https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-enable-epel/
* https://dev.classmethod.jp/articles/monitor-ec2-memory-cw-agent/