ECS(Fargate)でEFSをマウントさせてみた(2023年版)

2023.10.12

こんにちは、シマです。
皆さんはECSでEFSを使っていますか?ECS(Fargate)でEFSが利用できるようになったのは2020年4月なのでもう3年半も経過しています。

その間、Fargateもたくさんのアップデートがあったため、上記記事の頃とはAWS管理コンソールの画面も変わっていて、少し迷子になったので改めて記事にしておこうと思います。

今回は、シンプルにEFSの作成と既に構築済みのECS(Fargate)にマウントの設定を追加実装してみました。

構成

今回の構成は以下の通りです。
前述の通り、以下記載の設定の流れでは、既存のECSに対してEFSを追加していきます。

設定の流れ

セキュリティグループ作成

EFSへアタッチするセキュリティグループを作成します。AWS管理コンソールのVPCの画面から「Security groups」を選び「セキュリティグループを作成」を押下します。

任意のセキュリティグループ名、説明を設定し、対象のVPCを選択します。インバウンドルールではタイプはNFSを指定し、ソースはECSのサービスに割り当てるセキュリティグループを指定して作成します。

EFS作成

AWS管理コンソールのEFSの画面から「ファイルシステムの作成」を押下します。

最初に表示される画面は詳細な設定ができないため「カスタマイズ」を押下します。

任意の名前を入力します。また、今回は検証環境なので自動バックアップとライフサイクル管理は無効にします。

対象のVPCを選択し、マウントターゲットを配置するサブネットIDを指定します。セキュリティグループでは先ほど作成したものを指定します。

ファイルシステムポリシーはデフォルトのまま「次へ」を押下し、作成します。

ECS設定変更

AWS管理コンソールのECSの画面から「タスク定義」をクリックし、対象のタスク定義を選択し、「新しいリビジョンの作成」を押下します。

画面下の方にある「ストレージ- オプション」を変更します。「ボリュームの追加」を押下します。

「ボリューム - 1」内の設定値を設定します。ボリュームタイプはEFSを選択し、ボリューム名は任意の名前を設定します。「ファイルシステム ID」は先ほど作成したEFSを指定します。「コンテナマウントポイント」では、対象のコンテナや先ほど設定した「ボリューム - 1」のボリューム名をソースボリュームとして指定します。コンテナパスは「/mnt/efs」として設定しています。

サービスの更新を行い、タスク定義を反映させます。クラスターをクリックし、対象クラスターにある対象サービスを選択し、更新を押下します。

表示される画面から、先ほど作成したリビジョンを指定し、更新します。

動作確認

実際にマウントされたEFSへの書き込みや読み込みを行い動作確認を行います。まず、更新したリビジョンがタスクに反映されていることを確認します。

AWS管理コンソールからCloudShellを開き、以下のコマンドで1つ目のタスクのコンテナへ接続します。

aws ecs execute-command \
    --cluster 【クラスタ名】 \
    --task 【タスクID】 \
    --container 【コンテナ名】 \
    --interactive \
    --command "/bin/bash"

dfコマンドで正しくマウントされていることを確認しました。

bash-5.2# df -h
Filesystem                                               Size  Used Avail Use% Mounted on
overlay                                                   30G  9.7G   19G  35% /
tmpfs                                                     64M     0   64M   0% /dev
shm                                                      1.8G     0  1.8G   0% /dev/shm
tmpfs                                                    1.8G     0  1.8G   0% /sys/fs/cgroup
fs-xxxx.efs.ap-northeast-1.amazonaws.com:/  8.0E     0  8.0E   0% /mnt/efs
/dev/nvme1n1                                              30G  9.7G   19G  35% /etc/hosts
/dev/nvme0n1p1                                           4.9G  2.6G  2.3G  54% /managed-agents/execute-command
tmpfs                                                    1.8G     0  1.8G   0% /proc/acpi
tmpfs                                                    1.8G     0  1.8G   0% /sys/firmware

touchコマンドでEFS内にテストファイルを作成します。

bash-5.2# touch /mnt/efs/test-20231012-01.txt
bash-5.2# ls -l /mnt/efs
total 4
-rw-r--r-- 1 root root 0 Oct 12 00:53 test-20231012-01.txt

exitコマンドでコンテナから抜けて、先ほどと同様の手順でCloudShellから2つ目のタスクのコンテナへ接続し、lsコマンドでファイルを確認します。

bash-5.2# ls -l /mnt/efs
total 4
-rw-r--r-- 1 root root 0 Oct 12 00:53 test-20231012-01.txt

1つ目のタスクのコンテナで作成したテキストファイルが、2つ目のタスクのコンテナから確認できました。

最後に

今回は、EFSの作成とECS(Fargate)にマウントの設定を追加してみました。IaCも良いですが、AWS管理コンソールで色々操作してみると新しい発見があって楽しいですね。

本記事がどなたかのお役に立てれば幸いです。