【AWS EFS】共有ファイルストレージ構築

##目標
・AWS EFS(※１)を利用して共有ネットワークファイルストレージを構築する。
・EFS固有の特徴をハンズオンで検証する。

※１　EFSとは
AWSが提供するフルマネージド型のNFSサーバ（※２）のことです。
マネージドサービスのため自前でNFSサーバを構築するより高速構築が出来、
かつ管理の手間を省くことが可能です。

※２　NFSとは
ネットワークを通じてファイルシステムを共有する際に使われる通信プロトコルのことです。
主にUnix系OS同士のファイルシステム共有にはNFSが古くから使われています。

##前提
・複数AZにEC2サーバ(Amazon Linux 2 AMI (HVM), SSD Volume Type)が構築済みであること。
・基本的なLINUXコマンド操作が出来ること。

##利用環境
ハードウェア　：　**AWS EC2サーバ 2台（別AZ構成）**
OS（AMI）　:　**Amazon Linux 2 AMI (HVM), SSD Volume Type**
その他ソフトウェア：
**amazon-efs-utils**（EFS操作用ユーティリティ）
…NFSクライアントを利用するよりEFSに関しては便利な様です。

##EFSとEBSの違い
ほぼAWS資格本の抜粋ですが、今一度まとめます。


|                  |       EBS　　　         |    EFS             |
|:-----------------|:--------------------------------------------|:--------------------------------------------|
| 接続            |EC2インスタンスとネットワーク接続|EC2インスタンスとネットワーク接続|
| **接続台数**        | **1台のEC2インスタンスと接続可能** 　　|    **複数のEC2インスタンスと接続可能**  　　　　     |
| データ永続性   |            永続化可能 |        永続化可能        |
| **耐久性**          |               **単一AZ内で冗長化** |         **複数AZで冗長化**         |
| **拡張性**         |               **手動ボリューム拡張** |         **自動ボリューム拡張**         |
| パフォーマンス    |             高速 |       高速       |
| 料金体系         |          ギガバイトあたりの重量課金(安) |     ギガバイトあたりの重量課金(高)      |


以上より、EFSがEBSと比較して優れているところは、

・複数のEC2インスタンスから接続可能であること
・複数AZで冗長化されるため、耐久性が高い
・自動サイズ拡張機能があるため、管理が楽

が該当するかと思います（デメリットは少し料金が高いとこ）。

##完成図
異なるAZに存在するEC2インスタンスから共通のEFSファイルシステムへ接続します。
EC2⇔EFS間はマウントターゲット（※）とよばれるNFSエンドポイントを経由してアクセスします。

![Untitled Diagram (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/ce7856ce-1212-2f4d-0c4b-8af46e594e99.png)

※マウントターゲットは各AZ毎に作成されます。
セキュリティグループをつけることで、仮想ファイアフォールとしても機能しています。


##作業の流れ
| 項番 | タイトル |
|:----:|:-------------|
| 1 | [EFSファイルシステムを作成する](#1efsファイルシステムを作成する) |
| 2 | [EFSファイルシステムをEC2にマウントする](#2efsファイルシステムをec2にマウントする)|
| 3 | [動作検証](#3動作検証)

##手順
###1.EFSファイルシステムを作成する
**①Amazon EFS マネジメントコンソール (https://console.aws.amazon.com/efs/) を開きます。**
**②`ファイルシステムの作成`をクリック**
**③ネットワークアクセスの設定**
以下のように、各値を投入してください。
設定が終わったら`次のステップ`

VPC：　**接続元EC2インスタンス群が所属するVPCID**
サブネット：　**接続元インスタンス群が所属するサブネットID**
セキュリティグループ：　**各マウントターゲットに付与したいセキュリティグループ（※）**

※**NFS通信を許可したセキュリティグループを使用しなければならないことに注意してください！**
(投稿者はここの不備が原因でEC2⇔EFS間の疎通が取れなく時間食ってしまいました。。)
確認する手順は後述致します。

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/60ff49b1-bd9d-334d-10e9-795e17778a64.png)

**④ファイルシステムの設定を行う**
設定は任意です。
Nameタグはつけといた方がわかりやすいです。
ライフサイクル管理を有効化するとコストパフォーマンスがよくなるらしいので一応設定しました。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/f6fd8499-ce20-8813-c30a-833f90681c8a.png)

パフォーマンスや暗号化に関する設定です。
特別な要件がなければデフォルトでよいかと思います。
設定が終わったら`次のステップ`
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/114b9242-cd25-4f77-2683-9c6ef1a7d727.png)

**⑤クライアントアクセスを設定（※）**
今回の要件では設定不要です。
`次のステップ`をクリック

※設定内容
EFSファイルシステムへIAM、及びアクセスポイントを利用してのアクセス制御をかけることが出来るようです。
マウントターゲットに付与したセキュリティグループに加え、より高度なアクセス制御が可能となります。
以下、参考にさせて頂いた記事でEFSの詳細仕様がまとまっています。

**Amazon Elastic File System（EFS）を使ううえでの勘所(EFSってアクセス制御できるの？)**
https://qiita.com/taichimachima/items/f7d47b68aac2a11ea7cc

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/92c88902-90a4-45bb-4958-08d6f2541306.png)



**⑥設定内容確認**
設定内容問題なければ、`ファイルシステムの作成`をクリック
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/2dc89111-b917-582a-8638-eb1a00c08493.png)

