こんにちは、マネージドサービス部テクニカルサポート課の坂口です。
今回は Amazon Linux 2023 のシステムログを CloudWatch Logs へ出力する方法をいくつか紹介いたします。
Amazon Linux 2023 のシステムログ
Amazon Linux 2 までのシステムログは /var/log/messages に出力されるため、CloudWatch エージェントを使用して CloudWatch Logs へ出力が可能でした。
しかし、Amaozn Linux 2023 から、rsyslog サービスがデフォルトでインストールされていないため、/var/log/messages 等のログが作成されなくなりました。
代わりに、 journalctl コマンドを使用することでログを確認することが可能です。
repost.aws
CloudWatch Logs へ出力する方法(従来の方法)
journald は /var/log/journal 配下にログを出力しますが、ログファイルはバイナリファイルなのでそのまま CloudWatch Logs へ出力すると文字化けしてしまいます。
そのため、以下の2通りの方法があります。
・rsyslog をインストールして CloudWatch エージェント経由でログを出力する方法(従来の方法)
・Fluent Bit をインストールして Fluent Bit 経由でログを出力する方法
rsyslog をインストールして CloudWatch エージェント経由でログを出力する方法
1.rsyslog をインストールおよび起動します。
sudo dnf install rsyslog sudo systemctl enable rsyslog sudo systemctl start rsyslog
rsyslog を起動した段階で、/var/log 配下に messages が作成されていることが確認できます。
$ ls -l /var/log total 3640 lrwxrwxrwx. 1 root root 39 Dec 15 01:49 README -> ../../usr/share/doc/systemd/README.logs drwxr-xr-x. 3 root root 48 Jan 5 05:56 amazon drwx------. 2 root root 23 Jan 5 03:19 audit -rw-rw----. 1 root utmp 384 Jan 5 04:47 btmp drwxr-x---. 2 chrony chrony 72 Jan 5 03:19 chrony -rw-r-----. 1 root adm 6278 Jan 5 04:41 cloud-init-output.log -rw-r-----. 1 root adm 264629 Jan 5 04:41 cloud-init.log -rw-r--r--. 1 root root 869047 Jan 5 05:56 dnf.librepo.log -rw-r--r--. 1 root root 293419 Jan 5 05:56 dnf.log -rw-r--r--. 1 root root 84474 Jan 5 05:56 dnf.rpm.log -rw-r--r--. 1 root root 3319 Jan 5 05:56 hawkey.log drwxr-sr-x+ 3 root systemd-journal 46 Jan 5 03:19 journal -rw-rw-r--. 1 root utmp 292292 Jan 5 06:07 lastlog -rw-------. 1 root root 0 Jan 5 04:55 maillog -rw-------. 1 root root 1536524 Jan 5 08:27 messages drwx------. 2 root root 6 Dec 15 01:49 private drwxr-xr-x. 2 root root 18 Jan 5 03:19 sa -rw-------. 1 root root 73199 Jan 5 07:49 secure -rw-------. 1 root root 0 Jan 5 04:55 spooler drwxr-x---. 2 root root 73 Jan 5 03:19 sssd -rw-------. 1 root root 0 Dec 15 01:49 tallylog -rw-rw-r--. 1 root utmp 11520 Jan 5 06:08 wtmp
2.CloudWatch エージェントをインストールします。
sudo dnf install amazon-cloudwatch-agent
3.ウィザードを使用して CloudWatch エージェント設定ファイルを作成するか、以下のように手動で作成してください。
{ "logs": { "logs_collected": { "files": { "collect_list": [ { "file_path": "/var/log/messages", "log_group_name": "messages", "log_stream_name": "{instance_id}", "retention_in_days": -1 } ] } } } }
4.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
※/opt/aws/amazon-cloudwatch-agent/bin/config.json は 作成した設定ファイルのパスに置き換えてください。
Fluent Bit をインストールして Fluent Bit 経由でログを出力する方法
1.Fluent Bit をインストールします。
curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh
2.Fluent Bit の設定ファイル(/etc/fluent-bit/fluent-bit.conf)にて、以下のように /var/log/journal を CloudWatch Logs へ出力するように設定します。
[SERVICE] Flush 1 Daemon off Log_Level info Parsers_File parsers.conf [INPUT] Name systemd Tag * Path /var/log/journal [OUTPUT] Name cloudwatch_logs Match * region ap-northeast-1 log_group_name /ec2/logs log_stream_name journal auto_create_group true
設定ファイルの記述方法は Fluent Bit の公式ドキュメントを参照してください。
docs.fluentbit.io
docs.fluentbit.io
3.Fluent Bit を起動します。
sudo systemctl enable fluent-bit sudo systemctl start fluent-bit
まとめ
どちらも試した結果、個人的に rsyslog を使用する方が運用的にも今までと変わらず良いと思いました。
また、Fluent Bit では、インスタンスメタデータの取得が可能ではあるのですが、IMDSv2 には対応しておらず IMDSv1 が必須とのことで、使い辛い印象でした。
docs.fluentbit.io