135日目 CloudWatchでEC2ログの管理したい(1/2) 社畜L

## 🔍事前に知っておくこと
EC2のログをCloudWatchで管理するとはつまり、**EC2のログをCloudWatchに送る**ということです。
その観点から必要なものが3つあり、それぞれざっくりと解説します。

- **CloudWatchエージェント**
EC2のログを収集しCloudWatchに送信するためのソフトウェア

- **CloudWatchエージェント設定ファイル**
インストールしたCloudWatchエージェントのどのファイルを監視しどのログストリームに管理するか、等の設定が書かれたファイル

- **IAMロール**
EC2に権限を与え他のリソースを利用できるようにする。
今回は[CloudWatchにデータを送る][SSM読み取り]の2つの権限が必要になる。

## 🔍やりたいたこと
1. - [x] CloudWatchエージェントをインストールする
2. - [x] CloudWatchエージェントのJSONはSSMパラメータストアで管理しロードしたい
3. - [ ] JSONの読み込みは初回のみ手動で今後はEC2再起動のみでSSMパラメータストアを読み込むようにしたい
4. - [ ] ログ追加時に通知メールが欲しい

全てをまとめて書くとすごい量になってしまうので２回に分けて解説していきます。
今回は2番目まで解説します。
1~2の手順まででCloudWatchへログの送信自体はできます。



## 🔍実行手順
前提としてVPC、サブネット、EC2、SGなどの構築は終わっているものとします。

### CloudWatchエージェントをインストールする
1. IAMロール作成
    以下のポリシーを持つIAMロールを作成する。
    - [CloudWatchAgentServerPolicy] ：CloudWatchにデータを送る
    - [AmazonSSMReadOnlyAccess]：SSM読み取り
    ※EC2内で設定ファイルを作成する場合、[AmazonSSMReadOnlyAccess]は不要。
    <br>

2. 監視したいEC2にCloudWatchエージェントをインストールする

    ① インストールコマンドを打つ
    ※これでうまくいくなら2は終わりです。インストールされたことを確認してください。
    ```
    sudo yum install amazon-cloudwatch-agent
    ```


    ② ①が失敗した場合、エージェントインストール予定のEC2のプラットフォームとアーキテクチャを確認
    
    ```
    sudo -i
    uname -m
    cat /etc/os-release
    ```
    ③ プラットフォームとアーキテクチャごとにCloudWatchエージェントのインストールコマンドは変わるので②で確認した情報と照らし合わせながら、[公式サイト](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-commandline-fleet.html)を確認し利用可能なダウンロードリンクを探しエージェントをインストールする。

    ※リンク先に下記のようなリストがあるのでそこを参照する。
![スクリーンショット 2024-08-27 130118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/ed3be6b9-976d-8c79-393c-1e90e9993879.png)



    ※インストールや解凍に必要なものが足りない場合は別途インストールしてください。
    ```
    sudo -i
    wget https://amazoncloudwatch-agent-[利用リージョン].s3.[利用リージョン].amazonaws.com/***
    rpm -U ./amazon-cloudwatch-agent.rpm
    ```
    インストールされたことを確認
    ```
    yum list installed | grep amazon-cloudwatch-agent
    ```
    
    補足(今回は実行不要): 
    下記コマンドでウィザードを呼び出し、CloudWatchエージェント設定ファイルを生成することもできます。
    パラメータストアからのロードを行わない場合はこちらを実行してください。
    ```
    sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
    ```
    <br>

### CloudWatchエージェントのJSONはSSMパラメータストアで管理しロードしたい
3. AWSSSMにCloudWatchエージェント設定ファイルを作成し保存する

    ① SSMパラメータストアに任意の名称のString型で下記の内容を変更し保存する。
    ```
    {
        "agent": {
            "run_as_user": "root"
        },
        "logs": {
            "logs_collected": {
                "files": {
                    "collect_list": [
                        {
                            "file_path": "[監視したいファイルのパス]",
                            "log_group_class": "STANDARD",
                            "log_group_name": "[CloudWatch内のロググループ名]",
                            "log_stream_name": "[CloudWatch内のログストリーム名]",
                            "retention_in_days": [保存日数]
                        },
                        {
                            "file_path": "[監視したいファイルのパス]",
                            "log_group_class": "STANDARD",
                            "log_group_name": "[CloudWatch内のロググループ名]",
                            "log_stream_name": "[CloudWatch内のログストリーム名]",
                            "retention_in_days": [保存日数]
                        }
                    ]
                }
            }
        }
    }
    ```
    
    ② EC2から①で保存した設定を読み込む
    ```
    sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c ssm:[SSM名] -s
    sudo systemctl enable fetch-cloudwatch-config.service
    ```
    ロードした設定ファイルを確認
    ```
    sudo cat /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
    ```
    <br>

### 最終確認
1. テストログを作成
    ```
    sudo echo "test log entry at $(date)" >> [監視するファイルのパス]
    ```
    <br>
2. AWSコンソール上のCloudWatchから先ほど追加したログが設定ファイルで指定したログストリーム内から確認できることを確認する。
　※AWSコンソール上のCloudWatch内でロググループやログストリームは作成しなくても自動で作成される。

　下図のようにコンソール上からログが確認できる。
![スクリーンショット 2024-08-27 133044.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3766505/6e20a24e-f2ae-f290-0397-b40fd80360d4.png)


## 🔍まとめ
EC2のログをCloudWatchに送る必要があったのでまとめてみました。
次回の投稿は4週間後の予定なので、残りを解説していこうと思います。