EC2 2台間でEFSを使用してファイル共有を試してみる

はじめに

Amazon EFS(Elastic File System)は、複数のEC2インスタンスから同時にアクセス可能なマネージドNFSファイルシステムである。
今回は、EC2インスタンス2台を用意し、EFSを使用してファイル共有を行う設定と動作確認を試してみる。

EFSの主な特徴

  • 複数のEC2インスタンスから同時アクセス可能
  • 自動的にスケールアップ・ダウン
  • 高可用性と高耐久性
  • POSIX準拠のファイルシステム

手順

上記手順では、EC2インスタンスを作成時にEFSの設定もしているが、 今回の手順では、EC2インスタンスを作成後に後付けでEFSをマウントする形とする。

前提条件

  • AWSアカウントがあること
  • AWS CLIまたはマネジメントコンソールへのアクセス

環境

AWS EC2(Amazon Linux 2023) × 2台
Amazon EFS
VPC(デフォルトVPC)
セキュリティグループ

準備

EC2のインスタンスの作成

EC2インスタンスの構築

今回はテスト用に作成をしておく。

1台目

項目設定値
名前test-ec2-01
OSAmazonLinux2023 AMI
アーキテクチャ64ビット(Arm)
インスタンスタイプt4g.nano
キーペアtest-ec2-key-pair
セキュリティグループec2-security-group
ストレージ8GB (gp3)

2台目

項目設定値
名前test-ec2-02
OSAmazonLinux2023 AMI
アーキテクチャ64ビット(Arm)
インスタンスタイプt4g.nano
キーペアtest-ec2-key-pair
セキュリティグループec2-security-group
ストレージ8GB (gp3)

作成後

create-ec2-instance-01

構築手順

EFSの作成

1. AWSコンソールより、「EFS」サービスを選択する

create-efs-01

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

create-efs-02

3. 名前を入力し、VPCをEC2があるVPCと同じものを選択して作成をする

※今回はデフォルトVPCに作成をしている。

create-efs-03 create-efs-04

EFS用のセキュリティグループの作成/設定

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

1. セキュリティグループの作成を選択

create-sg-01

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

create-sg-02

3. 作成したセキュリティグループをEFSにアタッチする

EFS→作成したEFSを選択→ネットワーク→管理

change-efs-sg

EC2側でEFSをマウントする

両方のEC2インスタンスにSSHで接続し、EFSをマウントする。

設定の確認

EFSのIDを確認しておく

対象のEFSを選択→「アタッチ」を選択する。

detail-efs-attach-01

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

detail-efs-attach-02

インスタンス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
check-01

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

問題なし!

check-02

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
check-03

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
check-04

トラブルシューティング (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の有効化
  • 手動バックアップの作成

参考

おわりに

EFSの存在自体は知っていたが使ったことがなかったので使用してみた。
EC2間でのファイル共有というと、EFSとかS3などのオブジェクトストレージをマウントするという方法がある。
また、EBSもマルチアタッチができるみたいで、ファイル共有という観点では変わらなくないかと思ったが、EFSの方は高可用性をウリにしているので、恐らくMultiAZの部分が違うのだと思っている。
このあたりの違いは今度調べてみよう。 次回はEBSのマルチアタッチなど試してみたい。

以下の記事をさらっと読んでみたが、

XFS や EXT4 などの標準ファイルシステムは、EC2 インスタンスなどの複数のサーバーから同時にアクセスできるように設計されていません。本稼働ワークロードのデータに対し復元性と信頼性を確保するには、クラスター化されたファイルシステムを使用する必要があります。

とあるので、マルチアタッチを想定していないEBSをマルチアタッチにしてもファイルシステムとか考慮しなおしって感じで思った通りには使えなさそうだ。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。