分散した EC2 インスタンスのログの集約 - Nextcloud 環境の構築を通じて AWS での環境構築を体験する⑤

「Nextcloud 環境の構築を通じて AWS での環境構築を体験する」 の第 5 回となります。

「Nextcloud 環境の構築を通じて AWS での環境構築を体験する」 シリーズの記事は下記からどうぞ。

* 【第 1 回】[EC2 と RDS を利用した Nextcloud 環境の構築](https://qiita.com/S_Katz/items/756ca04ecece844ce503)
* 【第 2 回】[ElastiCache サービスの導入](https://qiita.com/S_Katz/items/280642e437c709052781)
* 【第 3 回】[EFS ファイルサーバーへの移行](https://qiita.com/S_Katz/items/5b5f37db29c3f800e610)
* 【第 4 回】[ALB を利用したサーバー負荷分散、可用性向上に向けた取り組み](https://qiita.com/S_Katz/items/edadf33755c0d834eb46)
* 【第 5 回】[分散した EC2 インスタンスのログの集約](https://qiita.com/S_Katz/items/2fa740c5051859963dae)
* 【第 6 回】[Cron の外部実行とメール送信の追加](https://qiita.com/S_Katz/items/35525eba5ff61801e7e3)
* 【第 7 回】[AutoScaling の導入](https://qiita.com/S_Katz/items/6c6d0a46e592eb783fda)


# はじめに
[前回記事](https://qiita.com/S_Katz/items/edadf33755c0d834eb46) で EC2 インスタンスを複数構成にすることにより可用性向上の構成としました。この状態でも運用することはできるのですが、ログを確認する際にそれぞれの EC2 インスタンスに保存されているログファイルを参照して合わせて・・・といったことが必要となり非常に面倒となります。
そこで、[前回記事](https://qiita.com/S_Katz/items/edadf33755c0d834eb46) までで構成したシステムに対して、今回はこれらログを AWS のログ保管サービスに集約して管理できるようにします。

# 今回構築する Nextcloud on AWS 環境
次のような構成となります。今回は Nextcloud を動かす部分の構成自体には何も変更はありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/556863e9-0993-38af-ddda-2fcae9083f36.png)


## 今回追加で利用する AWS サービス
|サービス名|役割|
|:--|:--|
|Amazon CloudWatch Logs|EC2 等ソースのログファイルの監視、保存、アクセスができるサービス。ログ自体は S3 に保管されます。|

# 設定手順

## CloudWatch Logs エージェントの追加
CloudWatch Logs に EC2 に出力されるログを転送するエージェントを EC2 にインストール、設定します。2 つの EC2 インスタンスに同様に設定していきます。

1. Nextcloud の EC2 仮想サーバーに SSH 接続します。

2. CloudWatch Logs エージェントセットアッププログラムをダウンロードします。

    ```bash:
    wget https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py
    ```

3. CloudWatch Logs エージェントのインストールを行います。ログを出力するリージョンは東京リージョン (ap-northeast-1) にします。

    ```bash:
    sudo python ./awslogs-agent-setup.py --region ap-northeast-1
    ```

4. 上記のスクリプト実施中に、あわせて設定も行います。まず CloudWatch Logs サービスを使うためのアクセス情報として AWS アクセスキーとシークレットアクセスキーを設定します。`Default region name` と `Default output format` は何も入力せず [Enter] キーを押下します。

    ```
    AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxx
    AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    Default region name [ap-northeast-1]:
    Default output format [None]:
    ```

5. 引き続き CloudWatch Logs に集約するログの設定を行います。以下のように設定していきます。`"More log files to configure? [Y]:"` で "Y" を入力することにより複数のログを繰り返して設定することができます。すべてのログを設定したら、この問い合わせで "N" を入力して終了します。

    **【設定する内容】**
 
    |問い合わせメッセージ|設定する内容|
    |:--|:--|
    |Path of log file to upload|集約するログファイル(フルパス)|
    |Destination Log Group name|ロググループ名 → ここでは上と同じで OK です。|
    |Choose Log Stream name|ログがどの EC2 インスタンスから出ているかを区別する方法。ここでは "1. Use EC2 instance id." を指定します。 |
    |Choose Log Event timestamp format|ログ日時フォーマット。好みのフォーマットを選んでください。|
    |Choose initial position of upload|ログをいつ出力するか。ログの種類にもよりますが、ここでは "1. From start of file." を指定します。|

    **【設定対象のログ】**

    |内容|ログファイルパス|
    |:--|:--|
    |システムログ|/var/log/messages|
    |Nginx アクセスログ|/var/log/nginx/access.log|
    |Nginx エラーログ|/var/log/nginx/error.log|
    |PHP-FPM ログ|/var/log/php-fpm/error.log|
    |Nextcloud ログ|/var/log/nextcloud/nextcloud.log|
    |Cron ログ|/var/log/cron|
    ※他に出力したいログがあったら適宜追加してかまいません。

6. 以下のようなメッセージが出力されたら登録成功です。

    ```
    ------------------------------------------------------
    - Configuration file successfully saved at: /var/awslogs/etc/awslogs.conf
    - You can begin accessing new log events after a few moments at https://console.aws.amazon.com/cloudwatch/home?region=ap-northeast-1#logs:
    - You can use 'sudo service awslogs start|stop|status|restart' to control the daemon.
    - To see diagnostic information for the CloudWatch Logs Agent, see /var/log/awslogs.log
    - You can rerun interactive setup using 'sudo python ./awslogs-agent-setup.py --region ap-northeast-1 --only-generate-config'
    ------------------------------------------------------
    ```

## CloudWatch Logs へのログ出力状況の確認

1. AWS マネジメントコンソールにログインし、CloudWatch サービスを選択します。左ペインで「ロググループ」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/fe4ccd76-c7ce-4d33-5215-2b7a2bef6a57.png)

2. 「フィルター:」に `"/var"` と入力して Enter キーを押下すると設定したロググループが出てきます。確認したいログのリンクをクリックしてみます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/268051c5-4449-79d3-83b8-d78746db9ddf.png)

3. 「ログストリーム」に EC2 インスタンスのインスタンス ID が表示されます。チェックボックスの一番上のものをチェックするとすべてのインスタンスを選択できます。引き続き「ロググループの検索」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/cc5413c2-9f1e-f63a-4bf8-5c5e58777eff.png)

4. CloudWatch Logs に出力されたログが確認できます。フィルタリングも可能です。下の例では直近 5 分のログに絞り込んでいます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/1c7f181e-2032-f64d-09c3-863c3707bd09.png)

**お疲れさまでした！　これで完了です。**

# あとがき

CloudWatch Logs はサーバーにログを保管しておく必要もなく、別途ログサーバーを準備する必要もなく、容量を気にせず半永久的にログを保管し続けることができます。また複数の EC2 サーバーにわたってログの確認ができるので、複数の EC2 インスタンスを運用する際には必須と言っても過言でないと思います。  
また、ログを様々な視点で確認できる機能もありますので、活用してみてください。

次回は、2 つの EC2 インスタンスの構成差分となっている Cron 設定への対策をして構成管理を単純化していきます。あわせて、 Nextcloud の通知メール機能を利用するためのメールサービスを AWS で構成します。