TL;DR
EC2がEFSのポート2049(NFS)に到達できない状態です。十中八九、セキュリティグループが原因です — EFSマウントターゲットのSGが、EC2からのインバウンドNFSを許可していません。ルールを1つ追加するだけで解決します:タイプ: NFS、ポート: 2049、ソース: EC2のセキュリティグループID。以上です。
エラーの症状
$ sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-xxxxxxxx.efs.ap-northeast-1.amazonaws.com:/ /mnt/efs
mount.nfs4: Connection timed out
またはEFSマウントヘルパーを使用した場合:
$ sudo mount -t efs fs-xxxxxxxx:/ /mnt/efs
mount.nfs4: Connection timed out
コマンドは60〜90秒間ハングした後、タイムアウトで終了します。認証エラーも「permission denied」もなく、ただタイムアウトするだけです。これが手がかりです。権限エラーなら即座に拒否されます。タイムアウトはTCP接続がそもそも確立できていないことを意味します。
根本原因
EFSはTCPポート2049でNFSを使用します。mountを実行すると、EC2はマウントターゲットのIPのそのポートへTCP接続を開きます。パス上のどこかでパケットがドロップされると、このタイムアウトが発生します。
原因として多い順に挙げると:
- EFSセキュリティグループにインバウンドNFSルールがない — マウントターゲットのSGが、EC2のSGからのポート2049を許可していない(全体の約80%を占める)
- EC2のAZにマウントターゲットが存在しない — EFSのマウントターゲットはAZごとに作成する必要があります。EC2が
ap-northeast-1cにあるのに、マウントターゲットがap-northeast-1aにしかなければ接続できません - ネットワークACLがトラフィックをブロックしている — NACLがポート2049のインバウンド、またはエフェメラルポート範囲(1024〜65535)のアウトバウンドを拒否している
- 異なるVPC間でピアリングなし — EFSのマウントターゲットはVPCローカルです。VPCをまたいだアクセスには、両側でVPCピアリングの設定が必要です
修正方法:セキュリティグループ(最も可能性が高い)
ステップ1 — EFSマウントターゲットのセキュリティグループを確認する
# ファイルシステムIDとリージョンを実際のものに置き換えてください
aws efs describe-mount-targets \
--file-system-id fs-xxxxxxxx \
--region ap-northeast-1
# 特定のマウントターゲットのセキュリティグループを取得する
aws efs describe-mount-target-security-groups \
--mount-target-id fsmt-xxxxxxxx \
--region ap-northeast-1
ステップ2 — EC2のセキュリティグループIDを取得する
aws ec2 describe-instances \
--instance-ids i-xxxxxxxx \
--query 'Reservations[0].Instances[0].SecurityGroups' \
--region ap-northeast-1
ステップ3 — インバウンドNFSルールを追加する
# sg-efs-id = EFSマウントターゲットのセキュリティグループ
# sg-ec2-id = EC2インスタンスのセキュリティグループ
aws ec2 authorize-security-group-ingress \
--group-id sg-efs-id \
--protocol tcp \
--port 2049 \
--source-group sg-ec2-id \
--region ap-northeast-1
ソースにはCIDRではなくセキュリティグループIDを指定します。こうすることで、そのSGに属するすべてのインスタンスに自動的にルールが適用されます — IPアドレスは変わっても、グループのメンバーシップは変わりません。
修正方法:正しいAZにマウントターゲットがない場合
マウントターゲットはAZごとに必要です。ap-northeast-1aにあるEC2には、ap-northeast-1aのマウントターゲットが必要です。現状を確認しましょう:
aws efs describe-mount-targets \
--file-system-id fs-xxxxxxxx \
--region ap-northeast-1 \
--query 'MountTargets[*].{AZ:AvailabilityZoneName,State:LifeCycleState,IP:IpAddress}'
次にEC2が属するAZを確認します:
aws ec2 describe-instances \
--instance-ids i-xxxxxxxx \
--query 'Reservations[0].Instances[0].Placement.AvailabilityZone' \
--region ap-northeast-1
一致するものがない場合は、不足しているAZにマウントターゲットを作成します — EFSコンソール(「ネットワーク」タブ → 「管理」 → 「マウントターゲットの追加」)またはCLIで実行できます:
aws efs create-mount-target \
--file-system-id fs-xxxxxxxx \
--subnet-id subnet-xxxxxxxx \
--security-groups sg-efs-id \
--region ap-northeast-1
新しいマウントターゲットがavailable状態になるまで約30〜60秒かかります。その状態になるまでマウントを再試行しないでください。
修正方法:ネットワークACL
NACLはステートレスです — セキュリティグループと異なり、接続を追跡しません。双方向に明示的なルールが必要です。
# EFSマウントターゲットが属するサブネットを確認する
aws efs describe-mount-targets \
--file-system-id fs-xxxxxxxx \
--query 'MountTargets[*].SubnetId'
# そのサブネットのNACLを確認する
aws ec2 describe-network-acls \
--filters Name=association.subnet-id,Values=subnet-xxxxxxxx \
--region ap-northeast-1
ポート2049インバウンドのALLOWルールより先に評価されるDENYルールがないか確認してください。また、エフェメラルポート(1024〜65535)のアウトバウンドが許可されているかも確認してください — EFSからの戻りトラフィックはこれらのポートを使用します。
動作確認
まず接続テストを行う
# EC2上から — マウントする前にポート2049に到達できるか確認する
nc -zv fs-xxxxxxxx.efs.ap-northeast-1.amazonaws.com 2049
# 修正できていれば、以下のように表示されます:
# Connection to fs-xxxxxxxx.efs.ap-northeast-1.amazonaws.com 2049 port [tcp/nfs] succeeded!
ncがまだタイムアウトする場合は、ネットワークのブロックが残っています。ncが通過するまでmountを再試行しても意味がありません。
マウントして確認する
# EFSマウントヘルパーをインストールする(Amazon Linux 2)
sudo yum install -y amazon-efs-utils
# ヘルパー経由でTLSを使用してマウントする
sudo mkdir -p /mnt/efs
sudo mount -t efs -o tls fs-xxxxxxxx:/ /mnt/efs
# マウントされていることを確認する
df -h /mnt/efs
# 期待される出力: fs-xxxxxxxx.efs.ap-northeast-1.amazonaws.com:/ ... 0% /mnt/efs
# 簡単な動作確認
echo "efs works" | sudo tee /mnt/efs/test.txt
cat /mnt/efs/test.txt
再起動後も永続させる
# /etc/fstab に追加する
fs-xxxxxxxx:/ /mnt/efs efs defaults,_netdev,tls 0 0
_netdevフラグは、ネットワークインターフェースが準備できてからマウントするようOSに指示します。このフラグがないと、ブートシーケンスがネットワーク起動前にEFSをマウントしようとして失敗し、エラーログも残らず/mnt/efsが空のままになります。
確認チェックリスト
- EFSのSGにEC2のSGからのインバウンドTCP 2049が許可されている ✓
- EC2と同じAZにマウントターゲットが存在する ✓
- マウントターゲットの状態が
creatingではなくavailableになっている ✓ - EC2とEFSが同じVPC内にある ✓
- ポート2049またはエフェメラルポート(1024〜65535)を拒否するNACLがない ✓
- マウントを再試行する前に
nc -zv <efs-dns> 2049が成功する ✓

