EFS ファイルサーバーへの移行 - 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/280642e437c709052781) で作成した環境構成から Nextcloud に保管されているファイル群を Amazon Elastic File System (EFS) を利用した外部のファイルサーバーに移してみます。  
これを分離することで、将来的に EC2 サーバーをロードバランサ等を利用して複数台運用としても、Nextcloud 保管ファイルを Web サーバーで共有することができるようになります。

\# EFS ってなかなか 東京リージョンに下りてこなかったので、追加が発表されたときには「いよいよ！」と歓喜した思い出 w

# 今回構築する Nextcloud on AWS 環境
次のような構成となります。EC2 から ファイルサーバーをマウントする形となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/11dc96e8-6501-b62c-b77f-229edc98ffe7.png)

## 今回追加で利用する AWS サービス
|サービス名|役割|
|:--|:--|
|Amazon Elastic File System (EFS)|シンプルでスケーラブル、かつ伸縮自在な完全マネージド型の NFS ファイルシステム。|

# 変更手順

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

1. AWS マネジメントコンソールにログインし、EFS サービスを選択します。「作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/ae4c8614-0f40-5bb0-4938-1267ab24fd43.png)

2. サービスを起動するための設定情報をいくつか設定します。  
ネットワークアクセスの設定です。
まず、「 VPC 」は、EFS をどの VPC でアクセスできるようにするかを選択します。EC2 と同じ VPC を選択してください。デフォルト VPC でも問題ありません。
次にマウントターゲットの作成です。マウントターゲットは EC2 インスタンスから EFS に接続するための接続先となります。現時点では、EC2 を作成しているアベイラビリティゾーンのみあれば問題ありませんが、将来的にどこのアベイラビリティゾーンの EC2 でも接続できるようにするため、この時点ですべてのアベイラビリティゾーンの EC2 インスタンスに接続できるようにしてしまいます。表示されているすべてのアベイラビリティゾーンについてチェックをして有効にします。
そのほかの項目は以下のように設定し、「次のステップ」をクリックします。

    |項目|内容|
    |:--|:--|
    |サブネット|EFS のマウントポイントをどのサブネットで作成するかを選択します。今回は EC2 と接続することができれば問題ないので、プライベートサブネットで OK です。|
    |セキュリティグループ|マウントターゲットに関連付けるセキュリティグループを設定します。Nextcloud EC2 に設定されているセキュリティグループを追加して、このセキュリティグループを持つ EC2 と疎通できるようにします。|

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/a0cb8354-4862-e92d-1762-dba447fa6e1e.png)


3. ファイルシステムの設定です。
以下のように設定し、「次のステップ」をクリックします。

    |項目|内容|
    |:--|:--|
    |タグの追加|作成する EFS にタグを追加します。Name キーとしてこの EFS の名前を最低限追加しておきます。その他必要なタグがあれば追加しておきます。|
    |ライフサイクル管理の有効化|ここでは、「最後のアクセスから 30 日」を選択し、30 日アクセスされなかったファイルを移動するようにします。ライフサイクル管理は最近追加された機能で、 EFS に保管されているファイルを自動的に EFS 低頻度アクセスストレージクラスに移動する機能です。EFS 低頻度アクセスストレージクラスは S3 の低頻度アクセスタイプみたいな感じで、容量当たりの利用料金が安い代わりに取り出しにコストがかかるやつです。|
    |スループットモードの選択|「バースト」を選択します。要件などでより高いスループットが必要でなければこれで問題ありません。|
    |パフォーマンスモードの選択|「汎用」を選択します。|
    |暗号化の有効化|チェックがついていたら外します。ファイルシステムの暗号化をするかどうかを選択するもので、セキュリティ要件などで暗号化が必要であればチェックします。|
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/49696d0a-f25f-d605-48cd-911764a6eaf1.png)

4. これまでの設定内容を確認します。問題なければ「ファイルシステムの作成」をクリックします。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/c80d2e8b-aa7d-da17-61dc-4d0d66c1f2c8.png)

5. EFS ファイルシステムの作成が開始されます。マウントターゲットの状態が「作成中」の場合はまだ使えないので気長に待ちます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/9f7540dd-0c80-07b3-45c3-5510038ae72f.png)

6. ブラウザ再読み込みをしてファイルシステムの状態、マウントターゲットの状態が「利用可能」となったら作成完了です。
「ファイルシステムへのアクセス」の「DNS 名」がこの EFS へのアクセスポイントとなりますので確認しておきます。
この後、 Nextcloud EC2 サーバーにこれをマウントするのですが、この手順は「 Amazon EC2 のマウント手順 (ローカル VPC から)」のリンクに親切にも記載されていますのでこれを参照して設定していきます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316764/0e029fe7-002c-7148-1a5b-cacb64fbe001.png)

## EC2 サーバーにEFS サービスをマウント

これまでで作成した EC2 の Nextcloud サーバーにこの EFS をマウントして、EC2 に保管されている Nextcloud 保管ファイルをここに移動します。

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
    ```

### 既存の Nextcloud 保管ファイルを退避
既存の Nextcloud データファイルが保管されているディレクトリを一時退避します。

1. データ保管ディレクトリの名前を変更。

    ```
    sudo -i
    mv /DATA /DATA_back
    exit
    ```

### EFS を接続(マウント)
作成した EFS をこのサーバーのファイルシステムとして利用できるようにマウントを行います。

1. マウント先ディレクトリの作成。

    ```
    sudo mkdir /DATA
    ```

2. 作成したディレクトリをマウントポイントとして EFS をマウント。

    ```
    sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport 【EFS の DNS 名】:/ /DATA
    ```

3. 接続されているか確認。

    ```
    df -Th
    ```
    ※以下の表示を確認します。

    |項目|内容|
    |:--|:--|
    |ファイルシス|【EFS の DNS 名】:/|
    |タイプ|nfs4|
    |マウント位置|/DATA|

4. サーバーが再起動しても自動的にマウントするように設定追加。

    ```
    sudo echo "【EFS の DNS 名】:/ /DATA nfs4 defaults 0 0" >> /etc/fstab
    ```

5. 設定が追加されているか確認。

    ```
    cat /etc/fstab
    ```

    ※「【EFS の DNS 名】:/ /DATA nfs4 defaults 0 0」の 1 行が追加されていることを確認します。
    ※指定を誤っているとサーバーが起動しなくなる可能性があるので、確認はしっかり行ってください。

### Nextcloud 保管ファイルを退避先からコピー
マウントした EFS に退避していた Nextcloud 保管ファイルをコピーして復元します。

1. 先に名前変更したディレクトリの中身を EFS にコピー。

    ```
    sudo cp -piR /DATA_backup/. /DATA
    ```
    ※隠しファイルもあるため、コピー元の指定には注意してください。

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

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 が動作しているか確認します。Nextcloud にログインしてファイルアップロード、ダウンロード等を試してみます。

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


# あとがき

EFS 東京リージョン追加に歓喜した割には、なかなか利用する機会に恵まれず、前回同様、今回の記事を起こすにあたって、初めて EFS を利用してみたのですが、こちらもけっこうあっさり起動、マウントまで完了ました。
当然ですが、このサービスを使わないで、EC2 で NFS ファイルサーバーを追加で立てて運用することも可能です。ですが、フルマネジメントで保管領域を気にしたり EC2 障害などを普段は面倒見なくてもいいように、あえて EFS サービスを利用します。

ここまでで、次回に向けての準備はできましたので、次回は EC2 を複数にし、ロードバランサを追加することで、Nextcloud の可用性を高めていきます。