Amazon EFS を AWS Fargate (のタスク）にマウントする最低限の設定

# 1. 概要
* Amazon EFS のルートディレクトリ（/）を、AWS Fargate (プラットフォームバージョン 1.4.0）から起動したタスクの /efs にマウントする。
* 動作確認のために、タスクから df コマンドの標準出力を、 /efs/df.txt へリダイレクトする。
* 確認用 EC2 から /efs/df.txt を表示する。


# 2. 構成図
![20200612-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/a7910202-b3df-14a2-efe3-3907416a33ea.png)


# 3. 設定手順概要
(1) タスクと確認用EC2用のセキュリティグループ（Security Group A）を作成する
(2) EFS用のセキュリティグループ（Security Group B）を作成する
(3) EFS のファイルシステムと、マウントターゲットを作成する
(4) 確認用EC2を作成して、EFS を EC2 にマウントする
(5) Docker イメージを作成して、ECR に PUSH する
(6) Amazon ECS タスク定義を作成する
(7) AWS Fargate (プラットフォームバージョン 1.4.0）で タスク を実行する

# 4. 設定具体例
##### (1) タスクと確認用EC2用のセキュリティグループ（Security Group A）を作成する
* 作業用PCからのSSH接続を許可する。

##### (2) EFS用のセキュリティグループ（Security Group B）を作成する
* インバウンド設定で、Security Group A からの 2049 (NFS) 接続を許可する。

##### (3) EFS のファイルシステムと、マウントターゲットを作成する
* 設定例（注意点は特に無い）
![20200612.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/136c7019-c1af-b087-80bc-b4b2351e2c22.png)

##### (4) 確認用EC2を作成して、EFS を EC2 にマウントする
* Amazon Linux を適当に作成
* EFS マウント設定

```bash:Bash
# yum install amazon-efs-utils
# mount -t efs fs-******** /mnt
# df
Filesystem                                            1K-blocks    Used        Available Use% Mounted on
devtmpfs                                                 480444      72           480372   1% /dev
tmpfs                                                    491128       0           491128   0% /dev/shm
/dev/nvme0n1p1                                          8189348 1174932          6914168  15% /
fs-********.efs.ap-northeast-1.amazonaws.com:/ 9007199254739968       0 9007199254739968   0% /mnt
```

##### (5) Docker イメージを作成して、ECR に PUSH する
* Dockerfile
 * イメージは何でもOK（のはず）。とりあえず、alpine:latest と amazonlinux:2 は動作確認済み。
 * マウントポイント /efs を作成する
 * echo "df" は、動作確認のために実行ログを CloudWatch ログへ出力するため。
 * df コマンドの標準出力を、 /efs/df.txt へリダイレクトする。

```Dockerfile:Dockerfile
FROM alpine:latest
RUN mkdir /efs
CMD echo "df" && df > /efs/df.txt
```

```bash:Bash
# docker build -t test-repository:test-efs-fargate .
# docker tag test-repository:test-efs-fargate ************.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository:test-efs-fargate
# aws ecr get-login --no-include-email | sh
# docker push ************.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository:test-efs-fargate
```

##### (6) Amazon ECS タスク定義を作成する
* 起動タイプ「FARGATE」を選択
![20200612-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/d13ce046-32dd-0f83-79ee-3a02e4baebde.png)

* タスクとコンテナの定義の設定
 * タスク定義名：適当に (test-efs-fargate)
 * タスクロール：指定しない
![20200612-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/890471c8-0b63-e07c-2ccf-a6fc7d88ae43.png)

* タスク実行ロール
 * デフォルト (ecsTaskExecutionRole
![20200612-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/6a1a92f0-b67d-38b6-d715-2cea26a77b79.png)

* タスクサイズ
 * タスクメモリ (GB)：0.5GB
 * タスク CPU (vCPU)：0.25 vCPU
![20200612-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/b3959ec8-f643-7a97-2d28-74e1aa0af609.png)

* ボリューム（コンテナの定義の前に設定を行う）
 * 名前：適当に(test-efs)
 * ボリュームタイム：EFS
 * ファイルシステムID：fs-********
 * ルートディレクトリ：/
![20200612-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/0c12df28-9598-e7a8-a34d-8b27c24aba44.png)<br />↓<br />
![20200612-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/5bab78c1-702a-8a54-5616-4299c7f9d2b3.png)

* コンテナの追加
 * コンテナ名：適当に (test-efs-fargate)
 * イメージ：************.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository:test-efs-fargate
![20200612-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/90992950-f3d5-6c97-323c-133c47ca0829.png)<br />↓<br />
 * ストレージとログ（<font color="red">ここでタスクのマウントポイントを設定する</font>）
     * マウントポイント ソースボリューム：test-efs を選択
     * コンテナパス：/efs
![20200612-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/6e88ce8b-efa3-37a8-b4e4-2df6c7a55ec3.png)<br />↓<br />
　* 以上の設定でタスク定義を作成する
 

##### (7) AWS Fargate (プラットフォームバージョン 1.4.0）で タスク を実行する
* クラスターの作成
![20200612-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/c0249491-f3c0-493f-576e-5138e78c0de3.png)<br />↓<br />
 * クラスターテンプレート：AWS Fargate を使用
![20200612-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/0c3b895c-e662-d7d0-b7cc-334edbd5ac39.png)<br />↓<br />
 * クラスター名：適当に（test-efs-fargate）
![20200612-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/d716ccf2-466e-aa4e-d740-8871042ae0b1.png)<br />↓<br />
 * 以上の設定でクラスターを作成する

* タスクの実行
 * タスク定義「test-efs-fargate」を選択して、アクションから「タスクの実行」を選択する
![20200612-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/3731c76b-3c82-3cd3-88d3-6d32b1ac1756.png)<br />↓<br />
 * 起動タイプ：FARGATE
 * プラットフォームのバージョン：<font color="red">1.4.0</font>
 * クラスター：test-efs-fargate
 * クラスターVPC：構成図のVPC
 * サブネット：構成図のサブネット
 * セキュリティグループ：Security Group A<br />
![20200612-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/cb146fbf-095b-3b60-f945-753a99ad5c13.png)

* タスク実行ステータス
![20200612-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/a20dbca4-49b6-5449-1aa0-25ba163ac91e.png)

* CloudWatch ログで実行結果を確認
![20200612-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148868/b0ba14d1-0964-12f3-1d0b-1b0c24f88308.png)


# 5. 実行結果（動作確認）
* 確認用EC2から /mnt/df.txt を確認する

```bash:BASH
[root@ip-10-1-0-121 ~]# cat /mnt/df.txt
Filesystem           1K-blocks      Used Available Use% Mounted on
overlay               25671908   5165020  19179784  21% /
tmpfs                    65536         0     65536   0% /dev
shm                    2018796         0   2018796   0% /dev/shm
tmpfs                  2018796         0   2018796   0% /sys/fs/cgroup
fs-d14344f0.efs.ap-northeast-1.amazonaws.com:/
                     9007199254739968         0 9007199254739968   0% /efs
/dev/xvdcz            25671908   5165020  19179784  21% /etc/hosts
/dev/xvdcz            25671908   5165020  19179784  21% /etc/resolv.conf
/dev/xvdcz            25671908   5165020  19179784  21% /etc/hostname
tmpfs                  2018796         0   2018796   0% /proc/acpi
tmpfs                    65536         0     65536   0% /proc/kcore
tmpfs                    65536         0     65536   0% /proc/keys
tmpfs                    65536         0     65536   0% /proc/latency_stats
tmpfs                    65536         0     65536   0% /proc/timer_list
tmpfs                    65536         0     65536   0% /proc/sched_debug
tmpfs                  2018796         0   2018796   0% /sys/firmware
tmpfs                  2018796         0   2018796   0% /proc/scsi
```
↑
EFSファイルシステムに df.txt ファイルが作成されていることを確認。
EFS ファイルシステムが タスクの /efs にマウントされている（されていた）ことを確認<font color="red">
fs-d14344f0.efs.ap-northeast-1.amazonaws.com:/
                     9007199254739968         0 9007199254739968   0% /efs
</font>