【AWS】ECS構築の基礎 −EFSとの連携−

#はじめに
今回はECSタスクからEFSへアクセスすることに挑戦してみました。

ECS初心者向けの記事を何本か書いていますので、どれか参考になれば幸いです。

https://qiita.com/suzuki0430/items/2745e9ca0ead8db982f9

https://qiita.com/suzuki0430/items/440daea590b22d1621c8

https://qiita.com/suzuki0430/items/6e4e7f513f982dadbf09

https://qiita.com/suzuki0430/items/7e0ad9903d26dd5f2529

https://qiita.com/suzuki0430/items/8b6e99669a8d4242a5ce

https://qiita.com/suzuki0430/items/271f3f1e4050ebd40525

#ECSでのEFSの使用
ECSでEFSを使用すると、すべてのECSタスクからファイルシステムデータにアクセスできます。
ECSタスク定義でEFSやコンテナマウントポイントを参照すると、ECSが自動的にファイルシステムをコンテナにマウントします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/2edfe969-7963-7e74-97ee-6365c6ab6cf1.png" width="600">

#実装
AZをまたいで起動したタスク間で共有できるようなファイルシステムを構築します。
以下が構築の流れとなります。

- EFS用のセキュリティグループの作成
- EFS(マウントターゲット、アクセスポイント)の作成
- IAMロール`ecsTackRole`の作成
- タスク定義の作成
- サービス作成

##EFS用のセキュリティグループの作成
EC2インスタンスとマウントターゲット間のトラフィックを有効にするために、これらのセキュリティグループに次のルールを設定する必要があります。

- マウントターゲットに関連付けるセキュリティグループは、ファイルシステムをマウントするすべてのEC2インスタンスから、NFSポート上のTCPプロトコルへのインバウンドアクセスを許可
- ファイルシステムをマウントする各EC2インスタンスには、NFSポート上のマウントターゲットへのアウトバウンドアクセスを許可

これらのルールを満たすように、以下のようなセキュリティグループを作成します。
セキュリティグループはEC2にアタッチしているものを選択します。
![スクリーンショット 2021-07-20 22.44.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/8d3e99b5-23d8-0ffa-d0af-74411cd667d9.png)

##EFS(マウントターゲット、アクセスポイント)の作成
EFSを新しく作成します。
![スクリーンショット 2021-07-21 7.08.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/d542c768-a0c8-5aba-09ab-176823b4eacc.png)

EC2をファイルシステムに接続するVPCとマウントターゲットを設定します。
今回は、マウントターゲットを2つのAZに置き、作成したセキュリティグループ`efs-sec-group`を選択します。
![スクリーンショット 2021-07-21 7.09.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/5b463b3a-6bf9-b28e-7179-f511ad8776cd.png)

ポリシーオプションにチェックをつけて、ファイルシステムを作成します。
![スクリーンショット 2021-07-21 7.15.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/143d41f6-6398-fac5-42f1-8950f4b81eef.png)

作成したファイルシステムを開いて、アクセスポイントを新しく作成します。
![スクリーンショット 2021-07-21 7.20.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/0006837d-1d0c-f27c-72a9-653621a65489.png)
![スクリーンショット 2021-07-21 21.42.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/4b2f039b-44e5-a183-1621-d195eca52348.png)
![スクリーンショット 2021-07-21 7.24.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/0f6544ea-a191-0714-6887-782f59711eae.png)

##IAMロール`ecsTaskRole`の作成
IAMロールを新しく作成します。

![スクリーンショット 2021-07-21 7.29.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/d9d36761-434c-282d-1a5e-b106e976e0b2.png)

