📌

【初心者向け】CloudWatchエージェントによるEC2のカスタムメトリクスとsyslogの収集

2024/08/29に公開

はじめに

本ページは個人の勉強で使用することを目的に作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報についてはAWS公式ドキュメントをご参照ください。

やること

  • 作成済みのEC2インスタンスにCloudWatchエージェントをインストールし、カスタムメトリクスとsysrog(/var/log/messagesのログ)を取得する。
  • 設定ファイルはパラメータストアに保存する。

前提条件

  • VPC、サブネット、EC2インスタンスといったリソースはすでに構築済みとする。
  • 使用するEC2インスタンスはAmazon Linux 2023とする。

1. VPCエンドポイント用のセキュリティグループの作成

  1. VPCエンドポイント用のセキュリティグループを作成します。
  • セキュリティグループ名:mori-sg-endpoint
  • 説明:SG for Endpoint
  • VPC:mori-vpc
  • インバウンドルール
    • タイプ:HTTPS
    • プロトコル:TCP
    • ポート範囲:443
    • ソース:mori-sg-web ※EC2インスタンスのセキュリティグループ
  • アウトバウンドルール:未設定
  • タグ
    • キー:Name
    • オプション:mori-sg-endpoint

2. VPCエンドポイントの作成

  1. com.amazonaws.ap-northeast-1.monitoring用のエンドポイントを作成します。
  • エンドポイント名:mori-vpce-monitoring
  • サービスカテゴリ:AWSのサービス
  • サービス名:com.amazonaws.ap-northeast-1.monitoring
  • VPC:mori-vpc
  • 追加設定
    • DNS名を有効化:選択
    • DNSレコードのIPタイプ:IPv4
  • サブネット
    • アベイラビリティゾーン:ap-northeast-1a (apne1-az4)
    • サブネットID:mori-subnet-public-ap-northeast-1a
  • セキュリティグループ:mori-sg-endpoint
  • ポリシー:フルアクセス


  1. com.amazonaws.ap-northeast-1.ec2用のエンドポイントを作成します。
  • エンドポイント名:mori-vpce-ec2
  • サービスカテゴリ:AWSのサービス
  • サービス名:com.amazonaws.ap-northeast-1.ec2
  • VPC:mori-vpc
  • 追加設定
    • DNS名を有効化:選択
    • DNSレコードのIPタイプ:IPv4
  • サブネット
    • アベイラビリティゾーン:ap-northeast-1a (apne1-az4)
    • サブネットID:mori-subnet-public-ap-northeast-1a
  • セキュリティグループ:mori-sg-endpoint
  • ポリシー:フルアクセス


  1. com.amazonaws.ap-northeast-1.logs用のエンドポイントを作成します。
  • エンドポイント名:mori-vpce-logs
  • サービスカテゴリ:AWSのサービス
  • サービス名:com.amazonaws.ap-northeast-1.logs
  • VPC:mori-vpc
  • 追加設定
    • DNS名を有効化:選択
    • DNSレコードのIPタイプ:IPv4
  • サブネット
    • アベイラビリティゾーン:ap-northeast-1a (apne1-az4)
    • サブネットID:mori-subnet-public-ap-northeast-1a
  • セキュリティグループ:mori-sg-endpoint
  • ポリシー:フルアクセス

3. IAMロールの作成とEC2インスタンスへのアタッチ

  1. EC2用のIAMロールを作成します。
  • 信頼されたエンティティタイプ:AWSのサービス
  • ユースケース:EC2
  • 許可ポリシー:CloudWatchAgentServerPolicy ※AWSマネージドポリシー
  • ロール名:mori-role-ec2-cloudwatch-agent
  1. EC2コンソールからEC2インスタンスmori-ec2の設定画面に移動し、インスタンスを停止します。
  2. アクション - セキュリティ - IAMロールを変更 の順にクリックします。


  1. IAMロールを変更画面でIAMロールを選択し、IAMロールの更新をクリックします。
  • IAMロール:mori-role-ec2-cloudwatch-agent

4. CloudWatchエージェントのインストール

  1. EC2インスタンスに接続します。
  2. CloudWatchエージェントをダウンロードします。
$ wget https://amazoncloudwatch-agent-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
  1. RPMパッケージをインストールします。
$ sudo rpm -U ./amazon-cloudwatch-agent.rpm
  1. CloudWatchエージェントの起動設定を有効化します。