**⑦ファイルシステム作成確認**
`マウントターゲット状態`が利用可能になるまで待ちます。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/bf036745-dabc-b94c-43a7-f54a7d2dd873.png)

**⑧マウントターゲットに付与されているセキュリティグループの確認**
マウントターゲットに付与されているセキュリティグループのIDを確認します。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/f665b646-a816-17a6-e6ad-9af528cb5506.png)

上記で確認したセキュリティグループが`NFS2049番ポート`を許可していることを確認してください。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/63914cd3-d8e0-53d4-09b6-6b46d5c90041.png)

###2.EFSファイルシステムをEC2にマウントする
**①マウント実行**
`sudo yum install -y amazon-efs-utils` 実行（EFS操作ユーティリティのインストール）
⇒`Complete!`と出力されること

```bash

[root@AZ-a-test ~]# sudo yum install -y amazon-efs-utils
Installed:
  amazon-efs-utils.noarch 0:1.25-3.amzn2

Dependency Installed:
  stunnel.x86_64 0:4.56-6.amzn2.0.3

Complete!
```

マウント用のディレクトリ（対象ディレクトリは任意です）を作成します
`mkdir /mnt/efs`  実行

```bash

[root@AZ-a-test ~]# mkdir /mnt/efs
```

マウント実行します
`mount -t efs <ファイルシステムID（※）>:/ /mnt/efs` 実行（EFSの場合ファイルシステムタイプの指定がEFSになるようです）
※EFSファイルシステムの一覧画面上から確認可能です。

```

[root@AZ-a-test ~]# mount -t efs fs-74444555:/ /mnt/efs
[root@AZ-a-test ~]#
```

正常にマウントされたか確認を行います。
`df-h` 実行
⇒マウントポイントとして指定したディレクトリにEFSファイルシステムがマウントされていること

```bash

[root@AZ-a-test ~]# df -h
Filesystem                                      Size  Used Avail Use% Mounted on
devtmpfs                                        474M     0  474M   0% /dev
tmpfs                                           492M     0  492M   0% /dev/shm
tmpfs                                           492M  460K  492M   1% /run
tmpfs                                           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1                                      8.0G  1.3G  6.8G  16% /
tmpfs                                            99M     0   99M   0% /run/user/1000
tmpfs                                            99M     0   99M   0% /run/user/0
fs-74444555.efs.ap-northeast-1.amazonaws.com:/  8.0E     0  8.0E   0% /mnt/efs
```

###3.動作検証
**①EFSに存在するファイルをEC2サーバ間（複数AZ）で共有可能か検証**
EFSのマウントポイント配下に任意のファイルを作成します（AZ-a上のEC2サーバ）。

```bash

# Az-aに存在するEC上でファイルを作成
[root@AZ-a-test ~]# touch /mnt/efs/test_AZa
```

別AZに存在するEC2サーバ上で、前述した`2.EFSファイルシステムをEC2にマウントする`を再度実行し、
EFSファイルシステムをマウントしてください。

別AZ上に存在するEC2サーバ上でEFSファイルシステムのマウントポイント配下を確認します。
⇒前手順で作成されたファイルが表示されればOKです！

```bash

# Az-cに存在するEC2上でも、他AZ上のEC2サーバで作成されたファイルが共有できている
[root@AZ-c-test ~]# ll /mnt/efs/
total 4
-rw-r--r-- 1 root root 0 Jun 20 03:22 test_AZa
[root@AZ-c-test ~]#
```

**②EFSの自動拡張を検証**
EFSファイルシステム初期構築時点では、サイズは12kiBでした。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/f1203dc2-c458-cb9b-c964-e2cf8affe9a5.png)

そこで10MBのファイルをEC2上で作成してみます。
まず、マウントポイントへ移動

```bash

[root@AZ-c-test ~]# cd /mnt/efs/
```

`dd if=/dev/zero of=test10M bs=1M count=10` を実行し、10MBのファイルを作成します。

```bash

[root@AZ-c-test efs]# dd if=/dev/zero of=test10M bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.271142 s, 38.7 MB/s
```

数分後、EFSファイルシステムのサイズが10MBまで自動拡張されていることを確認出来ました！
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/35a1f133-2121-603a-cf8f-e28cca904be7.png)

##参考記事
手順途中でも掲載しましたが、以下の記事ではより詳細にEFSの仕様をまとめられています。

**Amazon Elastic File System（EFS）を使ううえでの勘所**
https://qiita.com/taichimachima/items/f7d47b68aac2a11ea7cc