TL;DR
EC2 không thể kết nối đến cổng 2049 (NFS) của EFS. Chín trong mười trường hợp là do security group — security group của EFS mount target không cho phép kết nối NFS inbound từ EC2. Chỉ cần thêm một rule: Type: NFS, Port: 2049, Source: ID security group của EC2 bạn. Xong.
Lỗi trông như thế nào
$ 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
Hoặc khi dùng EFS mount helper:
$ sudo mount -t efs fs-xxxxxxxx:/ /mnt/efs
mount.nfs4: Connection timed out
Lệnh bị treo 60–90 giây rồi thất bại. Không có lỗi xác thực, không có "permission denied" — chỉ là timeout thuần túy. Đó là manh mối của bạn. Lỗi phân quyền sẽ bị từ chối ngay lập tức. Timeout có nghĩa là kết nối TCP không bao giờ được thiết lập.
Nguyên nhân gốc rễ
EFS sử dụng NFS qua cổng TCP 2049. Khi bạn chạy lệnh mount, EC2 mở một kết nối TCP đến IP của mount target trên cổng đó. Nếu gói tin bị chặn ở bất kỳ đâu trên đường đi, bạn sẽ gặp timeout này.
Các nguyên nhân phổ biến, sắp xếp theo mức độ thường gặp:
- Security group của EFS thiếu rule inbound NFS — SG của mount target không cho phép cổng 2049 từ SG của EC2 (chiếm ~80% trường hợp)
- Không có mount target trong AZ của EC2 — EFS mount target được tạo theo từng AZ; nếu EC2 của bạn ở
ap-northeast-1cnhưng mount target duy nhất lại ởap-northeast-1a, kết nối sẽ thất bại - Network ACL chặn traffic — NACL từ chối cổng 2049 inbound hoặc dải ephemeral port (1024–65535) outbound
- Khác VPC và chưa có peering — EFS mount target chỉ hoạt động trong phạm vi VPC; truy cập cross-VPC cần cấu hình VPC peering ở cả hai phía
Cách sửa: Security group (khả năng cao nhất)
Bước 1 — Tìm security group của EFS mount target
# Thay bằng filesystem ID và region của bạn
aws efs describe-mount-targets \
--file-system-id fs-xxxxxxxx \
--region ap-northeast-1
# Sau đó lấy security group cho một mount target cụ thể
aws efs describe-mount-target-security-groups \
--mount-target-id fsmt-xxxxxxxx \
--region ap-northeast-1
Bước 2 — Lấy ID security group của EC2
aws ec2 describe-instances \
--instance-ids i-xxxxxxxx \
--query 'Reservations[0].Instances[0].SecurityGroups' \
--region ap-northeast-1
Bước 3 — Thêm rule inbound NFS
# sg-efs-id = security group trên EFS mount target của bạn
# sg-ec2-id = security group trên EC2 instance của bạn
aws ec2 authorize-security-group-ingress \
--group-id sg-efs-id \
--protocol tcp \
--port 2049 \
--source-group sg-ec2-id \
--region ap-northeast-1
Dùng ID security group làm source thay vì CIDR. Như vậy rule sẽ tự động áp dụng cho mọi instance trong SG đó — địa chỉ IP có thể thay đổi, nhưng tư cách thành viên trong group thì không.
Cách sửa: Thiếu mount target ở đúng AZ
Mount target được tạo theo từng AZ. Một EC2 ở ap-northeast-1a cần mount target cụ thể ở ap-northeast-1a. Kiểm tra những gì bạn đang có:
aws efs describe-mount-targets \
--file-system-id fs-xxxxxxxx \
--region ap-northeast-1 \
--query 'MountTargets[*].{AZ:AvailabilityZoneName,State:LifeCycleState,IP:IpAddress}'
Sau đó xác nhận EC2 đang ở AZ nào:
aws ec2 describe-instances \
--instance-ids i-xxxxxxxx \
--query 'Reservations[0].Instances[0].Placement.AvailabilityZone' \
--region ap-northeast-1
Không khớp? Tạo mount target cho AZ còn thiếu — qua EFS console (tab Network → Manage → Add mount target) hoặc CLI:
aws efs create-mount-target \
--file-system-id fs-xxxxxxxx \
--subnet-id subnet-xxxxxxxx \
--security-groups sg-efs-id \
--region ap-northeast-1
Mount target mới cần khoảng 30–60 giây để đạt trạng thái available. Đừng thử mount lại cho đến khi nó sẵn sàng.
Cách sửa: Network ACL
NACL hoạt động theo trạng thái tĩnh — khác với security group, chúng không theo dõi kết nối. Bạn cần đặt rule rõ ràng cho cả hai chiều.
# Tìm subnet mà EFS mount target đang dùng
aws efs describe-mount-targets \
--file-system-id fs-xxxxxxxx \
--query 'MountTargets[*].SubnetId'
# Kiểm tra NACL trên subnet đó
aws ec2 describe-network-acls \
--filters Name=association.subnet-id,Values=subnet-xxxxxxxx \
--region ap-northeast-1
Tìm rule DENY được kích hoạt trước rule ALLOW cho cổng 2049 inbound. Cũng kiểm tra xem ephemeral port (1024–65535) có được cho phép outbound không — traffic trả về từ EFS sử dụng các cổng đó.
Xác minh
Kiểm tra kết nối trước
# Từ EC2 — kiểm tra xem cổng 2049 có thể truy cập trước khi mount
nc -zv fs-xxxxxxxx.efs.ap-northeast-1.amazonaws.com 2049
# Nếu đã sửa xong, bạn sẽ thấy:
# Connection to fs-xxxxxxxx.efs.ap-northeast-1.amazonaws.com 2049 port [tcp/nfs] succeeded!
nc vẫn bị timeout? Kết nối mạng vẫn đang bị chặn. Hãy sửa trước — không có ý nghĩa gì khi thử lại lệnh mount cho đến khi nc thành công.
Mount và xác minh
# Cài EFS mount helper (Amazon Linux 2)
sudo yum install -y amazon-efs-utils
# Mount với TLS qua helper
sudo mkdir -p /mnt/efs
sudo mount -t efs -o tls fs-xxxxxxxx:/ /mnt/efs
# Xác nhận đã được mount
df -h /mnt/efs
# Kết quả mong đợi: fs-xxxxxxxx.efs.ap-northeast-1.amazonaws.com:/ ... 0% /mnt/efs
# Kiểm tra nhanh
echo "efs works" | sudo tee /mnt/efs/test.txt
cat /mnt/efs/test.txt
Tự động mount khi khởi động lại
# Thêm vào /etc/fstab
fs-xxxxxxxx:/ /mnt/efs efs defaults,_netdev,tls 0 0
Flag _netdev báo cho hệ điều hành chờ network interface sẵn sàng trước khi mount. Nếu thiếu flag này, quá trình khởi động sẽ cố mount EFS trước khi mạng hoạt động — và thất bại âm thầm, khiến /mnt/efs trống rỗng mà không có lỗi nào được ghi lại.
Checklist nhanh
- EFS SG có rule inbound TCP 2049 từ EC2 SG ✓
- Mount target tồn tại trong cùng AZ với EC2 ✓
- Trạng thái mount target là
available, không phảicreating✓ - EC2 và EFS nằm trong cùng VPC ✓
- Không có NACL nào chặn cổng 2049 hoặc ephemeral port (1024–65535) ✓
nc -zv <efs-dns> 2049thành công trước khi thử lại lệnh mount ✓