$ sudo systemctl enable amazon-cloudwatch-agent.service
  1. CloudWatchエージェントを再起動します。
restart amazon-cloudwatch-agent.service

5. rsyslogのインストール

  1. rsyslogをインストールします。※Amazon Linux2023ではデフォルトでインストールされていません。
$ sudo dnf install -y rsyslog
  1. rsyslogの自動起動設定を有効化します。
$ sudo systemctl enable rsyslog
  1. rsyslogを再起動します。
$ sudo systemctl start rsyslog
  1. /var/log/messagesのパーミッションを644に変更します。 ※デフォルトの600だとCloudWatchエージェントが読み取りに失敗します。
$ sudo chmod 644 /var/log/messages

6. collectdのインストール

  1. collectdをインストールします。 ※カスタムメトリクスを収集する際に必要です。こちらもデフォルトではインストールされていません
$ sudo dnf install -y collectd
  1. collectdの自動起動設定を有効化します。
sudo systemctl enable collectd
  1. collectdを再起動します。
sudo systemctl restart collectd

7. アクセスキー/シークレットアクセスキーを取得する。

1 SSMのアクセス権限を持つユーザーでアクセスキー/シークレットアクセスキーを作成します ※SSMに設定ファイルを保存する際に必要となります。

8. CloudWatchエージェント設定ファイルを作成する

  1. CloudWatchエージェント設定ファイルの作成ウィザードを起動します。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
  1. ウィザードに従い設定ファイルを作成します。
    ウィザード
