EFSのサブディレクトリにEC2をマウントさせる

# はじめに
EFSのサブディレクトリに対して、マウントする方法の参考記事が見当たらなかったため、手順をまとめます。
今回は、[この記事を参考に](https://qiita.com/holdout0521/items/8681d7a478db82f6b1e8)**EC2をFTPサーバー構築**しておりますので、EC2とEFSをマウント後、**ローカルからEFSに対してファイル転送が可能**です。

FTPサーバーではなく、単なるEC2でもこれから説明する手順は使えます。

下図で言いますと、EFSのルートディレクトリではなく**/uploadsディレクトリを作成し、/uploads配下**に対して、**EC2の/mnt/efs配下**をマウントさせます。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/8edb582a-5ef3-438f-974c-289e31013766.png">




# 事前準備
・EC2を事前に設置し、ssh接続できることを確認
インターネットゲートウェイやサブネットも作成済み
[こちらを参考にしました](https://qiita.com/MayForBlue/items/c96674fb6aac5852a978)
・[FTPサーバー構築](https://qiita.com/holdout0521/items/8681d7a478db82f6b1e8)(なくても可)

# 流れ
①EFSを作成
②EC2のマウントポイントの作成
③EFSのサブディレクトリ/uploadsに対してマウントさせる
④自動マウント設定

# EFSを作成

AWSのEC2のコンソール画面からセキュリティーグループを以下の通り、作成します。
インバウンド設定
・Typeは`NFS`
・ポートは`2049`
・Sourceは`カスタム + EC2のセキュリティーグループ`
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/6bc24c89-6424-11f1-5d29-5e053c1466c2.png">

AWSのEFSのコンソール画面から、EC2と同じVPCを選択して作成します。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/acf9f06a-00d3-5630-9f0e-5d795897d636.png">


ネットワークタブの**管理**をクリックし、セキュリティーグループを先程作成したセキュリティーグループに変更します。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/e87a5d84-cbce-1c36-ad64-036730b61ae9.png">




# EC2のマウントポイントの作成

まずEC2にSSH接続します

```
$ ssh -i ~/.ssh/ec2-key.pem ec2-user@✕✕.✕✕✕.✕✕✕.✕✕
```
[詳しい方法はこちら](https://qiita.com/holdout0521/items/7010ab2401c813d67d0f#ssh%E6%8E%A5%E7%B6%9A%E6%96%B9%E6%B3%95)

アップデート実行

```
$ sudo yum update -y
```
Amazon EFS マウントヘルパーのインストール

```
$ sudo yum install -y amazon-efs-utils
```
EFSのマウントポイント/mnt/efsを作成

```
$ sudo mkdir /mnt/efs
```

# EFSのサブディレクトリ/uploadsに対してマウントさせる

まず、マウントコマンドの説明をします。
マウントポイントにEFSのルートディレクトリ`/`をマウントするには以下のコマンドでできます。

```
# 転送時にデータの暗号化を使用する場合
$ sudo mount -t efs -o tls [File System ID]:/ [マウントポイント]

# 転送時にデータの暗号化を使用しない場合
$ sudo mount -t efs [File System ID]:/ [マウントポイント]
```
[File System ID]は、EFSコンソールの名前の横にあります`fs-`から始まるIDです
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/68c1dd4b-31e9-64f2-1c70-a98c6ac243bc.png">

対して、EFSのルートディレクトリ`/uploads`をマウントするには以下のコマンドでできます。

```
$ sudo mount -t efs -o tls [File System ID]:/uploads [マウントポイント]
```
以下の流れで進めていきます。
①親ディレクトリ`/`でマウントする
②サブディレクトリ`/uploads`ディレクトリを作成
③`/`のマウントを解除し、`efs`ディレクトリを削除
④`efs`ディレクトリを作成し、サブディレクトリ`/uploads`でマウントする

①親ディレクトリである`/`に対してマウントします。

```
$ cd /mnt

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         482M     0  482M    0% /dev
tmpfs            492M     0  492M    0% /dev/shm
tmpfs            492M  492K  492M    1% /run
tmpfs            492M     0  492M    0% /sys/fs/cgroup
/dev/xvda1       8.0G  1.7G  6.4G   21% /
tmpfs             99M     0   99M    0% /run/user/1000

$ sudo mount -t efs -o tls fs-7f6cf55f:/ /mnt/efs

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         482M     0  482M    0% /dev
tmpfs            492M     0  492M    0% /dev/shm
tmpfs            492M  496K  492M    1% /run
tmpfs            492M     0  492M    0% /sys/fs/cgroup
/dev/xvda1       8.0G  1.7G  6.4G   21% /
tmpfs             99M     0   99M    0% /run/user/1000
127.0.0.1:/      8.0E     0  8.0E    0% /mnt/efs
```
`127.0.0.1:/      8.0E     0  8.0E    0% /mnt/efs`の行からマウントできていることが分かります。

②サブディレクトリ`/uploads`ディレクトリを作成

```
$ cd /mnt/efs
$ sudo mkdir uploads
```

③`/`のマウントを解除し、`efs`ディレクトリを削除

```
$ cd /mnt
$ sudo umount -l efs
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         482M     0  482M    0% /dev
tmpfs            492M     0  492M    0% /dev/shm
tmpfs            492M  548K  492M    1% /run
tmpfs            492M     0  492M    0% /sys/fs/cgroup
/dev/xvda1       8.0G  1.7G  6.4G   21% /
tmpfs             99M     0   99M    0% /run/user/1000
tmpfs             99M     0   99M    0% /run/user/0

$ sudo rm -r efs
```

④`efs`ディレクトリを作成し、サブディレクトリ`/uploads`でマウントする

```
$ cd /mnt
$ sudo mkdir efs
$ sudo mount -t efs -o tls fs-7f6cf55f:/uploads /mnt/efs
$ df -h
ファイルシス       サイズ  使用  残り 使用% マウント位置
省略
127.0.0.1:/uploads   8.0E     0  8.0E    0% /mnt/efs
```
EC2の`/mnt/efs`配下がEFSの`/uploads`配下にマウントできました。


# 自動マウント設定
今のままだと、EC2が停止するとマウントが消されるため、自動マウント設定をします。
AmazonLinuxにEFSボリュームを自動マウントさせるためには、`/etc/fstab`を修正する必要がある。
まず、`etc/fstab`ファイルをバックアップします。

```
$ ll /etc | grep fstab
-rw-r--r--  1 root root       91  8月 24 19:07 fstab

$ sudo cp -p /etc/fstab /etc/fstab_`date +'%Y%m%d'`

$ ll /etc | grep fstab
-rw-r--r--  1 root root       91  8月 24 19:07 fstab
-rw-r--r--  1 root root       91  8月 24 19:07 fstab_20211002
```
マウント設定ファイル（/etc/fstab）に以下の内容を追記します。
`[アベイラビリティゾーン].[EFSのDNS Name]:/ [マウントポイント] nfs4 defaults 0 0`

`[EFSのDNS Name]`は、EFSコンソールのアタッチをクリックすると、`NFSクライアント使用`に**記載されている赤文字部分**です。
以下の場合、`fs-7f6cf55f.efs.ap-northeast-1.amazonaws.com`の部分です。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/58c336e4-c214-597a-d5dc-3e191866d061.png">


```
$ cat /etc/fstab
#
UUID=55ee5a5f-d155-47e0-9121-e6f4522cb2bf   /  xfs  defaults,noatime  1   1

```

```
$ sudo vim /etc/fstab
#
UUID=55ee5a5f-d155-47e0-9121-e6f4522cb2bf   /  xfs  defaults,noatime  1   1
fs-7f6cf55f.efs.ap-northeast-1.amazonaws.com:/uploads /mnt/efs nfs4 defaults 0 0

```


自動マウントできているか確認するため、再起動します。

```
$ sudo reboot
```
再度ssh接続して、マウントされていることを確認します。

```
$ df -Ph
省略
fs-7f6cf55f.efs.ap-northeast-1.amazonaws.com:/uploads 8.0E  0  8.0E  0%　/mnt/efs
```


#参考
[【AWS】EFSボリュームの自動マウント設定(AmazonLinux)](https://qiita.com/satton6987/items/db79272a5ce9fb5706dd)
[Amazon Elastic File System（Amazon EFS）に触ってみた](https://qiita.com/shogo_m/items/d7d844a5da4df2732bdf)