CloudWatchAgentによるカスタムメトリクス収集をSSMのパラメーターストアで設定する

# 初めに
CloudWatchでディスク使用率とメモリ使用率を収集しアラーム設定する要件がありました。
標準では収集できずカスタムメトリクスとして収集される項目になります。
カスタムメトリクスはCloudWatchAgentをEC2にインストールすることで収集されます。

# 本手順で出来る事
・EC2のディスク空き容量率、メモリ使用率(コミット済み)がカスタムメトリクスとしてCloudWatchで収集できる。

# 本手順で触れない事
・EC2やVPC、サブネットなどのリソース作成
・CloudWatchアラーム、SNSトピックの作成
・EC2をSystemsManagerのマネージドノードにするための設定

# 環境
対象EC2のサブネット：Private
OS：WindowsServer 2インスタンス(EC2-a、EC2-c)
パラメーターストア名：AmazonCloudWatch-windows

# 収集するカスタムメトリクス
LogicalDisk⇒"% Free Space"(ディスク空き容量率)
Memory⇒"% Committed Bytes In Use"(メモリ使用率(コミット済))

# 前提、備考など
・EC2のディスク使用率、メモリ使用率、コアごとのCPU使用率を収集するためにはEC2へCloudWatch Agentをインストールする必要がある。		

・CloudWatch AgentのインストールはCLIかSystemsManager(SSM)のRunCommandにより可能。ここではRunCommandによる手法を記載する。			

・RunCommandを使用するためにEC2をマネージドノードにする必要がある。マネージドノードにする手順は以下を参照。
※PrivateSubnetのインスタンスをマネージドノードにする場合、NAT GWかVPCエンドポイントの設定を行いEC2からSSMサービスにアクセス出来るようにする必要がある。	

https://dev.classmethod.jp/articles/ec2-access-with-session-manager/	
	

・CloudWatch Agentの設定ファイルの保存先は2種類ある。			
　①インスタンスのローカルディスク上⇒インスタンスごとに設定ファイルを配置しエージェントの起動時に設定ファイルのパスを指定する必要がある。			
　②SSMのパラメーターストア⇒エージェントの起動時にパラメータストアのARNを指定するか、RunCommandでパラメーターストアを指定し起動することができる。			
　　RunCommandでインスタンス上の所定ディレクトリに設定ファイルが自動作成されるため、設定ファイルの手動配置は不要。			
		[設定ファイルが作成されるディレクトリ]	
			Windows：C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs
			Linux：/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d

・カスタムメトリクスで取集できるのは、Windowsの場合パフォーマンスモニタで確認できる項目が主となる。		

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/application-insights-performance-counter.html			

# 手順概要
1.CloudWatch Agentによるメトリクス収集を許可するため、必要なIAMポリシーを付与したIAMロールをEC2へ割り当て	
2.RunCommandによるCloudWatch Agentのインストール	
3.CloudWatch Agentの設定ウィザードを起動し、パラメーターストアへのパラメータ登録	
4.RunCommandによるCloudWatch Agentの起動	
5.CloudWatchでカスタムメトリクスの確認	

# 1.CloudWatch Agentによるメトリクス収集を許可するため、必要なIAMポリシーを付与したIAMロールをEC2へ割り当て		
[CloudWatchAgentServerPolicy]ポリシー・・・CloudWatchへのメトリクス送信が許可される
[CloudWatchAgentAdminPolicy]ポリシー・・・EC2からパラメータストアへの書き込みが許可される

# 2.RunCommandによるCloudWatch Agentのインストール					
SystemsManager⇒RunCommand⇒[Run Command]ボタンをクリック

コマンドドキュメント：AWS-ConfigureAWSPackage					
ドキュメントのバージョン：デフォルト					
Action：Install					
Installation Type：Uninstall and reinstall					
Name：AmazonCloudWatchAgent					
ersion：空白				
Additional Arguments：空白					
ターゲット：エージェントをインストールしたいEC2を任意の方法で指定					
その他項目：デフォルト					
			
