2026年10月3日
2026年10月3日
AWS EFSでNFSファイルシステムを構築する方法|マウントターゲット・セキュリティグループ・EC2からのマウントまで
Amazon EFS(Elastic File System)は、複数の EC2 インスタンスから同時にマウントできるマネージドな NFS ファイルシステムです。構築は「ファイルシステムを作る → 使うアベイラビリティーゾーン(AZ)ごとにマウントターゲットを置く → NFS(TCP 2049)を通すセキュリティグループを用意する → EC2 からマウントして fstab に登録する」の順で進めます。この記事では、その手順と、WordPress のように複数台で uploads を共有する構成でつまずきやすい点を説明します。
EFS のスループットモードやストレージクラス、コンソールの画面構成は改定が続いています(2026年10月現在)。ここでは機能の目的で説明するので、画面の項目名は目安として読み、細かい仕様は AWS の公式ドキュメントで確かめてください。
EFS の構成要素を先に押さえる
EFS を使うときに出てくる要素は次の4つです。
- ファイルシステム:データの入れ物です。複数の AZ にデータを保存するリージョン型(標準)と、1つの AZ だけに保存する One Zone 型があります。One Zone は AZ 障害に弱いので、本番の共有データには標準を選ぶのが一般的です。
- マウントターゲット:VPC のサブネット内に置かれる NFS の入口です。AZ ごとに1つ作り、EC2 は自分と同じ AZ のマウントターゲットにつなぎます。別 AZ のマウントターゲット経由でも通信はできますが、遅延と AZ 間通信の料金が増えます。
- セキュリティグループ:マウントターゲットに付けるもので、NFS のポート TCP 2049 をクライアントから受け付ける設定が必要です。
- アクセスポイント:任意で作れる入口で、マウント時のルートディレクトリや、接続したプロセスの UID/GID を強制できます。アプリごとに見える範囲を分けたいときに使います。
もう1つ大事なのが、EFS は NFS(NFSv4.0 / 4.1)でアクセスするネットワーク越しのファイルシステムだという点です。ローカルディスクの EBS に比べると1回あたりの読み書きに時間がかかり、小さなファイルを大量に開く処理ほど遅さが目立ちます。
ステップ1:セキュリティグループを2つ用意する
最初にセキュリティグループを作っておくと、後の手順がスムーズです。
- クライアント(EC2)用のセキュリティグループ(例:
web-sg) - マウントターゲット用のセキュリティグループ(例:
efs-sg)。インバウンドに「TCP 2049、送信元 =web-sg」を1行だけ追加します。
送信元を IP アドレス範囲ではなくセキュリティグループで指定すると、Auto Scaling で台数が増減しても設定を直す必要がありません。ここで 0.0.0.0/0 を許可しないことが大切です。EFS はマウントできれば中身を読み書きできるので、ネットワークで入口を絞ることが一次的な防御になります。
ステップ2:ファイルシステムとマウントターゲットを作る
コンソールでは EFS の画面からファイルシステムを作成し、VPC を選ぶと、各 AZ のサブネットにマウントターゲットを作る画面に進めます。ここでマウントターゲットのセキュリティグループを既定のものから efs-sg に差し替えます。
CLI で作る場合の例です。ID は自分の環境に合わせて置き換えてください。
# ファイルシステムを作成(保存時の暗号化を有効化)
aws efs create-file-system \
--performance-mode generalPurpose \
--throughput-mode elastic \
--encrypted \
--tags Key=Name,Value=wp-shared
# 使う AZ のサブネットごとにマウントターゲットを作成
aws efs create-mount-target \
--file-system-id fs-0123456789abcdef0 \
--subnet-id subnet-0aaaaaaaaaaaaaaaa \
--security-groups sg-0bbbbbbbbbbbbbbbb
# 状態が available になったか確認
aws efs describe-mount-targets --file-system-id fs-0123456789abcdef0
作成時に決める項目で、後から変えにくいものがあります。
- 保存時の暗号化:作成時にしか有効にできません。後から暗号化したくなると、新しいファイルシステムを作ってデータを移す作業になります。特別な理由が無ければ有効にしておきます。
- パフォーマンスモード:通常は汎用(General Purpose)を選びます。もう一方のモードはスループットモードや One Zone との組み合わせに制約があるため、選ぶ前にドキュメントを確認してください。
- スループットモード:使った分に応じてスループットが伸びる Elastic、容量に応じたクレジットで動く Bursting、値を指定する Provisioned があります。アクセス量が読めない WordPress のような用途では Elastic が扱いやすく、こちらは後から変更できます。
ライフサイクル管理を設定すると、一定期間アクセスの無いファイルを低頻度アクセス(IA)などの安いストレージクラスへ移せます。古い画像が多いサイトでは効果がありますが、移ったファイルを読むと取り出しの料金がかかる点も含めて検討します。
ステップ3:EC2 からマウントする
マウントには、AWS が提供するマウントヘルパー amazon-efs-utils を使うのがおすすめです。通信の TLS 暗号化(転送時の暗号化)を簡単に有効にでき、IAM によるアクセス制御にも対応しています。
# Amazon Linux 2023 の場合
sudo dnf install -y amazon-efs-utils
# マウントポイントを作り、TLS を有効にしてマウント
sudo mkdir -p /mnt/efs
sudo mount -t efs -o tls fs-0123456789abcdef0:/ /mnt/efs
# マウントできたか確認
df -h /mnt/efs
Ubuntu など Amazon Linux 以外では、配布元の GitHub(aws/efs-utils)の手順でパッケージを作って入れる方法が案内されています。手順はバージョンで変わるため、そちらの README に従ってください。
amazon-efs-utils を使わず、OS 標準の NFS クライアントでマウントすることもできます。その場合は AWS が推奨するマウントオプションを指定します。
sudo mount -t nfs4 \
-o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport \
fs-0123456789abcdef0.efs.ap-northeast-1.amazonaws.com:/ /mnt/efs
hard は、通信が途切れたときにエラーを返さず再試行を続ける指定です。データの破損を避けるための推奨値なので、soft に変えないでください。
再起動後もマウントされるように fstab に書く
# /etc/fstab に追記(amazon-efs-utils を使う場合)
fs-0123456789abcdef0:/ /mnt/efs efs _netdev,tls 0 0
_netdev はネットワークが使えるようになってからマウントする指定です。これが無いと、起動時にネットワークより先にマウントを試みて失敗し、起動が止まることがあります。書いた後は sudo umount /mnt/efs && sudo mount -a で、fstab の内容でマウントできるか再起動前に確かめておくと安心です。
マウントできないときの確認順
マウントのコマンドが返ってこない、またはタイムアウトする場合は、次の順で確認します。
- セキュリティグループ:
efs-sgのインバウンドに TCP 2049 があり、送信元が EC2 のセキュリティグループになっているか。最も多い原因です。 - マウントターゲットの有無:EC2 がいる AZ にマウントターゲットがあり、状態が available になっているか。
- DNS:
fs-xxxx.efs.リージョン.amazonaws.comの名前解決には、VPC の「DNS 解決」と「DNS ホスト名」の設定が有効になっている必要があります。digなどで名前が引けるか確かめます。 - ネットワーク ACL:サブネットの NACL を独自に絞っている場合、2049 番と戻りの通信(エフェメラルポート)が許可されているか。
amazon-efs-utils を使っている場合は、/var/log/amazon/efs/ 配下のログに原因が出ていることがあります。
WordPress で共有ストレージとして使うときの注意
Auto Scaling や ALB で WordPress を複数台にすると、管理画面からアップロードした画像が1台にしか保存されない問題が起きます。EFS を wp-content/uploads にマウントすると、全台が同じファイルを見られるようになります。
ただし、WordPress 本体やプラグインの PHP ファイルまで EFS に置くのは慎重に判断してください。PHP は1リクエストで多数のファイルを読み込むため、ネットワーク越しのファイルシステムでは応答が遅くなりやすいからです。コードは各インスタンスの EBS に置いてデプロイで配り、EFS は uploads だけにする構成が扱いやすいです。コードも共有する場合は、OPcache を有効にしてファイルの読み込み回数を減らします。
もう1つの落とし穴は所有者です。EFS 上のファイルは UID/GID の数値で所有者が記録されるため、インスタンスごとに Web サーバーのユーザー(apache や www-data、nginx)の UID が違うと、あるサーバーで作ったファイルを別のサーバーが書き換えられなくなります。同じ AMI から起動して UID をそろえるか、アクセスポイントで UID/GID を固定すると防げます。
画像の配信負荷も気になる場合は、S3 にメディアを置いて CloudFront から配信する方法も候補です。EFS はファイルシステムとして扱える手軽さ、S3 は配信とコストの面で有利という違いがあります。
バックアップを設定する
EFS のデータは AWS Backup でバックアップできます。新しく作るファイルシステムでは自動バックアップが既定で有効になる場合がありますが、設定はファイルシステムの詳細画面で確かめてください。ファイルシステムを削除するとデータは戻せないため、構成を変える前にはバックアップがあることを確認します。
まとめ
- EFS は複数の EC2 から同時にマウントできるマネージド NFS です。ファイルシステム、AZ ごとのマウントターゲット、TCP 2049 を許可するセキュリティグループの3点で構築します。
- セキュリティグループは送信元をクライアントのセキュリティグループで指定し、0.0.0.0/0 は許可しません。保存時の暗号化は作成時にしか設定できないので最初に有効にします。
- マウントは amazon-efs-utils の
-o tlsが手軽です。fstab には_netdevを付け、再起動前にmount -aで確認します。 - マウントできないときは、セキュリティグループ、マウントターゲット、DNS 設定、NACL の順に確認します。
- WordPress では uploads の共有に向いていますが、PHP コードの配置と UID の不一致に注意します。