この前何気にAmazonLinux2023で初めてCloudWatch設定をしました。
そしてアクセスログをAmazon Linux 2と同様にCloudWatchで設定しようとすると、見事に罠にハマってしまった為問題と改善策を記録しようと思い本記事を記載します。
前提
AWS
EC2 AmazonLinux2023
IAMロールでCloudWatchLogsFullAccessを適用
Nginxをミドルウェアとして利用
socket通信を利用するためにphp-fpmも利用
今回監視したいのは以下3つ
- nginxのアクセスログ
- nginxのエラーログ
- php-fpmのエラーログ
失敗した内容
対象とするインスタンスでCloudWatch Logsと連携するためにはエージェントをインストールする必要があるので、Amazon Linux 2と同様に以下コマンドを実行しました。
dnf install -y awslogs
Last metadata expiration check: 3:12:45 ago on Mon Nov 4 23:01:38 2024.
No match for argument: awslogs
Error: Unable to find a match: awslogs
awslogsがリポジトリに無い、、
代替方法
そして調べていくとAmazonLinux2023では以下のコマンドがcloudwatch-agentをインストールするコマンドになったようです。
sudo dnf install amazon-cloudwatch-agent
インストール後のステータス確認
sudo systemctl start amazon-cloudwatch-agent
sudo systemctl status amazon-cloudwatch-agent
● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; disabled; preset: disabled)
Active: active (running) since Tue 2024-11-05 02:30:34 JST; 2s ago
Main PID: 15882 (amazon-cloudwat)
Tasks: 6 (limit: 1112)
Memory: 64.4M
CPU: 229ms
CGroup: /system.slice/amazon-cloudwatch-agent.service
監視設定
そしてここからのエージェントの設定も以前なら、/etc/awslogs/awslogs.confを編集していましたが
それも大きく変わったようで以下の様な対応が必要です。
初期設定ファイルを作成するのにウィザード形式が使えるようで(対話式で設定を決めてける)以下コマンドを実行します。
cd /opt/aws/amazon-cloudwatch-agent/bin
sudo ./amazon-cloudwatch-agent-config-wizard
すると以下の様な対話が始まりますので、監視したいpathを設定していきます。
(かなり長い為一部省略しています)
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]:
2
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]:
2
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]:
2
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]:
Log file path:
/var/log/nginx/dev.menta.me.access.log
Log group name:
default choice: [dev.menta.me.access.log]
dev.menta.me.access.log
Log stream name:
default choice: [{instance_id}]
dev.menta.me.access.log
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 to specify any additional log files to monitor?で2を選ぶと、再度Log file path:を聞いてくれるので、そのほか監視したいpathを追加します。
私の場合/var/log/nginx/dev.menta.me.error.log"と/var/log/php-fpm/error.logを追加しました。
完了後json形式の設定ファイル[config.json]が作成されていることが分かります。
[root@ip-10-0-1-87 bin]# ls -al
total 455144
drwxr-xr-x 2 root root 16384 Nov 4 23:15 .
drwxr-xr-x 7 root root 140 Nov 4 23:03 ..
-rw-r--r-- 1 root root 11 Aug 28 04:16 CWAGENT_VERSION
-rwxr-xr-x 1 root root 137234696 Aug 28 04:16 amazon-cloudwatch-agent
-rwxr-xr-x 1 root root 14708712 Aug 28 04:16 amazon-cloudwatch-agent-config-wizard
-rwxr-xr-x 1 root root 14117 Aug 28 04:16 amazon-cloudwatch-agent-ctl
-rwxr-xr-x 1 root root 40563352 Aug 28 04:16 config-downloader
-rwxr-xr-x 1 root root 131724840 Aug 28 04:16 config-translator
-rw-r--r-- 1 root root 1900 Nov 4 23:50 config.json
しかしまだ設定が必要です。
設定ファイルの配置場所と設定ファイル名を変更する必要があります。
まずは/opt/aws/amazon-cloudwatch-agent/etc配下にコピー
cp -p config.json ../etc/
ファイル名をamazon-cloudwatch-agent.jsonに変更
cd ../etc/
mv config.json ./amazon-cloudwatch-agent.json
ls -la
total 40
drwxr-xr-x 3 root root 16384 Nov 5 00:42 .
drwxr-xr-x 7 root root 140 Nov 4 23:03 ..
drwxr-xr-x 2 root root 6 Aug 28 04:16 amazon-cloudwatch-agent.d
-rw-r--r-- 1 root root 1900 Nov 5 00:31 amazon-cloudwatch-agent.json
-rw-r--r-- 1 root root 2102 Nov 5 02:30 amazon-cloudwatch-agent.toml
-rw-r--r-- 1 root root 2740 Nov 5 02:30 amazon-cloudwatch-agent.yaml
-rw-r--r-- 1 root root 959 Aug 28 04:16 common-config.toml
-rw-r--r-- 1 root root 2 Nov 5 02:30 env-config.json
-rw-r--r-- 1 root root 177 Nov 5 02:30 log-config.json
念のため設定ファイルの中身を見ておきます。
[root@ip-10-0-1-87 etc]# cat amazon-cloudwatch-agent.json
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/nginx/dev.menta.me.access.log",
"log_group_class": "STANDARD",
"log_group_name": "dev.menta.me.access.log",
"log_stream_name": "/var/log/nginx/dev.menta.me.access.log",
"retention_in_days": -1
},
{
"file_path": "/var/log/nginx/dev.menta.me.error.log",
"log_group_class": "STANDARD",
"log_group_name": "dev.menta.me.error.log",
"log_stream_name": "dev.menta.me.error.log",
"retention_in_days": -1
},
{
"file_path": "/var/log/php-fpm/error.log",
"log_group_class": "STANDARD",
"log_group_name": "error.log",
"log_stream_name": "error.log",
"retention_in_days": -1
}
]
}
}
},
"metrics": {
"aggregation_dimensions": [
[
"InstanceId"
]
],
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"cpu": {
"measurement": [
"cpu_usage_idle",
"cpu_usage_iowait",
"cpu_usage_user",
"cpu_usage_system"
],
"metrics_collection_interval": 60,
"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
},
"swap": {
"measurement": [
"swap_used_percent"
],
"metrics_collection_interval": 60
}
}
}
設定変更は完了なのでサービス再起動します
systemctl restart amazon-cloudwatch-agent
最後にログが送信されているか確認
ロググループを見ると先ほど設定した以下3つがあることが分かります。