※実行結果が失敗の場合、NAT GWもしくはVPCエンドポイントが適切に設定されているか確認					

# 3.CloudWatch Agentの設定ウィザードを起動し、パラメーターストアへのパラメータ登録			
EC2へ接続し以下のCloudWatch Agent設定ウィザードを実行
~~~
　C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-config-wizard.exe
~~~
※今回の手順ではパラメータストアへの設定登録のためにウィザードを使用する為、すべてのEC2で実行する必要はなく1台のEC2で実行する。		

~~~
================================================================									
= 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: [2]:2									
~~~

OS選択

~~~
Trying to fetch the default region based on ec2 metadata...	
Are you using EC2 or On-Premises hosts?	
1. EC2	
2. On-Premises	
default choice: [1]:1	
~~~

EC2かオンプレか

~~~
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:2
~~~

StatsDを有効にするかどうか。有効にするとアプリケーションからメトリクスが収集できる。
StatsDはOSSのレポーティングツール

https://tsurezurejapan.hatenablog.com/entry/2022/05/13/221703

~~~
Do you have any existing CloudWatch Log Agent configuration file to import for migration?
1. yes
2. no
default choice: [2]:2
~~~

CloudWatch Agentの設定ファイル(JSON)をインポートするかどうか。
今回はパラメータストアを利用する為JSONはインポートしない。

~~~
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:1
~~~

CPUやメモリなどのメトリクスを監視するかどうか。

~~~
Do you want to monitor cpu metrics per core?
1. yes
2. no
default choice: [1]:2
~~~

CPUコアごとの使用率を収集するかどうか。

~~~
Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:1
~~~

メトリクスのディメンションとしてImageID、InstanceId、InstanceType、AutoScalingGroupNameを追加するかどうか。

~~~
Do you want to aggregate ec2 dimensions (InstanceId)?
1. yes
2. no
default choice: [1]:1
~~~

メトリクスをInstanceIDで集約するかどうか。

~~~
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. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:4
~~~

メトリクスの収集間隔について。

~~~
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:1
~~~

メトリクスの収集レベルについて。

