はじめに
Amazon EFS
(Elastic File System)は、複数のEC2インスタンスから同時にアクセス可能なマネージドNFSファイルシステムである。
今回は、EC2インスタンス2台を用意し、EFSを使用してファイル共有を行う設定と動作確認を試してみる。
EFSの主な特徴
- 複数のEC2インスタンスから同時アクセス可能
- 自動的にスケールアップ・ダウン
- 高可用性と高耐久性
- POSIX準拠のファイルシステム
手順
- アマゾン EC2 Linux インスタンスでの アマゾン EFS の使用
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AmazonEFS.html
上記手順では、EC2
インスタンスを作成時にEFS
の設定もしているが、
今回の手順では、EC2
インスタンスを作成後に後付けでEFS
をマウントする形とする。
前提条件
- AWSアカウントがあること
- AWS CLIまたはマネジメントコンソールへのアクセス
環境
AWS EC2(Amazon Linux 2023) × 2台
Amazon EFS
VPC(デフォルトVPC)
セキュリティグループ
準備
EC2のインスタンスの作成
EC2インスタンスの構築
今回はテスト用に作成をしておく。
1台目
項目 | 設定値 |
---|---|
名前 | test-ec2-01 |
OS | AmazonLinux2023 AMI |
アーキテクチャ | 64ビット(Arm) |
インスタンスタイプ | t4g.nano |
キーペア | test-ec2-key-pair |
セキュリティグループ | ec2-security-group |
ストレージ | 8GB (gp3) |
2台目
項目 | 設定値 |
---|---|
名前 | test-ec2-02 |
OS | AmazonLinux2023 AMI |
アーキテクチャ | 64ビット(Arm) |
インスタンスタイプ | t4g.nano |
キーペア | test-ec2-key-pair |
セキュリティグループ | ec2-security-group |
ストレージ | 8GB (gp3) |
作成後

構築手順
EFSの作成
1. AWSコンソールより、「EFS
」サービスを選択する

2. ナビゲーションペインの「ファイルシステム」を選択し、「ファイルシステムの作成」を選択する

3. 名前を入力し、VPCをEC2があるVPCと同じものを選択して作成をする
※今回はデフォルトVPCに作成をしている。


EFS用のセキュリティグループの作成/設定
NFSトラフィック(ポート2049)を許可する設定が必要となるため、EFS用のセキュリティグループを作成する。
1. セキュリティグループの作成を選択

2. インバウンドルールにNFSを設定し、ソースを作成したEC2のセキュリティグループを設定する

3. 作成したセキュリティグループをEFSにアタッチする
EFS→作成したEFSを選択→ネットワーク→管理

EC2側でEFSをマウントする
両方のEC2インスタンスにSSHで接続し、EFSをマウントする。
設定の確認
EFSのIDを確認しておく
対象のEFSを選択→「アタッチ」を選択する。

今回は「EFS マウントヘルパーの使用」のコマンドを確認しておく。

インスタンス1, インスタンス2での作業
[EFSの識別子]
には作成したEFSの識別子を入れること
# EFSユーティリティのインストール
sudo dnf update -y
sudo dnf install -y amazon-efs-utils
# マウントポイントの作成
sudo mkdir -p /mnt/efs
# EFSのマウント
sudo mount -t efs -o tls [EFSの識別子]:/ /mnt/efs
# セキュリティグループが正しく設定できていないとここで timeoutになる。
# 自動マウントの設定
echo '[EFSの識別子].efs.ap-northeast-1.amazonaws.com:/ /mnt/efs efs defaults,_netdev' | sudo tee -a /etc/fstab
# 自動マウント設定確認
## アンマウントしてマウントする
sudo umount /mnt/efs
sudo mount -a
セキュリティグループの問題でタイムアウトになった例
[ec2-user@ip-172-31-41-123 ~]$ sudo mount -t efs -o tls fs-03b384f05b91b0a35:/ /mnt/efs
Mount attempt 1/3 failed due to timeout after 15 sec, wait 0 sec before next attempt.
Mount attempt 2/3 failed due to timeout after 15 sec, wait 0 sec before next attempt.
b'mount.nfs4: Connection timed out'
動作検証
1. マウント状態の確認
両方のインスタンスでEFSが正常にマウントされていることを確認する。
# マウント状態の確認
df -h | grep efs
mount | grep efs
# EFSファイルシステムの詳細情報
ls -la /mnt/efs

