[小ネタ]Amazon Linux 2 で CloudWatch エージェントを起動しようとしてハマった話

エージェント 起動でハマって ああ悲し
2020.08.06

コンサル部@大阪オフィスのYui(@MayForBlue)です。

Amazon Linux 2 に CloudWatch エージェントをインストールして起動しようとした際にエラーが出てハマってしまいました。
小ネタですが備忘録として解決方法を残しておきたいと思います。

起きたこと

EC2 に CloudWatch エージェントをインストールして SSM から Run Command を使用してエージェントを起動しようとした際に、エラーが出て実行が失敗してしまいました。

エラーの内容は以下です。

/opt/aws/amazon-cloudwatch-agent/bin/config-downloader --output-dir /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d --download-source ssm:AmazonCloudWatch-linux --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-linux.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

Valid Json input schema.

I! Detecting runasuser...

No csm 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/08/06 06:20:57 I! AmazonCloudWatchAgent Version 1.246396.0.

2020/08/06 06:20: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

----------ERROR-------

2020/08/06 06:20:57 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/ssm_AmazonCloudWatch-linux.tmp ...

failed to run commands: exit status 1

結論と解決策

結論を言うと、OSに collectd (サーバの統計情報を収集するためのソフトウェア) のアプリケーションが足りていないことが原因でした。

Amazon Linux 2 にはデフォルトで collectd がインストールされていないにも関わらず、エージェントの設定ファイルを作成した際に collectd のメトリクスを有効にしていたため、上記のエラーが発生しました。
実際に使用した設定ファイルの内容は以下です。

{
	"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}"
					}
				]
			}
		}
	},
	"metrics": {
		"append_dimensions": {
			"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
			"ImageId": "${aws:ImageId}",
			"InstanceId": "${aws:InstanceId}",
			"InstanceType": "${aws:InstanceType}"
		},
		"metrics_collected": {
			"collectd": {
				"metrics_aggregation_interval": 60
			},
			"disk": {
				"measurement": [
					"used_percent"
				],
				"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"
			}
		}
	}
}

解決策として、以下のドキュメントにしたがって collectd をインストールしました。
collectd を使用したカスタムメトリクスの取得

インストールのコマンドは以下です。

sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum install -y collectd

インストールが終わったあと再度SSMの Run Command を実行すると無事にエージェントが起動し、CloudWatch Logs にログが出力されていることが確認できました。

また、collectd からのメトリクスの収集が不要な場合は、collectd の使用をしないようにエージェントの設定ファイルを再度作成してコマンドを実行するとエージェントの起動が成功します。

さいごに

小ネタですが、少しハマったので備忘録として書いてみました。
この記事がどなたかのお役に立てば幸いです。

以上、コンサル部@大阪オフィスのYui(@MayForBlue)でした!