EFS を作成して EC2 (Amazon Linux 2) からマウントしてみる

AWS マネジメントコンソールで Amazon EFS を作成して EC2 (Amazon Linux 2) からマウントする手順をまとめました。

完成構成図

完成構成図

EFS を作成して EC2 (Amazon Linux 2) からマウントする際の事前準備

  • EC2 インスタンス(Amazon Linux 2) を作成しておきます。
  • EC2 インスタンスの VPC の [DNS 解決] と [DNS ホスト名] 設定が有効になっている確認して、無効になっている場合は、有効化しておきます。
    以下の EFS のドキュメントに記載されている通り、EFS に接続する EC2 インスタンスの VPC の [DNS 解決] と [DNS ホスト名] の利用が有効になっている必要があります。
    DNS 名を使用して Amazon EC2 にマウントする - Amazon Elastic File System

接続する EC2 インスタンスの VPC で DNS 解決と DNS ホスト名の利用が有効になっている必要があります。詳細については、Amazon VPC ユーザーガイド の「EC2 インスタンスの DNS ホスト名を確認する」を参照してください。

VPC の DNS 設定確認

EFS を作成して EC2 (Amazon Linux 2) からマウントする手順

マウントターゲット用のセキュリティーグループ作成

EFS のドキュメントではマウントターゲットに設定するセキュリティーグループについて以下のように記載しています。

セキュリティグループの作成 - Amazon Elastic File System

ただし、EC2 インスタンスとマウントターゲット (したがって、ファイルシステム) の間のトラフィックを有効にするには、これらのセキュリティグループに次のルールを設定する必要があります。
・マウントターゲットに関連付けるセキュリティグループは、ファイルシステムをマウントするすべての EC2 インスタンスから、NFS ポート上の TCP プロトコルへのインバウンドアクセスを許可する必要があります。
・ファイルシステムをマウントする各 EC2 インスタンスには、NFS ポート上のマウントターゲットへのアウトバウンドアクセスを許可するセキュリティグループが必要です。

上記の記述を参考に以下のようなセキュリティーグループを作成します。

  • インバウンドルール

    タイプ プロトコル ポート範囲 ソース
    NFS TCP 2049 EC2 インスタンスに設定したセキュリティーグループ
  • アウトバンドルール

    • 以下の EFS のドキュメントに記載れているように、デフォルトのアウトバウンドルールを使用し、すべてのトラフィックを許可しておきます。
      セキュリティグループの作成 - Amazon Elastic File System

      デフォルトのアウトバウンドルールですべてのトラフィックを残すことができるため、アウトバウンドルールを追加する必要はありません (それ以外の場合は、アウトバウンドルールを追加して、NFS ポートで TCP 接続を開き、マウントターゲットのセキュリティグループを送信先として識別する必要があります)。

EFS の作成

では、EFS を作成していきます。
EFS コンソールから [ファイルシステムの作成] をクリックすると、以下のモーダルが表示されます。
マウントターゲットに先ほど作成したマウントターゲット用のセキュリティーグループを指定したいため、ここでは [カスタマイズ] をクリックします。

EFS 作成

「ファイルシステムの設定」はデフォルトのままでいきます。

ファイルシステムの設定 1
ファイルシステムの設定 2

「ネットワークシステム」では、マウントターゲットに先ほど作成したマウントターゲット用のセキュリティーグループを指定します。

ネットワークシステム

「ファイルシステムポリシー」は、今回アクセス制御まではやらないため、特に何も設定しません。

ファイルシステムポリシー

EFS の作成が完了すると、ファイルシステム一覧に表示されるので、「ファイルシステム ID」をメモしておきます。

ファイルシステム一覧

EC2 インスタンスに Amazon EFS クライアント (amazon-efs-utils) をインストール

EC2 インスタンスに Amazon EFS クライアント (amazon-efs-utils) をインストールします。

Copied!
sudo yum -y install amazon-efs-utils

amazon-efs-utils は EFS ファイルシステムのマウントが簡素化され、ファイルシステムのパフォーマンスが向上することに加え、転送データを TLS で暗号化できます。
amazon-efs-utils を使用せずともマウントはできますが、以下に記載されている通り、公式で推奨されたツールなので特に理由がなければ、amazon-efs-utils を使うのが良いと思います。

概要 - Amazon Elastic File System

Amazon EFS クライアントには、マウントヘルパーおよび Amazon EFS ファイルシステムの転送時のデータ暗号化の実行を容易にするツールが用意されています。
マウントヘルパーは、特定のタイプのファイルシステムのマウント時に使用するプログラムです。
Amazon EFS ファイルシステムをマウントするために、Amazon EFS に含まれているマウントヘルパーを使用することをお勧めします。