2. ファイル作成・読み取りテスト
インスタンス1でファイルを作成
# インスタンス1でテストファイルを作成
sudo touch /mnt/efs/test-file-from-instance1.txt
echo "Hello from EC2 Instance 1" | sudo tee /mnt/efs/test-file-from-instance1.txt
# ディレクトリも作成
sudo mkdir -p /mnt/efs/shared-directory
echo "Shared content from Instance 1" | sudo tee /mnt/efs/shared-directory/shared-file.txt
インスタンス2で読み取り・書き込みテスト
# インスタンス2でファイルの存在確認
ls -la /mnt/efs/
cat /mnt/efs/test-file-from-instance1.txt
# インスタンス2からファイルを追記
echo "Added content from EC2 Instance 2" | sudo tee -a /mnt/efs/test-file-from-instance1.txt
# 新しいファイルを作成
echo "Hello from EC2 Instance 2" | sudo tee /mnt/efs/test-file-from-instance2.txt
インスタンス1で変更確認
# インスタンス1で変更内容を確認
cat /mnt/efs/test-file-from-instance1.txt
ls -la /mnt/efs/
cat /mnt/efs/test-file-from-instance2.txt
問題なし!

3. 同時書き込みテスト
両方のインスタンスから同時にファイルに書き込みを行い、データの整合性を確認する。
インスタンス1での同時書き込みテスト
# インスタンス1で連続書き込み
for i in {1..10}; do
echo "Instance1-Line$i-$(date)" | sudo tee -a /mnt/efs/concurrent-test.txt
sleep 1
done
インスタンス2での同時書き込みテスト
# インスタンス2で連続書き込み(同時実行)
for i in {1..10}; do
echo "Instance2-Line$i-$(date)" | sudo tee -a /mnt/efs/concurrent-test.txt
sleep 1
done
結果確認
# 両方のインスタンスから結果を確認
cat /mnt/efs/concurrent-test.txt | wc -l
cat /mnt/efs/concurrent-test.txt

4. パフォーマンステスト
大きなファイルの読み書き性能を測定する。
# 書き込み性能テスト
time sudo dd if=/dev/zero of=/mnt/efs/test-write.dat bs=1M count=100
# 読み取り性能テスト
time sudo dd if=/mnt/efs/test-write.dat of=/dev/null bs=1M
# ファイルサイズ確認
ls -lh /mnt/efs/test-write.dat

