🕣

Ubuntu 22.04 な EC2 で CloudWatch Agent を試す

2022/10/21に公開

公式ドキュメントには Ubuntu 22.04 はサポート範囲に入っていなかったので、ちゃんと使えるかの検証も含めて試してみたメモ。環境は以下の通り。

lib version
Ubuntu 22.04
CloudWatch Agent CWAgent/1.247355.0 (go1.19; linux; amd64) No Build Date

EC2 に必要なポリシーをアタッチしておく

ココの冒頭に書かれているとおり、 CloudWatch Agent を実行するにあたって IAM ロールにて CloudWatchAgentServerPolicy がアタッチされている必要がある。なので、まずはこれを確認して、アタッチされていない場合は先に済ませておく。

パッケージのインストールと設定ファイルを生成する

パッケージはそれぞれのディストロ毎に用意されているので Ubuntu 用のものをダウンロード。それぞれのリージョンに用意されているので最寄りのところから落としてくると良い。今回は東京リージョンで作業していたので ap-northeast-1 で進める。

$ curl -LO https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
$ sudo dpkg -i -E ./amazon-cloudwatch-agent.deb

特にエラーがなければインスコは完了。 /opt/aws/amazon-cloudwatch-agent/ 以下にまるっとインスコされているはず。

次に設定ファイルを作る。これは用意されてる設定ウィザードを使っても良いし、まるっと手動で書いてもかまわない。とりあえずウィザードにしたがってやってみる。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

いろんな質問をされるけれど、今回変更した箇所だけをピックアップしてみる。

Q A
Which user are you planning to run the agent? 2. cwagent
Do you want to turn on StatsD daemon? 2. no
Do you want to monitor metrics from CollectD? 2. no
Do you want to monitor any host metrics? e.g. CPU, memory, etc. 2. no
Do you want to monitor any log files? /var/log/syslog
Do you want to specify any additional log files to monitor? /var/log/auth.log
Do you want to store the config in the SSM parameter store? 2. no

内容は至ってシンプルで

  • プロセスの実行ユーザーは cwagent にする
  • CPU やメモリのメトリクスは必要ないので StatsDCollectD は Off
  • 吸い上げたいログは /var/log/syslog/var/log/auth.log のふたつ

一通り済ませると/opt/aws/amazon-cloudwatch-agent/bin/config.json に指定した内容で設定ファイルが生成される。わたしの環境で生成されたものをはっつけておく。

{
	"agent": {
		"run_as_user": "cwagent"
	},
	"logs": {
		"logs_collected": {
			"files": {
				"collect_list": [
					{
						"file_path": "/var/log/syslog",
						"log_group_name": "syslog",
						"log_stream_name": "{instance_id}",
						"retention_in_days": -1
					},
					{
						"file_path": "/var/log/auth.log",
						"log_group_name": "auth.log",
						"log_stream_name": "{instance_id}",
						"retention_in_days": -1
					}
				]
			}
		}
	}
}

このあとやることが2つあって、ひとつはパーミッションの調整。
実行ユーザーで指定した cwagentcwagent なグループにしか所属しておらず、 syslog:adm なユーザ・グループでパーミッション 0640 で書き出されている /var/log/syslog/var/log/auth.log を読むことが出来ない。なので今回は adm グループに追加して読めるようにしてみる。

# adm に追加前はグループは cwagent のみ
$ id cwagent
uid=998(cwagent) gid=999(cwagent) groups=999(cwagent)
$ sudo usermod -a -Gadm cwagent
# ちゃんと adm に追加されている
$ id cwagent
uid=998(cwagent) gid=999(cwagent) groups=999(cwagent),4(adm)
# ちゃんと読めるか確認してみる
$ sudo -u cwagent cat /var/log/syslog
...

最後の cat でファイルの内容が表示されれば OK なはず。

もうひとつが設定ファイルの移動。
なんでそうなってるのか謎なんだけども、ウィザードで生成されるファイルパスとプロセスが読みに行くファイルパスが違っていて、そのまま起動すると No json config files found, please provide config, exit now なエラーをそっとログに残して終了してしまう。読みに行く場所は /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json らしいので、そこに移動させる。

$ cd /opt/aws/amazon-cloudwatch-agent
$ sudo mv ./bin/config.json ./etc/amazon-cloudwatch-agent.json

試しに手動で起動してみる。

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/start-amazon-cloudwatch-agent
I! Detecting run_as_user...

プロセスが終了することなく動き続けていれば OK 。AWS Console 入って CloudWatch からログを確認してみて、ちゃんと吸い上げられていれば設定完了。

自動起動を設定する

インスコした段階で systemd 用のファイルも入れてくれているので、そのまま使うで良いと思う。

# 起動してみる
$ sudo systemctl start amazon-cloudwatch-agent.service
# 起動確認
$ systemctl is-active amazon-cloudwatch-agent.service
active

もし起動確認で inactive や failed が返ってくるのであれば /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log になにかしらエラー内容が吐き出されてると思うので、対応してから再度確認する。
無事起動するようになったら自動起動の設定をする。

$ sudo systemctl enable amazon-cloudwatch-agent.service

あとは再起動してみて、ちゃんとプロセスが立ち上がっててログも吸い上げれていればまるっと完了。

おわりに

CloudWatch Agent についてググると、結構な頻度で古いほうのものについて書かれた記事がヒットしたので、自分の備忘録含めて書いてみた。が、なにはともあれ本家のドキュメントを眺めるのは大事 :-P

Discussion