また、以下に記載されている通り、本記事では紹介しませんが、IAM 認証による EFS のマウントを行う場合は amazon-efs-utils を使用する必要があります。

IAM 認証を使用してマウントする - Amazon Elastic File System

AWS Identity and Access Management ()IAM 認証を使用して Linux インスタンスに Amazon EFS ファイルシステムをマウントするには、EFS マウントヘルパーを使用する必要があります。

EC2 インスタンスから EFS ファイルシステムをマウントターゲットを介してマウントする

まず、マウントポイントとなるディレクトリ(efs)を作成し、mount コマンドを実行して EFS ファイルシステムをマウントします。
file-system-id には、作成したファイルシステムのファイルシステム ID (例: fs-xxxxxx) を入力します。

Copied!
cd ~
mkdir efs
sudo mount -t efs file-system-id efs/

df コマンドで EFS ファイルシステムがマウントされていることを確認します。

Copied!
$ df
ファイルシス        1K-ブロック    使用           使用可 使用% マウント位置
devtmpfs                 485344       0           485344    0% /dev
tmpfs                    494336       0           494336    0% /dev/shm
tmpfs                    494336     464           493872    1% /run
tmpfs                    494336       0           494336    0% /sys/fs/cgroup
/dev/xvda1              8376300 1588764          6787536   19% /
tmpfs                     98868       0            98868    0% /run/user/1000
127.0.0.1:/    9007199254739968       0 9007199254739968    0% /home/ec2-user/efs

再起動後にも自動でマウントされるようにするには、/etc/fstab に以下の 1 行を追加してください。
file-system-id には、作成したファイルシステムのファイルシステム ID (例: fs-xxxxxx) を入力します。
efs-mount-point には、マウントポイントとして作成したディレクトリの完全パス(例: /home/ec2-user/efs)を入力します。

Copied!
file-system-id:/ efs-mount-point efs _netdev,noresvport,tls 0 0

動作確認その 1

マウントポイントとして指定したディレクトリに移動して、ファイルを作成した後、ディレクトリ内を表示して、ファイルが作成されていることを確認できれば成功です。

Copied!
$ cd ~/efs
$ sudo touch sample.txt
$ ls
sample.txt

因みに、上記のようにファイル作成に sudo コマンドを使っています。
これは、マウント後にマウントポイントとして指定したディレクトリのパーミッション及び所有者が変わるためです。
ec2-user でマウントポイントとして作成したディレクトリは作成時は以下のようにパーミッションが 774 で所有者と所有者グループは ec2-user になっています。

Copied!
drwxrwxr-x 2 ec2-user ec2-user   6  3月 30 08:25 efs

しかし、sudo コマンドによるマウント後は、以下のようにパーミッションが 755 で所有者と所有者グループは root になっています。

Copied!
drwxr-xr-x 2 root     root     6144  3月 30 08:13 efs

そのため、以下のようにマウントポイントして作成したディレクトリに chmod コマンドで書き込み権限を付与することで sudo なしでファイル作成などが可能です。
また、この時変更したパーミッションは別の EC2 インスタンスからマウントした時も引き継がれていました。

Copied!
cd /home/ec2-user/efs
sudo chmod go+w .
mkdir sample.txt

アクセスポイント作成

ここからはアクセスポイントを利用した EFS ファイルシステムのマウントの手順を紹介します。
先に紹介したマウントターゲットを介したマウントと挙動が異なります。
アクセスポイントを使用すると、アクセスポイントを介したすべての操作は指定したユーザー ID 及び グループ ID で実行されます。
また、ファイルシステムに対して別のルートディレクトリを設定でき、このディレクトリまたはそのサブディレクトリ内のデータに対してのみ、アクセスを許可することもできます。
これにより、複雑なファイルパスのマウントや権限の切り分けが容易になります。
アクセスポイントの詳細についてはこちらを参照してください。

まず、アクセスポイントを作成します。

[ユーザー ID] や [グループ ID] は ec2-user と同じ 1000 にしています。

アクセスポイント作成 1

アクセスポイント作成 2

EC2 インスタンスから EFS ファイルシステムをアクセスポイントを介してマウントする

まず、マウントポイントとなるディレクトリ(/mnt/efs)を作成し、mount コマンドを実行して EFS ファイルシステムをマウントします。
file-system-id には、作成したファイルシステムのファイルシステム ID (例: fs-xxxxxx) を入力します。
access-point-id には、作成したアクセスポイントのアクセスポイント ID (例: fsap-xxxxxx) を入力します。

Copied!
cd ~
mkdir ap-efs
sudo mount -t efs -o tls,accesspoint=access-point-id file-system-id:/ ap-efs

df コマンドで EFS ファイルシステムがマウントされていることを確認します。