トラブルシューティング (Generated By Claude Sonnet4)
EFSの設定や運用で発生しやすい問題とその解決方法を以下にまとめる。
1. マウントに関する問題
問題: マウント時にタイムアウトが発生する
Mount attempt 1/3 failed due to timeout after 15 sec, wait 0 sec before next attempt.
mount.nfs4: Connection timed out
原因
- セキュリティグループの設定不備
- NFS(ポート2049)の通信が許可されていない
- ネットワークACLの制限
解決方法
セキュリティグループでNFS(ポート2049)がEC2のセキュリティグループから許可されているか確認する。
問題: “No such device” エラーが発生する
mount.nfs4: No such device
原因
amazon-efs-utils
がインストールされていない- EFSのファイルシステムIDが間違っている
解決方法
# amazon-efs-utilsのインストール確認
rpm -qa | grep amazon-efs-utils
# インストールされていない場合
sudo dnf install -y amazon-efs-utils
# EFSファイルシステムIDの確認
aws efs describe-file-systems --query 'FileSystems[*].[FileSystemId,Name]'
問題: DNS解決に失敗する
mount.nfs4: Name or service not known
原因
- DNS設定に問題がある
- VPCのDNS解決が無効になっている
解決方法
# DNS解決の確認
nslookup fs-xxxxxxxxx.efs.ap-northeast-1.amazonaws.com
# VPCのDNS設定確認
aws ec2 describe-vpcs --vpc-ids vpc-xxxxxxxxx \
--query 'Vpcs[0].[EnableDnsHostnames,EnableDnsSupport]'
# 手動でIPアドレスを指定してマウント
sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576 \
[EFSのIPアドレス]:/ /mnt/efs
2. パフォーマンスに関する問題
問題: 読み書き速度が極端に遅い
原因
- 汎用パフォーマンスモードの制限
- スループットモードの設定不適切
- 小さなファイルの大量アクセス
解決方法
# EFSのパフォーマンス設定確認
aws efs describe-file-systems --file-system-id fs-xxxxxxxxx \
--query 'FileSystems[0].[PerformanceMode,ThroughputMode]'
# Max I/Oパフォーマンスモードに変更(作成時のみ)
aws efs create-file-system \
--creation-token new-efs-token \
--performance-mode maxIO
# プロビジョンドスループットモードに変更
aws efs modify-file-system \
--file-system-id fs-xxxxxxxxx \
--throughput-mode provisioned \
--provisioned-throughput-in-mibps 500
問題: レイテンシが高い
原因
- 異なるアベイラビリティゾーン間でのアクセス
- ネットワーク最適化不足
解決方法
# 同一AZ内でのマウントターゲット使用
# EC2のAZ確認
aws ec2 describe-instances --instance-ids i-xxxxxxxxx \
--query 'Reservations[0].Instances[0].Placement.AvailabilityZone'
# EFSマウントターゲットのAZ確認
aws efs describe-mount-targets --file-system-id fs-xxxxxxxxx \
--query 'MountTargets[*].[AvailabilityZone,IpAddress]'
# 最適化されたマウントオプションの使用
sudo mount -t efs -o tls,fsc,regional fs-xxxxxxxxx:/ /mnt/efs
3. 権限に関する問題
問題: ファイルの作成・編集ができない
touch: cannot touch '/mnt/efs/test.txt': Permission denied
原因
- マウントポイントの所有者・権限設定
- EFSのアクセスポイント設定
解決方法
# マウントポイントの権限確認
ls -ld /mnt/efs
# 権限の変更
sudo chown ec2-user:ec2-user /mnt/efs
sudo chmod 755 /mnt/efs
# EFSルートディレクトリの権限設定
sudo chmod 777 /mnt/efs
問題: 異なるユーザー間でファイル共有ができない
原因
- UID/GIDの不一致
- umaskの設定
解決方法
# ユーザーIDの確認
id ec2-user
# 共有用グループの作成
sudo groupadd efsusers
sudo usermod -a -G efsusers ec2-user
# setgidビットの設定
sudo chmod g+s /mnt/efs
sudo chgrp efsusers /mnt/efs
4. 自動マウントに関する問題
問題: 再起動後にEFSがマウントされない
原因
- /etc/fstabの設定ミス
- ネットワークの初期化タイミング
解決方法
# fstabエントリの確認
cat /etc/fstab | grep efs
# 正しいfstabエントリの設定
echo 'fs-xxxxxxxxx.efs.ap-northeast-1.amazonaws.com:/ /mnt/efs efs defaults,_netdev,tls' | sudo tee -a /etc/fstab
# 自動マウントのテスト
sudo umount /mnt/efs
sudo mount -a
# systemdサービスでの確実な自動マウント
sudo systemctl enable efs-mount.service
問題: EFS Utilsが起動時に動作しない
解決方法
# amazon-efs-utilsサービスの確認
sudo systemctl status amazon-efs-mount-watchdog
# サービスの有効化
sudo systemctl enable amazon-efs-mount-watchdog
sudo systemctl start amazon-efs-mount-watchdog
5. セキュリティに関する問題
問題: 暗号化されていないEFSからの移行
解決方法
- 新しい暗号化EFSの作成
- データの移行
問題: アクセス制御の不備
解決方法
- EFSアクセスポイントの作成
6. コストに関する問題
問題: 予想以上に料金が高い
原因
- 不要なファイルの蓄積
- Provisioned Throughputの過剰設定
解決方法
- ストレージ使用量の確認
- Infrequent Accessストレージクラスの設定
- 不要ファイルの検索・削除
7. 監視・ログに関する問題
問題: EFSアクセスの監視ができない
解決方法
- CloudWatch Logsの設定
- EFS Performance Monitoringの有効化
8. バックアップに関する問題
問題: EFSのバックアップが取得できない
解決方法
- EFS Backupの有効化
- 手動バックアップの作成
参考
Amazon Elastic File Systemとは
https://docs.aws.amazon.com/ja_jp/efs/latest/ug/whatisefs.htmlAmazon EFSの料金表
https://aws.amazon.com/jp/efs/pricing/Amazon EFS のパフォーマンス仕様
https://docs.aws.amazon.com/ja_jp/efs/latest/ug/performance.htmlマウントの問題のトラブルシューティング
https://docs.aws.amazon.com/ja_jp/efs/latest/ug/troubleshooting-efs-mounting.htmlアマゾン EC2 Linux インスタンスでの アマゾン EFS の使用
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AmazonEFS.html既存の EC2 Linux インスタンスでの自動マウントの有効化
https://docs.aws.amazon.com/ja_jp/efs/latest/ug/mount-fs-auto-mount-update-fstab.html
おわりに
EFS
の存在自体は知っていたが使ったことがなかったので使用してみた。EC2
間でのファイル共有というと、EFS
とかS3
などのオブジェクトストレージをマウントするという方法がある。
また、EBS
もマルチアタッチができるみたいで、ファイル共有という観点では変わらなくないかと思ったが、EFS
の方は高可用性をウリにしているので、恐らくMultiAZの部分が違うのだと思っている。
このあたりの違いは今度調べてみよう。
次回はEBS
のマルチアタッチなど試してみたい。
以下の記事をさらっと読んでみたが、
- マルチアタッチを使用して EBS ボリュームを複数の EC2 インスタンスへアタッチ
https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/ebs-volumes-multi.html
XFS や EXT4 などの標準ファイルシステムは、EC2 インスタンスなどの複数のサーバーから同時にアクセスできるように設計されていません。本稼働ワークロードのデータに対し復元性と信頼性を確保するには、クラスター化されたファイルシステムを使用する必要があります。
とあるので、マルチアタッチを想定していないEBS
をマルチアタッチにしてもファイルシステムとか考慮しなおしって感じで思った通りには使えなさそうだ。