~~~
Current config as follows:							
{							
        "metrics": {							
                "aggregation_dimensions": [							
                        [							
                                "InstanceId"							
                        ]							
                ],							
                "append_dimensions": {							
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",							
                        "ImageId": "${aws:ImageId}",							
                        "InstanceId": "${aws:InstanceId}",							
                        "InstanceType": "${aws:InstanceType}"							
                },							
                "metrics_collected": {							
                        "LogicalDisk": {							
                                "measurement": [							
                                        "% Free Space"							
                                ],							
                                "metrics_collection_interval": 60,							
                                "resources": [							
                                        "*"							
                                ]							
                        },							
                        "Memory": {							
                                "measurement": [							
                                        "% Committed Bytes In Use"							
                                ],							
                                "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							
~~~

設定内容の確認。JSON形式で表示される。

~~~
Do you want to monitor any customized log files?
1. yes
2. no
default choice: [1]:2
~~~

個別のログファイルを追加でメトリクスとして監視するかどうか。今回は不要。

~~~
Do you want to monitor any Windows event log?
1. yes
2. no
default choice: [1]:2
~~~

WindowsEventLogを監視するかどうか。今回は不要。

~~~
Saved config file to config.json successfully.													
Current config as follows:													
{													
        "metrics": {													
                "aggregation_dimensions": [													
                        [													
                                "InstanceId"													
                        ]													
                ],													
                "append_dimensions": {													
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",													
                        "ImageId": "${aws:ImageId}",													
                        "InstanceId": "${aws:InstanceId}",													
                        "InstanceType": "${aws:InstanceType}"													
                },													
                "metrics_collected": {													
                        "LogicalDisk": {													
                                "measurement": [													
                                        "% Free Space"													
                                ],													
                                "metrics_collection_interval": 60,													
                                "resources": [													
                                        "*"													
                                ]													
                        },													
                        "Memory": {													
                                "measurement": [													
                                        "% Committed Bytes In Use"													
                                ],													
                                "metrics_collection_interval": 60													
                        }													
                }													
        }													
}													
Please check the above content of the config.													
The config file is also located at config.json.													
Edit it manually if needed.													
Do you want to store the config in the SSM parameter store?													
1. yes													
2. no													
default choice: [1]:1													
~~~

SSMパラメーターストアに設定内容を保存するかどうか。

~~~
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-Windows]AmazonCloudWatch-Windows

Trying to fetch the default region based on ec2 metadata...
Which region do you want to store the config in the parameter store?
default choice: [ap-northeast-1]ap-northeast-1

Which AWS credential should be used to send json config to parameter store?
1. xxxxxxxxxxxxxxxx(From SDK)
2. Other
default choice: [1]:1
~~~

パラメータストアに保存する際のクレデンシャルを指定。基本的にはデフォルトでOK。

~~~
Please press Enter to exit...
~~~

完了

# 3.RunCommandによるCloudWatch Agentの起動															
SystemsManager⇒RunCommand⇒[Run Command]ボタンをクリック
コマンドドキュメント：AmazonCloudWatch-ManageAgent

ドキュメントのバージョン：デフォルト															
Action：Configure															
Mode：EC2															
Optional Configuration Source：ssm															
Optional Configuration Location：AmazonCloudWatch-Windows（エージェント設定で作成したパラメータストア名）															
Optional Open Telemetry Collector Configuration Source：ssm												
Optional Restart：yes															
ターゲット：エージェントを起動したいEC2を任意の方法で指定
その他項目：デフォルト
⇒実行をクリック

※実行結果が失敗の場合、パラメータストアの記述に誤りがないか確認
※Actionについて
　Configure：CloudWatchAgentの設定ファイルを、指定したパラメータストアの内容で上書きし設定ファイルを元に起動用のtomlファイルを作成
　Configure(append)：既存のCloudWatchAgentの設定ファイルに、指定したパラメータストアの内容を追記(重複確認やマージ機能はない)し、設定ファイルを元に起動用のtomlを再作成
　Configure(remove)：既存のCloudWatchAgentの設定ファイルを削除し、デフォルトの設定ファイルを作成する。デフォルトの設定ファイルを元に起動用のtomlファイルを再作成
　Start：Configureで作成された起動用のtomlでCloudWatchAgentを実行
　Status：CloudWatchAgentのステータスを表示
　Stop：CloudWatchAgentを停止

# 4.CloudWatchでカスタムメトリクスの確認
CloudWatch⇒すべてのメトリクス⇒CWAgent
カスタムメトリクスの収集が開始されていることを確認

# 参考
https://smillione.co.jp/it_blog/2907/

https://qiita.com/WisteriaWave/items/8e2510264839923c5bbc

https://tech.enechange.co.jp/entry/2022/10/04/101051

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html

https://www.d-make.co.jp/blog/2021/03/29/cloudwatch%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A7%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E4%BD%BF%E7%94%A8%E7%8E%87%E3%81%AE%E5%8F%AF%E8%A6%96%E5%8C%96%E3%81%AE%E7%B0%A1%E5%8D%98/

https://dev.classmethod.jp/articles/cloudwatch-agent-rollup-metrics-with-aggregation_dimensions/

https://harusite.net/057/

https://blog.serverworks.co.jp/autoscaling-policy-custom-metric

https://ngyuki.hatenablog.com/entry/2019/01/30/173822

https://cloud5.jp/cloudwatch-agent/

https://ops.jig-saw.com/tech-cate/amazon-cloudwatch-setup

https://blog.serverworks.co.jp/2021/11/05/134906

https://tech.enechange.co.jp/entry/2022/10/04/101051

https://www.site24x7.jp/blog/cloudwatch-resource-monitoring/

https://it.hirokun.net/entry/aws-cloudwatch-diskused

https://dev.classmethod.jp/articles/amazoncloudwatch-manageagent-ssm-run-command/

https://pg.mnztech.work/dokuwiki/Aws/SystemsManager/RunCommand-AmazonCloudWatch-ManageAgent