【AWS】Amazon Linux 2023 でCloudWatch設定

この前何気に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つがあることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576311/99afbb01-cb2d-f4ec-adb6-52263acc053a.png)

そしてログストリームを見ても、ログが流れてきていることが確認できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576311/6d0f20e4-18f3-9316-661a-1e33331dd48b.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576311/649b876a-9765-9035-5abb-aaa461c7be15.png)