ElastiCache サービスの導入 - Nextcloud 環境の構築を通じて AWS での環境構築を体験する②

「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/756ca04ecece844ce503) で作成した環境構成から キャッシュサービスである Redis を分離してみます。  
この Nextcloud 環境において、 Redis は次の役割を担っております。

* セッション情報の保持
* ファイルロック情報の保持

このサービスを分離することで、将来的に EC2 サーバーをロードバランサ等を利用して複数台運用としても、上記情報を Web サーバーで共有することができるようになります。
前回の記事で環境を構築して Nextcloud の環境を少し理解されている方であれば、「あれ、他にも分離しなきゃいけないやつあるじゃん。」と気が付くと思われますが、それは次回の記事に回します。

# 今回構築する Nextcloud on AWS 環境
次のような構成となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/beaf8bd4-a87c-abd4-10a4-68f799c30fdc.png)

## 今回追加で利用する AWS サービス
|サービス名|役割|
|:--|:--|
|Amazon ElastiCache|フルマネジメントのインメモリデータストアサービス。Redis と Memcached が利用できます。|

# 変更手順

## ElastiCache サービスを起動する

1. AWS マネジメントコンソールにログインし、ElastiCache サービスを選択します。「作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/a4da680e-02cf-88c1-eb5d-3162a4c69cd4.png)

2. サービスを起動するための設定情報をいくつか設定します。  
まず、クラスターエンジンは「Redis」を選択します。クラスタモードは今回は利用しないのでチェックされていたら外します。  
引き続き、Redis の設定です。以下のように設定します。

    |項目|内容|
    |:--|:--|
    |名前|Elastcache サービスを AWS リージョン内で一意になるように名前を入力します。運が悪いとすでにリージョン内で利用されている可能性がありますので、その時はあきらめてほかの名前を入力してください。|
    |説明|このサービスの説明を入力します。任意ですので名前と同じで問題ありません。|
    |エンジンバージョンの互換性|作成する Redis のバージョンを選択します。ここでは最新版の 5 系を設定します。|
    |ポート|Redis 要求を受ける TCP ポート番号です。作成されている Nextcloud で設定した Redis ポート番号を設定します。|
    |パラメータグループ|そのままで問題ありません。|
    |ノードのタイプ|ElastiCache サービスのタイプを選択します。インスタンスファミリーについては、EC2 のインスタンスタイプに準拠した性能となっております。とりあえずあれば問題ないくらいにしか使わないので、ここでは "cache.t3.small (1.37 GiB) を選択しました。登録後 12 ヵ月間の無料枠で使うこともできますので、その場合は "cache.t2.micro" を選択してください。選択後「保存」をクリックします。|
    |レプリケーション数|読み込み専用のレプリカをいくつ作成するかを設定します。0 ～ 5 個の範囲で設定でき、多ければその分読み込み負荷を軽減できます。またこれを 1 以上に設定しておくと自動フェイルオーバーに対応できるようになります。デフォルトで問題ありません。|
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/173255fe-b77a-a9bd-ffc0-6ddf4b3f7d54.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/f6eb8ff9-7aab-184c-ee53-8a0f799838d4.png)

3. Redis の詳細設定は下記のように設定します。

    |項目|内容|
    |:--|:--|
    |自動フェイルオーバーを備えたマルチ AZ|複数の アベイラビリティゾーン (AZ) を利用してフェイルオーバーするようにするかを設定します。チェックし有効にします。|
    |サブネットグループ|新規作成します。|
    |名前|サブネットグループの名前を入力します。1 バイト英数字、ハイフンを使って設定します。|
    |説明|サブネットグループの説明を入力します。名前と同じで問題ありません。|
    |VPC ID|ElastiCache サービスをどの VPC に作成するかを選択します。Nextcloud が動作する EC2 と同じ VPC を選択します。|
    |サブネット|VPC 内のどのサブネットを利用するか選択します。VPC 内に閉じて利用できれば問題ないので、全てのプライベートサブネットを選択すれば問題ありません。デフォルト VPC に作成する場合は選択できるものすべてを選択しておきます。|
    |優先アベイラビリティゾーン|どのアベイラビリティゾーンを優先して利用するかを選択します。デフォルトの "指定なし" で問題ありません。|
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/a4f9063a-0faa-cd27-14f9-d383c7b4d50d.png)

4. 以下の設定はすべてデフォルトで問題ありません。「作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/f0420b7c-c1ef-5652-e8e2-7b231ecfbef1.png)

