【CloudWatch】ディスクとメモリの使用率をカスタムメトリクスで

#1.はじめに
カスタムメトリクスの知識が深まったので備忘録です。
CloudWatchエージェントでAmazonLinux2インスタンスのディスク＆メモリ使用率を収集してCloudWatchに転送します。

アラートの設定手順は割愛。また、インスタンスはApacheのWebサーバを想定しています。

#2.公式ドキュメント
今回やったことが全て書かれてますw
AWSのドキュメントはわかりやすいので好き。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html

#3.ざっくり作業フロー

```
CloudWatchエージェントのインストール
　└ 設定ファイルを書いて読み込み
　　└ エージェントの状態確認
```

#4.作業開始
##4-1.awscliの実行環境を用意
もしかしたら不要かも？
AmazonLinux2はAWS CLIがデフォで入ってるので、いきなりconfigureします。

```
$ aws configure
AWS Access Key ID [None]:空欄のままEnterを押す
AWS Secret Access Key [None]:空欄のままEnterを押す
Default region name [None]: ap-northeast-1 #ご自身の環境に応じて書き換え
Default output format [None]: json
```

##4-2.CloudWatchエージェントのインストール
適当な場所でyumします。インストール手順も公式に書いてあったはず。

```
$ sudo yum install amazon-cloudwatch-agent
```

##4-3.CloudWatchエージェントの設定ファイル

インストールが完了するとopt配下にawsディレクトリが出来上がるので、
その中のetcにエージェントの設定ファイル`amazon-cloudwatch-agent.json`をviで新規作成します。

```
$ pwd
/opt/aws/amazon-cloudwatch-agent/etc

$ sudo vi amazon-cloudwatch-agent.json
```

書きっぷりは公式を参考にしました。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html

これをそのままコピペしてもちゃんと動作しますが、不要なメトリクスがドバッと転送されます。
そして一度転送されたメトリクスは数ヶ月保持されます。私もやりましたw
とりあえず安心安定で動作確認したい！などあれば公式を推奨です。

私は超最小限のメトリクスが望ましかったので削除しまくっています。
ログのディレクトリとか命名は適当！変数をもっと使うとスマートになりそうですね。

```
$ cat amazon-cloudwatch-agent.json
{
    "agent": {
      "metrics_collection_interval": 10,
      "logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log"
    },
    "metrics": {
      "namespace": "インスタンス名",
      "metrics_collected": {
        "disk": {
          "measurement": [
            "used_percent"
          ],
          "metrics_collection_interval": 60
        },
        "mem": {
          "measurement": [
            "mem_used_percent"
          ],
          "metrics_collection_interval": 1
        }
      },
      "append_dimensions": {
        "InstanceId": "${aws:InstanceId}"
      },
      "aggregation_dimensions" : [["InstanceId"]],
      "force_flush_interval" : 30
    },
    "logs": {
      "logs_collected": {
        "files": {
          "collect_list": [
            {
              "file_path": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
              "log_group_name": "/aws/cloudwatch/amazon-cloudwatch-agent-log",
              "log_stream_name": "インスタンス名/amazon-cloudwatch-agent.log",
              "timezone": "Local"
            }
          ]
        }
      },
      "log_stream_name": "インスタンス名_log_stream",
      "force_flush_interval" : 15
    }
  }
```


##4-4.設定ファイルの読み込み
以下のコマンドを実行してviしたjsonを再読み込みしてあげます。
このコマンドは公式に載っていたものをそのまま使っています。

```
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
```

あとはsystemctlでエージェントの状態を確認して、Activeであれば転送されているはず！
Activeでなければリロードしてあげたりしてください。
もしそれでもエージェントのステータスがエラーであれば設定ファイルが間違っていると思います。

```
sudo systemctl status amazon-cloudwatch-agent
```

#5.補足事項その1
公式にも書かれていますが、インスタンスが配置されているVPCからCloudWatchへのデータ転送を許可してあげるIAMポリシーが必要です。
FullAccessだと大丈夫だと思いますが、業務アカウントとかだと制限されているかもですので`CloudWatchAgentServerPolicy`がご自身のIAMロールにアタッチされているか確認してみてください。

#6.補足事項その2
公式を探したのですが、プロセスの死活監視はCloudWatchエージェントでは実現できないように読めました。
※もし手順が存在するのでしたらごめんなさい！

その時はこちらの記事をご参考頂ければと思います。
プロセスの死活をcronでチェックして、それを値に変換してCloudWatchに転送。
それをアラートの閾値にすることでプロセス監視を実現する手順です。
めっちゃ勉強になりました。
https://michimani.net/post/aws-monitoring-apache-status-with-cloudwatch/

以上です！
読んで頂いた方のお役に立てますと幸いです。