Ubuntu 22.04 な EC2 で CloudWatch Agent を試す
公式ドキュメントには 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 やメモリのメトリクスは必要ないので
StatsDやCollectDは 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つあって、ひとつはパーミッションの調整。
実行ユーザーで指定した cwagent は cwagent なグループにしか所属しておらず、 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