EC2でEFSマウントできない問題を修正: mount.nfs4: Connection timed out

intermediate☁️ AWS2026-06-30| Amazon EC2 (Amazon Linux 2 / Ubuntu 22.04)、Amazon EFS、AWS VPC、NFS4

Error Message

mount.nfs4: Connection timed out
#efs#nfs#ec2#security-group

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が成功する ✓

Related Error Notes