ポリシーを新しく作成します。
`REGION`には該当リージョン、`ACCOUNT_ID`にはアカウントID(マイアカウントの12桁の数字)、`fs-xxxxxx`にはファイルシステムID、`fsap-xxxxxx`にはアクセスポイントIDを記述します。
![スクリーンショット 2021-07-21 7.31.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/bffcae32-6bce-afef-b0e4-2497172ad393.png)

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:ClientMount",
                "elasticfilesystem:ClientWrite"
            ],
            "Resource": "arn:aws:elasticfilesystem:REGION:ACCOUNT_ID:file-system/fs-xxxxxx",
            "Condition": {
                "StringEquals": {
                    "elasticfilesystem:AccessPointArn": "arn:aws:elasticfilesystem:REGION:ACCOUNT_ID:access-point/fsap-xxxxxxxxxxxxx"
                }
            }
        }
    ]
}
```
最後に名前をつけます。
![スクリーンショット 2021-07-21 7.40.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/2d39cfe6-fc94-8001-817d-c1f5a193a5bf.png)

ロールの作成に戻り、作成したポリシー`efs-share-demo`をアタッチします。
![スクリーンショット 2021-07-21 7.41.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/c152a20e-3b08-bc6a-5066-4dd4770bb719.png)

ロール名をつけます。
![スクリーンショット 2021-07-21 7.42.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/207ccfcd-29b8-f25b-6774-e3384ee4e2dc.png)

##タスク定義の作成
EFSの準備が整ったので、タスク定義を作成します。
EFSとコンテナ(タスク)には以下のような関係があり、タスク定義にはボリュームを追加してあげる必要があります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/75d0e602-90f1-d7d7-aa4d-3af42ffbffa1.png" width="600">

また、今回は`coderaiser/cloudcmd`という、ファイルマネージャのコンテナイメージを使用します。
![スクリーンショット 2021-07-21 21.01.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/83713847-9d20-a07d-c919-4bae8ab2c1f5.png)

`latest-alpine`を使用します。
![スクリーンショット 2021-07-21 21.04.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/3f3b5ba2-cbe9-4809-6c1f-7f1bcebfc736.png)

https://hub.docker.com/r/coderaiser/cloudcmd/

新しくタスク定義を作成します。
![スクリーンショット 2021-07-21 21.07.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/aad9904a-769e-e3b3-20a0-c2aaf200605d.png)

"ボリュームの追加"から作成したEFSを設定します。
![スクリーンショット 2021-07-21 21.51.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/61a156ef-d748-dc42-a553-ff0ba0627ce8.png)


![スクリーンショット 2021-07-21 21.12.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/8530bbec-ec3b-a31f-137d-73ce2f80821b.png)
![スクリーンショット 2021-07-21 21.14.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/7fc28700-11bd-1306-a607-870e2b7dca27.png)

##サービス作成
新しくサービスを作成します。
![スクリーンショット 2021-07-21 21.16.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/5a2a0d17-280c-5274-f831-4177eaa29b82.png)

![スクリーンショット 2021-07-21 21.18.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/c82fbede-fd9a-395f-4a71-cfd9e835302a.png)

![スクリーンショット 2021-07-21 21.20.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/efe84cdd-2ce6-e532-8d2b-1abe339b904c.png)

EC2からロードバランサーを開くと、リスナーID`HTTP:8888`のデフォルトの転送先が確かに`file-explorer-svc`となっています。
![スクリーンショット 2021-07-21 21.22.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/9e123de2-83e4-a527-5e9a-ea51c3c40d39.png)

`[ロードバランサーのDNS名]:8888`で正常に開ければ成功です。
![スクリーンショット 2021-07-22 11.09.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/be4242ff-e3c5-5a36-3d59-6441f2fefca7.png)

試しに`efs-share`ディレクトリに`efs-demo.txt`、ルートディレクトリに`AAA`ディレクトリを作成します。
![スクリーンショット 2021-07-22 11.15.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/24779ea8-0bea-5f5e-8340-bfb8414c7671.png)

ページをロードするとタスクが切り替わるため、`AAA`ディレクトリはなくなりますが、`efs-demo.txt`はそのまま残ります。
このように、タスク間でファイルシステムが共有されます。

#参考資料

https://www.udemy.com/course/aws-ecs-fargate/

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/tutorial-efs-volumes.html

https://docs.aws.amazon.com/ja_jp/efs/latest/ug/accessing-fs-create-security-groups.html