Copied!
$ df
ファイルシス        1K-ブロック    使用           使用可 使用% マウント位置
devtmpfs                 485344       0           485344    0% /dev
tmpfs                    494336       0           494336    0% /dev/shm
tmpfs                    494336     464           493872    1% /run
tmpfs                    494336       0           494336    0% /sys/fs/cgroup
/dev/xvda1              8376300 1588764          6787536   19% /
tmpfs                     98868       0            98868    0% /run/user/1000
127.0.0.1:/    9007199254739968       0 9007199254739968    0% /home/ec2-user/ap-efs

再起動後にも自動でマウントされるようにするには、/etc/fstab に以下の 1 行を追加してください。
file-system-id には、作成したファイルシステムのファイルシステム ID (例: fs-xxxxxx) を入力します。
efs-mount-point には、マウントポイントとして作成したディレクトリの完全パス(例: /home/ec2-user/ap-efs)を入力します。
access-point-id には、作成したアクセスポイントのアクセスポイント ID (例: fsap-xxxxxx) を入力します。

Copied!
file-system-id efs-mount-point efs _netdev,tls,accesspoint=access-point-id 0 0

動作確認その 2

マウントポイントとして指定したディレクトリに移動して、ファイルを作成した後、ディレクトリ内を表示して、ファイルが作成されていることを確認できれば成功です。

Copied!
$ cd ~/ap-efs
$ touch sample.txt
$ ls
sample.txt

先に紹介したマウントターゲットを介したマウント時と違いファイル作成に sudo コマンドを使っていません。
これは、先ほど紹介したアクセスポイントの特徴の一つである、「アクセスポイントを介したすべての操作は指定したユーザー ID 及び グループ ID で実行されます。」によるものです。
ec2-user でマウントポイントとして作成したディレクトリは作成時は以下のようにパーミッションが 774 で所有者と所有者グループは ec2-user になっています。

Copied!
drwxrwxr-x 2 ec2-user ec2-user 6 3 月 30 08:25 ap-efs

しかし、アクセスポイントを介したマウント後は、以下のようにパーミッションがアクセスポイント作成時の [ルートディレクトリ作成のアクセス許可] で指定した 755 となっています。
また、所有者と所有者グループは [ルートディレクトリ作成のアクセス許可] で指定した ID = 1000 = ec2-user になっています。

Copied!
drwxr-xr-x 2 ec2-user ec2-user 6144 3 月 30 14:29 ap-efs

また、作成したファイルの所有者情報を確認してみると、所有者と所有者グループは [POSIX ユーザー] で指定した ID = 1000 = ec2-user になっているのが確認できます。

Copied!
ls -la
total 12
drwxr-xr-x 2 ec2-user ec2-user 6144 Mar 30 14:29 .
drwxr-xr-x 20 ec2-user ec2-user 4096 Mar 27 14:43 ..
-rw-rw-r-- 1 ec2-user ec2-user 0 Mar 30 14:29 sample.txt

EFS を作成して EC2 (Amazon Linux 2) からマウントしてみる おまけ

EFS ファイルシステムのアンマウント

マウントした EFS ファイルシステムをアンマウントしたい場合は、umount コマンドを使用します。
efs-mount-point には、マウントポイントとして作成したディレクトリの完全パス(例: /home/ec2-user/ap-efs)を入力します。

Copied!
umount efs-mount-point

「mount: /home/ec2-user/efs: 未知のファイルシステムタイプ 'efs' です.」 というエラーが表示された

Amazon EFS クライアント (amazon-efs-utils) をインストールしていない場合、発生します。
(amazon-efs-utils をインストールしましょう。

「b'mount.nfs4: Connection reset by peer'」 というエラーが表示された

マウントターゲットのセキュリティーグループの設定に問題がある場合に表示されます。
完成構成図で示すマウントターゲットに設定しているセキュリティーグループは EC2 インスタンスからの NFS 通信(ポート番号: 2029)を正しく許可されている必要があります。
そのため、マウントターゲットに設定したセキュリティーグループの設定を確認しましょう。

「Failed to resolve ~ 」 というエラーが表示された

以下のようなエラーが表示された場合、EC2 インスタンスが所属する VPC の DNS 設定に問題がある場合に表示されます。
EFS に接続する EC2 インスタンスの VPC の [DNS 解決] と [DNS ホスト名] の利用が有効になっている確認しましょう。

Copied!
Failed to resolve "fs-xxxxxxxxx.efs.ap-northeast-1.amazonaws.com". The file system mount target ip address cannot be found, please pass mount target ip address via mount options.
User: arn:aws:sts::yyyyyyyyyyyyyy:assumed-role/sample/i-zzzzzzzzzzzzzz is not authorized to perform: elasticfilesystem:DescribeMountTargets on the specified resource