CloudWatch エージェントを使用してログを収集する

この記事は[EDOCODE Advent Calendar 2024](https://adventar.org/calendars/10618)、12月21日(土)の記事です。

1つ前の記事は、エンジニアのAnneさんによる[Exploring the consistency of characters generated with AI-image generator tools](https://medium.com/@coudry.a/exploring-the-consistency-of-characters-generated-with-ai-image-generator-tools-63ba44198c42)でした。
また、グループ親会社である[WanoのAdvent Calendar](https://qiita.com/advent-calendar/2024/wano-group)もありますので、そちらもどうぞ！

## はじめに
EDOCODEのエンジニアのKaoriです。Pmallチームに所属しています。Pmallの新規開発にあたって監視でCloudWatch を使うことになりました。そこでサーバー上のログをCloudWatchエージェントを使用してCloudWatch のロググループに飛ばし、一部そのログからアラート設定を行なったので備忘録としてその方法を記載します。

## CloudWatch エージェントの設定
CloudWatch エージェントをインストールして設定ファイルを作成します。

### CloudWatch エージェントのインストール
CloudWatch エージェントは以下のコマンドでインストールできます。
```
sudo yum install amazon-cloudwatch-agent
```
参考: https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-EC2-Instance.html

### 設定ファイル作成
CloudWatch エージェントをサーバーで実行する前に、CloudWatch エージェント設定ファイルを 1 つ以上作成する必要があります。エージェント設定ファイルは、`agent`、`metrics`、`logs`、`traces` 4 つのセクションを持つ JSON ファイルです。このファイルを作成するには、ウィザードを使用するか、一から自分で作成します。また、ウィザードを使用して最初に設定ファイルを作成してから、手動で変更することもできます。

ウィザードを使用する場合は、以下のコマンドで起動できます。
```
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
```
質問に答えて、サーバーの設定ファイルをカスタマイズできるので簡単に設定ファイルを作成することができます。

作成されたファイルはこのような感じです。

```
{
    "agent": {
        "metrics_collection_interval": 60,
        "run_as_user": "hoge"
    },
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/hoge/hoge.log*",
                        "log_group_class": "STANDARD",
                        "log_group_name": "/var/log/hoge/hoge",
                        "log_stream_name": "{instance_id}",
                        "retention_in_days": -1
                    },
                ]
            }
        }
    },
    "metrics": {
        "aggregation_dimensions": [
            [
                "InstanceId"
            ]
        ],
        "append_dimensions": {
            "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
            "ImageId": "${aws:ImageId}",
            "InstanceId": "${aws:InstanceId}",
            "InstanceType": "${aws:InstanceType}"
        },
        "metrics_collected": {
            "disk": {
                "measurement": [
                    "used_percent"
                ],
                "metrics_collection_interval": 60,
                "resources": [
                    "*"
                ]
            },
            "mem": {
                "measurement": [
                    "mem_used_percent"
                ],
                "metrics_collection_interval": 60
            },
            "statsd": {
                "metrics_aggregation_interval": 60,
                "metrics_collection_interval": 10,
                "service_address": ":****"
            }
        }
    },
    "traces": {
        "buffer_size_mb": 3,
        "concurrency": 8,
        "insecure": false,
        "region_override": "ap-northeast-1",
        "traces_collected": {
            "xray": {
                "bind_address": "000.0.0.0:0000",
                "tcp_proxy": {
                    "bind_address": "000.0.0.0:0000"
                }
            }
        }
    }
}
```
logs の collect_list を追加して、取得したいログファイルを複数設定できます。

#### file_path
CloudWatch Logs にアップロードするログファイルのパスを指定します。ワイルドカードを使用することもできます。(例: /var/log/system.log*)

#### log_group_class
新しいロググループに使用するロググループクラスを指定します。有効な値は、STANDARD および INFREQUENT_ACCESS です。

#### log_group_name
CloudWatch Logs でロググループ名として何を使用するかを指定します。

#### log_strem_name
CloudWatch Logs でログストリーム名として何を使用するかを指定します。変数として {instance_id}、{hostname}、{local_hostname}、{ip_address} を使用することができます。

#### retention_in_days
指定されたロググループにログイベントを保持する日数を指定します。CloudWatch エージェントウィザードは、このフィールドのデフォルト値として -1 を使用します。これは、エージェント設定ファイルを作成する場合で、ログ保持の値を指定しない場合に使用されます。ウィザードが設定するこの -1 の値によって、ロググループ内のイベントが期限切れにならないよう指定されます。ただし、この値を手動で -1 に編集しても効果はありません。

###  CloudWatch エージェントを起動
以下のコマンドを使用しCloudWatch エージェントを起動します。
```
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:configuration-file-path
```
configuration-file-path は、エージェント設定ファイルへのパスに置き換えます。このファイルの名前は、ウィザードで作成した場合は config.json になり、手動で作成した場合は amazon-cloudwatch-agent.json になる場合があります。

## アラームの設定
該当のロググループからメトリクスフィルターを選択し、ナビゲーションに沿ってメトリクスフィルターを作成します。

![スクリーンショット 2024-12-19 17.02.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536926/066867da-466c-f207-eaae-6e2b8223e365.png)

作成したメトリクスフィルターを選択し、ナビゲーションに沿ってアラームを作成します。

![スクリーンショット 2024-12-19 17.10.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536926/5d4d74da-1d04-f57c-d186-268d6256d325.png)

## 最後に
AWS を触ることがほとんど初めてだったので分からないことが多く勉強になりました。ひとまずログ設定からアラーム設定まですることができてよかったです。監視設定のお役に立てれば幸いです。

----

明後日、12月23日(月)は、エンジニアのSaloniさんによる[Building Smart, Not Perfect: Avoiding Over-Engineering in MVP](https://medium.com/@saloni.ag14/building-smart-not-perfect-avoiding-over-engineering-in-mvp-21606fe02a2b)という記事です。

私たちWanoグループでは人材募集をしています。興味のある方は、下記のリンクからぜひ募集中の求人をご確認ください！
[JOBS | Wano Group](https://group.wano.co.jp/jobs/)