================================================================
= 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]:
1
Trying to fetch the default region based on ec2 metadata...
I! imds retry client will retry 1 timesAre you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
1
Which user are you planning to run the agent?
1. cwagent
2. root
3. others
default choice: [1]:
1
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
1
Which port do you want StatsD daemon to listen to?
default choice: [8125]
8125
What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:
1
What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:
4
Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
1. yes
2. no
default choice: [1]:
1
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1
Do you want to monitor cpu metrics per core?
1. yes
2. no
default choice: [1]:
1
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
Do you want to aggregate ec2 dimensions (InstanceId)?
1. yes
2. no
default choice: [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. 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]:
2
Current config as follows:
{
	"agent": {
		"metrics_collection_interval": 60,
		"run_as_user": "cwagent"
	},
	"metrics": {
		"aggregation_dimensions": [
			[
				"InstanceId"
			]
		],
		"append_dimensions": {
			"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
			"ImageId": "${aws:ImageId}",
			"InstanceId": "${aws:InstanceId}",
			"InstanceType": "${aws:InstanceType}"
		},
		"metrics_collected": {
			"collectd": {
				"metrics_aggregation_interval": 60
			},
			"cpu": {
				"measurement": [
					"cpu_usage_idle",
					"cpu_usage_iowait",
					"cpu_usage_user",
					"cpu_usage_system"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				],
				"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
			},
			"statsd": {
				"metrics_aggregation_interval": 60,
				"metrics_collection_interval": 10,
				"service_address": ":8125"
			},
			"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
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
2
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
1
Log file path:
/var/log/messages
Log group name:
default choice: [messages]
messages
Log group class:
1. STANDARD
2. INFREQUENT_ACCESS
default choice: [1]:
1
Log stream name:
default choice: [{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. 1096
18. 1827
19. 2192
20. 2557
21. 2922
22. 3288
23. 3653
default choice: [1]:
1
Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:
2
Do you want the CloudWatch agent to also retrieve X-ray traces?
1. yes
2. no
default choice: [1]:
2
Existing config JSON identified and copied to:  /opt/aws/amazon-cloudwatch-agent/etc/backup-configs
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": "cwagent"
	},
	"logs": {
		"logs_collected": {
			"files": {
				"collect_list": [
					{
						"file_path": "/var/log/messages",
						"log_group_class": "STANDARD",
						"log_group_name": "messages",
						"log_stream_name": "{instance_id}",
						"retention_in_days": -1
					}
				]
			}
		}
	},
	"metrics": {
		"aggregation_dimensions": [
			[
				"InstanceId"
			]
		],
		"append_dimensions": {
			"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
			"ImageId": "${aws:ImageId}",
			"InstanceId": "${aws:InstanceId}",
			"InstanceType": "${aws:InstanceType}"
		},
		"metrics_collected": {
			"collectd": {
				"metrics_aggregation_interval": 60
			},
			"cpu": {
				"measurement": [
					"cpu_usage_idle",
					"cpu_usage_iowait",
					"cpu_usage_user",
					"cpu_usage_system"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				],
				"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
			},
			"statsd": {
				"metrics_aggregation_interval": 60,
				"metrics_collection_interval": 10,
				"service_address": ":8125"
			},
			"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.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
1
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-linux
Trying to fetch the default region based on ec2 metadata...
I! imds retry client will retry 1 timesWhich 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. XXXXXXXXXX(From SDK)
2. Other
default choice: [1]:
2
Please provide credentials to upload the json config file to parameter store.
AWS Access Key:
xxxxxXXXXX
AWS Secret Key:
xxxxxXXXXX
Successfully put config to parameter store AmazonCloudWatch-linux.
Program exits now.

default choice以外の設定について

  • 事前定義されたメトリクスセット:standard
  • 追加で収集するログ
    • ファイル:/var/log/messages
    • ロググループクラス:STANDARD
    • ロググループ名:messages
    • ログストリーム名:{instance_id}
    • 保存する日数:失効しない

※参考:https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html#cloudwatch-agent-preset-metrics


  1. 設定ファイルconfig.jsonが作成されています。
$ ls -la /opt/aws/amazon-cloudwatch-agent/bin/

  1. パラメータストアに新しくパラメータAmazonCloudWatch-linuxが作成されています。
    AmazonCloudWatch-linuxの値
{
	"agent": {
		"metrics_collection_interval": 60,
		"run_as_user": "cwagent"
	},
	"logs": {
		"logs_collected": {
			"files": {
				"collect_list": [
					{
						"file_path": "/var/log/messages",
						"log_group_class": "STANDARD",
						"log_group_name": "messages",
						"log_stream_name": "{instance_id}",
						"retention_in_days": -1
					}
				]
			}
		}
	},
	"metrics": {
		"aggregation_dimensions": [
			[
				"InstanceId"
			]
		],
		"append_dimensions": {
			"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
			"ImageId": "${aws:ImageId}",
			"InstanceId": "${aws:InstanceId}",
			"InstanceType": "${aws:InstanceType}"
		},
		"metrics_collected": {
			"collectd": {
				"metrics_aggregation_interval": 60
			},
			"cpu": {
				"measurement": [
					"cpu_usage_idle",
					"cpu_usage_iowait",
					"cpu_usage_user",
					"cpu_usage_system"
				],
				"metrics_collection_interval": 60,
				"resources": [
					"*"
				],
				"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
			},
			"statsd": {
				"metrics_aggregation_interval": 60,
				"metrics_collection_interval": 10,
				"service_address": ":8125"
			},
			"swap": {
				"measurement": [
					"swap_used_percent"
				],
				"metrics_collection_interval": 60
			}
		}
	}
}

9. CloudWatchエージェントを起動する

  1. CLoudWatchエージェントに設定ファイルを読み込ませて起動します。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json

10. Cloudwatchの確認

  1. CloudWatchコンソールからすべてのメトリクスをクリックします。
  2. カスタム名前空間のCWAgentをクリックします。

  1. CloudWatchエージェントで収集したメトリクスが表示されます。

  • diskに関するログ

  1. ロググループ:messages - ログストリーム:{instance_id}/var/log/messagesが出力されています。

おわりに

  • 手順5.4の/var/log/messagesのパーミッションを誤ってしばらく詰まりました。CloudWatchエージェントのログは/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.logに出力されるので、こちらを確認して問題を解消しました。
$ sudo tail -n 100 /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log

"run_as_user"の値をrootにすると恐らく権限エラーは発生しませんが、プロジェクトによっては推奨されないかも知れません。


VPCエンドポイントについて


  • インスタンスごとにウィザードで設定ファイルを作成すのはコストが掛かります。予めパラメータストアに設定ファイルを用意してインスタンスに配布する方法については以下の記事にまとめました。

https://zenn.dev/smori/articles/94672ae5f8e882

参考

  • CloudWatchエージェントで収集されるメトリクス

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html

*CloudWatchエージェント設定ファイル

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html

  • CloudWatchエージェント設定ウィザードを実行する

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

  • CloudWatchエージェントを起動する

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

Discussion