5. 作成が開始されます。次画面に移るまでちょっと待たされますが心配ありません。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/503efe8a-b343-05ff-bb26-83df5c757b2f.png)

6. ステータスが "createing" となっている場合は作成中です。完了まで結構時間かかりますので気長に待ちましょう。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/1c1f458e-2d0f-ae50-5fd8-45cc5526e139.png)

7. ステータスが "available" となったら作成完了です。お待たせしました！  
"▼" をクリックすると作成した ElastiCache サービスの詳細情報を確認できます。このうち「プライマリエンドポイント」がこのサービスへのアクセスポイントとなりますので控えておきます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/232f0c16-26d3-9977-5ae8-db1a8aa04b0c.png)


## Nextcloud の設定変更
前回作成した Nextcloud サービスの一部を設定変更して、Nextcloud で今回作成した ElastiCache が利用できるようにします。  
Nextcloud サーバーに SSH 接続して作業を行います。 

### サービスの一時停止
設定変更中に不用意にアクセス等が行われないように、一部サービスを停止しておきます。

1. Nextcloud バックグラウンドジョブの停止。

    ```
    sudo mv /etc/cron.d/nextcloud-cron-php /etc/cron.d/.nextcloud-cron-php
    ```

2. Nginx の停止。

    ```
    sudo systemctl stop nginx
    ```

3. PHP-FPM の停止。

    ```
    sudo systemctl stop php-fpm
    ```

4. このサーバーで動いている Redis の停止。今後使わないので自動起動も停止。

    ```
    sudo systemctl stop redis
    sudo systemctl disable redis
    ```

### 設定ファイルの変更
作成した ElastiCache を利用できるようにするための設定を投入します。

1. Nextcloud 設定ファイルの変更。

    ```
    sudo cp -pi /var/www/html/nextcloud/config/config.php{,.orig2}

    sudo vi /var/www/html/nextcloud/config/config.php

    ※以下の diff 結果のように設定行を追加します。
    sudo diff /var/www/html/nextcloud/config/config.php.orig2 /var/www/html/nextcloud/config/config.php
    27c27
    <     'host' => 'localhost',
    ---
    >     'host' => '【作成した ElastiCache のアクセスポイント】',
    ```

2. PHP-FPM 設定ファイルの変更。

    ```
    sudo cp -pi /etc/php-fpm.d/www.conf{,.orig3}

    sudo vi /etc/php-fpm.d/www.conf

    ※以下の diff 結果のように設定行を追加します。
    diff /etc/php-fpm.d/www.conf.orig2 /etc/php-fpm.d/www.conf
    438c438
    < php_value[session.save_path]    = "tcp://localhost:6379"
    ---
    > php_value[session.save_path]    = "tcp://【作成した ElastiCache のアクセスポイント】:6379" 
   ```

### サービスの起動
一時停止しているサービスを起動します。


1. PHP-FPM の起動。

    ```
    sudo systemctl start php-fpm
    ```

2. Nginx の起動。

    ```
    sudo systemctl start nginx
    ```

3. Nextcloud バックグラウンドジョブの起動。

    ```
    sudo mv /etc/cron.d/.nextcloud-cron-php /etc/cron.d/nextcloud-cron-php
    ```

## Nextcloud の動作確認

Nextcloud が動作しているか確認します。ログインしてログアウトできれば問題ないです。

**お疲れさまでした！　これですべての設定が完了です。**

# あとがき

今回の記事を起こすにあたって、初めて ElastiCache サービスを利用してみたのですが (過去、客先提案で ElastiCache を利用した構成を提案したことあるのですが、使ったことはなかったのは内緒で)、けっこうあっさり起動してしまいました。EC2 インスタンス作るのに慣れている方はほぼ問題なくサービス起動できると思います。
前回に比較して今回は説明少なめでしたが、それだけ簡単に ElastiCache が導入できると理解いただければと思います。
当然ですが、このサービスを使わないで、EC2 で Redis サーバーを追加で立てて運用することも可能です。ですが、フルマネジメントで普段は面倒見なくてもいいように、あえて ElastiCache サービスを利用します。

で、

> 前回の記事で環境を構築して Nextcloud の環境を少し理解されている方であれば、「あれ、他にも分離しなきゃいけないやつあるじゃん。」と気が付くと思われますが、

ですが、これは、 EC2 サーバーに保存しているデータファイル群です。これも複数の Nextcloud サーバーで同じものが見れなければいけません。

ということで、次回はこれを分離してみます。