EC2(Amazon Linux)のCloudWatch Agent メトリクス/ログ管理設定

## はじめに
EC2(Amazon Linux)のCloudWatch Agent の設定ですが、毎回諸先輩方が書いたブログを読み漁りながら設定をしていることを告白いたします。
設定ウィザードが英語質問のため内容を理解する気にならないのが原因なので、設定内容と正しく向き合い今後検索する時間を短縮していくためにも、ブログに設定方法をとりまとめていきたいと思います。

<br>

## 構成図
![](https://cloud5.jp/wp-content/uploads/2023/06/スクリーンショット-2023-06-17-13.29.05-640x305.png)

<br>


## 構築
### 1.前提条件
#### 1.1.検証IAM:Amazon Linux 2 での検証
Amazon Linux 2 の2023/06/17時点における、最新バージョンを利用

<br>

#### 1.2.EC2(Amazon Linux)のIAMロールの設定
EC2に **cloudwatch:PutMetricData**ポリシー を含んだロールを利用する。

今回の構築では、上記権限を含んでいるAWS管理ポリシー（**CloudWatchAgentAdminPolicy）**をアタッチしたロールをEC2に設定する。

<br>


#### 1.3.EC2(Amazon Linux)に amazon-ssm-agent がインストールされている
##### 1.3.1.確認方法
下記コマンドを実施して、**amazon-ssm-agent**がインストールされているかを確認する、実行結果に**amazon-ssm-agent**がない場合インストールする。
```shell
sudo yum list installed | grep cloudwatch
```

<br>

##### 1.3.2. インストール方法
インストールは2種類あり、SSM（Systems Manager）からRunCommandを利用する方法と Linux より yum を利用したインストール方法があり、このブログでは**Linuxより yum を利用したインストール**を紹介する。
```shell
sudo yum install amazon-cloudwatch-agent
```

<br>
<br>

### 2.設定ファイル（JSON)を作成
#### 2.1. ウィザードを利用して設定ファイルを作成
※選択項目に日本語訳記載
```shell
sudo cd /opt/aws/amazon-cloudwatch-agent/etc
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?
#エージェントを利用するOSは何ですか？
1. linux
2. windows
3. darwin
default choice: [1]:
1
#AmazonLinuxのため[1]


Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
#EC2またはオンプレミスのホストを使用していますか？
1. EC2
2. On-Premises
default choice: [1]:
1
#EC2のため[1]


Which user are you planning to run the agent?
#エージェントを実行するユーザーは誰ですか？
1. root
2. cwagent
3. others
default choice: [1]:
1
#rootユーザのため[1]


Do you want to turn on StatsD daemon?
#StatsDデーモンをオンにしますか？
1. yes
2. no
default choice: [1]:
2
#使用しないため[2]
#StatsDを利用するとアプリケーションやサービスから任意の値を収集できるようになる


Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
#CollectDからのメトリクスを監視しますか？
#警告：CollectDがインストールされていない場合、エージェントの起動に失敗します
1. yes
2. no
default choice: [1]:
2
#使用しないため[2]
#サーバ統計のオープンソース「CollectD」を利用して、定期的にサーバの統計情報を収集することができる


Do you want to monitor any host metrics? e.g. CPU, memory, etc.
#ホストのメトリクス（例：CPU、メモリなど）を監視しますか？
1. yes
2. no
default choice: [1]:
1
#監視するため[1]


Do you want to monitor cpu metrics per core?
#CPUメトリクスをコアごとに監視しますか？
1. yes
2. no
default choice: [1]:
2
#CPU全体の使用率がわかれば良いので[2]


Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
#利用可能な場合、すべてのメトリクスにEC2の次元（ImageId、InstanceId、InstanceType、AutoScalingGroupName）を追加しますか？
1. yes
2. no
default choice: [1]:
1
#取得したいので[1]


Do you want to aggregate ec2 dimensions (InstanceId)?
#EC2の InstanceId を集約しますか？
1. yes
2. no
default choice: [1]:
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分未満の解像度）で収集しますか？
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
4
#収集不要のため[4]


Which default metrics config do you want?
#どのデフォルトのメトリクス設定を使用しますか？
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
2
#今回はスタンダードで設定[2]
#各メトリクスセットについては下記URLを参照
#https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html

#現在の設定は下記の通りです
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": {
			"cpu": {
				"measurement": [
					"cpu_usage_idle",
					"cpu_usage_iowait",
					"cpu_usage_user",
					"cpu_usage_system"
				],
				"metrics_collection_interval": 60,
				"totalcpu": false
			},
			"disk": {
				"measurement": [
					"used_percent",
					"inodes_free"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				]
			},
			"diskio": {
				"measurement": [
					"io_time"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				]
			},
			"mem": {
				"measurement": [
					"mem_used_percent"
				],
				"metrics_collection_interval": 60
			},
			"swap": {
				"measurement": [
					"swap_used_percent"
				],
				"metrics_collection_interval": 60
			}
		}
	}
}

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
#あとから修正可能のため「1」


Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
#既存のCloudWatchログエージェント（http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html）の設定ファイルを移行用にインポートしますか？
1. yes
2. no
default choice: [2]:
2
#初期設定でインポートする設定ファイルがないため[2]


Do you want to monitor any log files?
#ログファイルを監視しますか？
1. yes
2. no
default choice: [1]:
1
#監視するため[1]


Log file path:
#ログファイルのパス：
/var/log/messages
# /var/log/messages配下を収集


Log group name:
default choice: [messages]
#ロググループ名：
#デフォルトの選択： [messages]
messages
#デフォルトに従い[messages]


Log stream name:
default choice: [{instance_id}]
#ログストリーム名：
#デフォルトの選択： [{instance_id}]
{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. 1827
18. 2192
19. 2557
20. 2922
21. 3288
22. 3653
default choice: [1]:
1
#デフォルトの無期限[1]


Do you want to specify any additional log files to monitor?
#監視する追加のログファイルを指定しますか？
1. yes
2. no
default choice: [1]:
2
#他に監視したいものが無いため[2]


#設定ファイルが/opt/aws/amazon-cloudwatch-agent/bin/config.jsonに正常に保存されました。
#現在の設定は次のとおりです：
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_name": "messages",
						"log_stream_name": "{instance_id}",
						"retention_in_days": 3
					}
				]
			}
		}
	},
	"metrics": {
		"aggregation_dimensions": [
			[
				"InstanceId"
			]
		],
		"append_dimensions": {
			"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
			"ImageId": "${aws:ImageId}",
			"InstanceId": "${aws:InstanceId}",
			"InstanceType": "${aws:InstanceType}"
		},
		"metrics_collected": {
			"cpu": {
				"measurement": [
					"cpu_usage_idle",
					"cpu_usage_iowait",
					"cpu_usage_user",
					"cpu_usage_system"
				],
				"metrics_collection_interval": 60,
				"totalcpu": false
			},
			"disk": {
				"measurement": [
					"used_percent",
					"inodes_free"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				]
			},
			"diskio": {
				"measurement": [
					"io_time"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				]
			},
			"mem": {
				"measurement": [
					"mem_used_percent"
				],
				"metrics_collection_interval": 60
			},
			"swap": {
				"measurement": [
					"swap_used_percent"
				],
				"metrics_collection_interval": 60
			}
		}
	}
}
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.
#設定の内容を上記で確認してください。
#設定ファイルはまた、/opt/aws/amazon-cloudwatch-agent/bin/config.jsonにも配置されています。
#必要に応じて手動で編集してください。


Do you want to store the config in the SSM parameter store?
#設定をSSMパラメータストアに保存しますか？
1. yes
2. no
default choice: [1]:
2
#SSMを利用しないため[2]
#生成した設定(config.json)の内容をSSMパラメータストアに保存することで、次回からの設定で再利用可能

Program exits now.
#プログラムは現在終了します。
```

<br>

### 3.エージェントの起動
設定ファイルを配置後、エージェントのサービスを起動します
```shell
cd /opt/aws/amazon-cloudwatch-agent/etc
sudo cp ../bin/config.json ./amazon-cloudwatch-agent.json
#新たに作成された設定ファイルconfig.jsonをCloudWatchエージェントが読み込む設定ファイルamazon-cloudwatch-agent.jsonにコピーしている
sudo systemctl restart amazon-cloudwatch-agent
sudo systemctl status amazon-cloudwatch-agent
```

<br>


## 挙動の確認
### 1.CloudWatchでメトリクスを確認できる
CloudWatch > 左ペイン：メトリクス「すべてのメトリクス」 > カスタム名前空間を押下
画面遷移した先の項目をクリックして、CloudWatchAgentを導入したEC2の情報が出力される。

<br>

### 2.CloudWatchLogsで ログを確認できる
CloudWatch > 左ペイン：ログ「ロググループ」 > messages を押下
EC2 の /var/log/messages 配下のログが出力される。 

<br>

## さいごに
日本語訳して各設定項目を洗い出したことで、項目の設定詳細にも理解が捗りました。
これで脳死暗記ぽちぽち設定からは卒業できそうです。