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 ホスト名を確認する」を参照してください。
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 コンソールから [ファイルシステムの作成] をクリックすると、以下のモーダルが表示されます。
マウントターゲットに先ほど作成したマウントターゲット用のセキュリティーグループを指定したいため、ここでは [カスタマイズ] をクリックします。
「ファイルシステムの設定」はデフォルトのままでいきます。
「ネットワークシステム」では、マウントターゲットに先ほど作成したマウントターゲット用のセキュリティーグループを指定します。
「ファイルシステムポリシー」は、今回アクセス制御まではやらないため、特に何も設定しません。
EFS の作成が完了すると、ファイルシステム一覧に表示されるので、「ファイルシステム ID」をメモしておきます。
EC2 インスタンスに Amazon EFS クライアント (amazon-efs-utils) をインストール
EC2 インスタンスに Amazon EFS クライアント (amazon-efs-utils
) をインストールします。
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) を入力します。
cd ~
mkdir efs
sudo mount -t efs file-system-id efs/
df
コマンドで EFS ファイルシステムがマウントされていることを確認します。
$ 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
)を入力します。
file-system-id:/ efs-mount-point efs _netdev,noresvport,tls 0 0
動作確認その 1
マウントポイントとして指定したディレクトリに移動して、ファイルを作成した後、ディレクトリ内を表示して、ファイルが作成されていることを確認できれば成功です。
$ cd ~/efs
$ sudo touch sample.txt
$ ls
sample.txt
因みに、上記のようにファイル作成に sudo
コマンドを使っています。
これは、マウント後にマウントポイントとして指定したディレクトリのパーミッション及び所有者が変わるためです。
ec2-user
でマウントポイントとして作成したディレクトリは作成時は以下のようにパーミッションが 774
で所有者と所有者グループは ec2-user
になっています。
drwxrwxr-x 2 ec2-user ec2-user 6 3月 30 08:25 efs
しかし、sudo
コマンドによるマウント後は、以下のようにパーミッションが 755
で所有者と所有者グループは root
になっています。
drwxr-xr-x 2 root root 6144 3月 30 08:13 efs
そのため、以下のようにマウントポイントして作成したディレクトリに chmod
コマンドで書き込み権限を付与することで sudo
なしでファイル作成などが可能です。
また、この時変更したパーミッションは別の EC2 インスタンスからマウントした時も引き継がれていました。
cd /home/ec2-user/efs
sudo chmod go+w .
mkdir sample.txt
アクセスポイント作成
ここからはアクセスポイントを利用した EFS ファイルシステムのマウントの手順を紹介します。
先に紹介したマウントターゲットを介したマウントと挙動が異なります。
アクセスポイントを使用すると、アクセスポイントを介したすべての操作は指定したユーザー ID 及び グループ ID で実行されます。
また、ファイルシステムに対して別のルートディレクトリを設定でき、このディレクトリまたはそのサブディレクトリ内のデータに対してのみ、アクセスを許可することもできます。
これにより、複雑なファイルパスのマウントや権限の切り分けが容易になります。
アクセスポイントの詳細についてはこちらを参照してください。
まず、アクセスポイントを作成します。
[ユーザー ID] や [グループ ID] は ec2-user
と同じ 1000
にしています。
EC2 インスタンスから EFS ファイルシステムをアクセスポイントを介してマウントする
まず、マウントポイントとなるディレクトリ(/mnt/efs
)を作成し、mount
コマンドを実行して EFS ファイルシステムをマウントします。
file-system-id
には、作成したファイルシステムのファイルシステム ID (例: fs-xxxxxx
) を入力します。
access-point-id
には、作成したアクセスポイントのアクセスポイント ID (例: fsap-xxxxxx
) を入力します。
cd ~
mkdir ap-efs
sudo mount -t efs -o tls,accesspoint=access-point-id file-system-id:/ ap-efs
df
コマンドで EFS ファイルシステムがマウントされていることを確認します。
$ 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
) を入力します。
file-system-id efs-mount-point efs _netdev,tls,accesspoint=access-point-id 0 0
動作確認その 2
マウントポイントとして指定したディレクトリに移動して、ファイルを作成した後、ディレクトリ内を表示して、ファイルが作成されていることを確認できれば成功です。
$ cd ~/ap-efs
$ touch sample.txt
$ ls
sample.txt
先に紹介したマウントターゲットを介したマウント時と違いファイル作成に sudo
コマンドを使っていません。
これは、先ほど紹介したアクセスポイントの特徴の一つである、「アクセスポイントを介したすべての操作は指定したユーザー ID 及び グループ ID で実行されます。」によるものです。
ec2-user
でマウントポイントとして作成したディレクトリは作成時は以下のようにパーミッションが 774
で所有者と所有者グループは ec2-user
になっています。
drwxrwxr-x 2 ec2-user ec2-user 6 3 月 30 08:25 ap-efs
しかし、アクセスポイントを介したマウント後は、以下のようにパーミッションがアクセスポイント作成時の [ルートディレクトリ作成のアクセス許可] で指定した 755
となっています。
また、所有者と所有者グループは [ルートディレクトリ作成のアクセス許可] で指定した ID = 1000
= ec2-user
になっています。
drwxr-xr-x 2 ec2-user ec2-user 6144 3 月 30 14:29 ap-efs
また、作成したファイルの所有者情報を確認してみると、所有者と所有者グループは [POSIX ユーザー] で指定した ID = 1000
= ec2-user
になっているのが確認できます。
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
)を入力します。
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 ホスト名] の利用が有効になっている確認しましょう。
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
個人開発したサービス