Amazon EFSでEC2間の共有ストレージをマルチAZ構成で設計する方法|aws efs create-file-systemコマンドの実践手順

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > AWS(Amazon Linux) > Amazon EFSでEC2間の共有ストレージをマルチAZ構成で設計する方法|aws efs create-file-systemコマンドの実践手順
「EC2インスタンスにアップロードしたファイルがサーバーによって見えたり見えなかったりする」
「Auto Scalingで新しいEC2が立ち上がるたびに、静的ファイルを手動でコピーしなければならない」

こうした問題は、単一EC2のローカルストレージにファイルを保存していることが根本原因です。複数のEC2インスタンスからファイルを共有するには、Amazon EFS(Elastic File System)をマルチAZ構成で設計するのが標準的なアプローチです。

この記事では、Amazon EFSによるマルチAZ共有ストレージの設計思想から、aws efs create-file-systemコマンドを使ったファイルシステムの作成、複数AZへのマウントターゲット配置、EC2からのNFSマウント手順、EFSアクセスポイントによるUID/GID固定、ライフサイクルポリシーを使ったコスト最適化、パフォーマンスモードとスループットモードの選び方まで、実機(Amazon Linux 2023)で動作確認した出力例とともに解説します。

実行環境: Amazon Linux 2023 / AWS CLI 2.17 / Amazon EFS(2026年9月確認)

この記事のポイント

・EFSはNFSv4を使い、複数EC2から同時に読み書きできる共有ストレージ
・マウントターゲットを複数AZに配置することでAZ障害時も継続してアクセスできる
・aws efs create-file-systemで作成し、各AZのサブネットにマウントターゲットを設ける
・パフォーマンスモードはGeneral Purpose、スループットはElasticを最初に選ぶのが現実解


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Amazon EFSとは何か(EBS・S3との違い)

AWSのストレージは用途によって3種類使い分けます。それぞれの特徴を押さえておくと、EFSを選ぶ理由が明確になります。
比較項目 EBS(ブロック) S3(オブジェクト) EFS(ファイル)
接続方法 単一EC2にアタッチ(Multi-Attach対応の例外あり) HTTP API経由(aws s3コマンド等) NFSv4でマウント(複数EC2から同時)
ファイル操作 通常のLinuxファイル操作 オブジェクト単位のPUT/GETのみ 通常のLinuxファイル操作(cp, mv, ls等)
用途 OS・DB・高I/O単体ワークロード 静的ファイル、ログ、大容量バックアップ 複数EC2の共有コンテンツ、CMSメディア
マルチAZ冗長 スナップショットで別AZに手動複製 標準でリージョン冗長 標準でリージョン内複数AZに自動複製
料金体系 プロビジョニングしたGB分 保存したGB分(安価) 使用したGB分(EBSより割高だがAuto Scaling向き)
EFSの最大の特徴は「複数のEC2から同時に読み書きできる」点です。Auto Scaling Groupで複数インスタンスが起動した場合も、全インスタンスが同じEFSをマウントしていれば、どのインスタンスにアクセスしてもファイルが一元化されます。また、EFSはリージョン内の複数AZにデータを自動的に複製するため、単一AZ障害でもデータは失われません。

EFS StandardとEFS One Zone:EFSには可用性が異なる2つのストレージクラスがあります。本記事で解説する「EFS Standard(リージョナル)」はリージョン内の複数AZにデータを自動複製する高可用性構成です。一方、「EFS One Zone」はデータを単一AZにのみ保持するため、EFS Standardより安価に利用できます。ただしAZ障害時はアクセスできなくなるため、高可用性が不要な開発・テスト環境向けの選択肢です。EFS One Zoneを作成するには --availability-zone-name ap-northeast-1a のようにAZを指定します。

マルチAZ構成の全体像

EFSをマルチAZ構成にするための主要コンポーネントは次の通りです。

・EFSファイルシステム: データの実体。リージョン単位で作成し、内部的に複数AZに冗長化される
・マウントターゲット(Mount Target): 各AZのサブネットに作るNFSエンドポイント。EC2はこのエンドポイントへNFSで接続する
・セキュリティグループ: マウントターゲット用SGに、EC2のSGからTCPポート2049(NFS)の通信を許可する

AZ-aにマウントターゲットを1つ、AZ-cにも1つ作ることで、各AZのEC2が同一のEFSファイルシステムにアクセスできます。AZ-aが障害になっても、AZ-cのEC2はAZ-cのマウントターゲット経由で引き続きEFSにアクセスできます。

EFSのDNS名について:EFSファイルシステムには fs-xxxx.efs.ap-northeast-1.amazonaws.com 形式のDNS名が自動的に付与されます。EFSマウントヘルパー(mount -t efs)はこのDNS名を使い、EC2と同一AZのマウントターゲットIPに自動解決します。VPC設定の「DNS解決を有効にする」と「DNSホスト名を有効にする」が両方オンになっていないと、このDNS解決が失敗してマウントできなくなります。設定確認方法はトラブルシュートセクションで紹介します。

【コスト上の注意】EFSマウントヘルパー(mount -t efs)は、EC2から見て最も近いAZ(同一AZ)のマウントターゲットに自動接続します。EC2とマウントターゲットが異なるAZにまたがると、AZ間データ転送料金($0.01/GB程度)が発生します。EC2とマウントターゲットは必ず同一AZに配置してください。

EFSファイルシステムの作成

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

まずEFSマウントターゲット用のセキュリティグループを作成します。EC2からTCPポート2049(NFS)へのアクセスを許可します。

【注意】EFSのマウントターゲット用SGには、インターネットからの直接アクセスを許可しないこと。EC2用SG(sg-ec2)を送信元に指定することで、EC2経由のアクセスだけに絞れます。

# EFSマウントターゲット用SGを作成 aws ec2 create-security-group \ --group-name sg-efs-mount \ --description "EFS mount target SG" \ --vpc-id vpc-0a1b2c3d4e5f67890 # 出力例 # { "GroupId": "sg-0efs00001" } # EC2のSGからNFS(TCP 2049)を許可(インターネット直接開放は厳禁) aws ec2 authorize-security-group-ingress \ --group-id sg-0efs00001 \ --protocol tcp \ --port 2049 \ --source-group sg-0ec20001 # 出力例(成功時) # { "Return": true, "SecurityGroupRules": [...] }

2. EFSファイルシステムの作成

aws efs create-file-system でEFSファイルシステムを作成します。--performance-mode generalPurpose が通常のWebアプリケーションに適した選択です。--encryptedを付けてAES-256暗号化を有効にするのが本番運用の鉄則です。

aws efs create-file-system \ --performance-mode generalPurpose \ --throughput-mode elastic \ --encrypted \ --tags Key=Name,Value=efs-web-shared # 出力例(一部) # { # "FileSystemId": "fs-0a1b2c3d4e5f67890", # "PerformanceMode": "generalPurpose", # "ThroughputMode": "elastic", # "Encrypted": true, # "LifeCycleState": "creating", # "Tags": [{"Key": "Name", "Value": "efs-web-shared"}] # } # 作成完了まで待機("available"になるまで30秒程度) aws efs describe-file-systems \ --file-system-id fs-0a1b2c3d4e5f67890 \ --query "FileSystems[0].[FileSystemId,LifeCycleState]" \ --output text # 出力例 # fs-0a1b2c3d4e5f67890 available

マウントターゲットを複数のAZに設定する

EFSファイルシステムが作成できたら、各AZのプライベートサブネットにマウントターゲットを作成します。マウントターゲットはEC2がNFS接続する際のエンドポイントです。

# AZ-a(ap-northeast-1a)にマウントターゲットを作成 aws efs create-mount-target \ --file-system-id fs-0a1b2c3d4e5f67890 \ --subnet-id subnet-0priv0001 \ --security-groups sg-0efs00001 # 出力例 # { # "MountTargetId": "fsmt-0a1b2c3d4e5f00001", # "FileSystemId": "fs-0a1b2c3d4e5f67890", # "SubnetId": "subnet-0priv0001", # "LifeCycleState": "creating", # "IpAddress": "10.0.1.XXX", # "AvailabilityZoneName": "ap-northeast-1a" # } # AZ-c(ap-northeast-1c)にも同様に作成 aws efs create-mount-target \ --file-system-id fs-0a1b2c3d4e5f67890 \ --subnet-id subnet-0priv0002 \ --security-groups sg-0efs00001 # マウントターゲットの一覧確認 aws efs describe-mount-targets \ --file-system-id fs-0a1b2c3d4e5f67890 \ --query "MountTargets[*].[AvailabilityZoneName,LifeCycleState,IpAddress]" \ --output table # 出力例(両AZがavailableになったことを確認) # ----------------------------------------------------------- # | DescribeMountTargets | # +--------------------+-------------+--------------------+ | # | ap-northeast-1a | available | 10.0.1.155 | | # | ap-northeast-1c | available | 10.0.3.202 | | # +--------------------+-------------+--------------------+ |

EC2インスタンスからEFSをマウントする

1. EFSマウントヘルパーのインストール

Amazon Linux 2023では amazon-efs-utils パッケージをインストールすることで、mount -t efs コマンドが使えるようになります。TLS暗号化マウントや自動リトライ機能が内蔵されています。

# Amazon Linux 2023の場合 sudo dnf install -y amazon-efs-utils # Ubuntu / Debianの場合 sudo apt-get install -y amazon-efs-utils # Rocky Linux / RHELでnfs-utilsを直接使う場合 sudo dnf install -y nfs-utils

2. EFSをマウントする

マウント先のディレクトリを作成し、EFSファイルシステムをマウントします。EFSマウントヘルパーを使うと、最も近いAZのマウントターゲットに自動的に接続されます。

# マウントポイント作成 sudo mkdir -p /mnt/efs # EFSマウントヘルパーを使ってTLS暗号化マウント sudo mount -t efs -o tls fs-0a1b2c3d4e5f67890:/ /mnt/efs # マウント確認 df -hT | grep efs # 出力例(ap-northeast-1aのEC2から接続した場合) # 127.0.0.1:/ nfs4 8.0E 0 8.0E 0% /mnt/efs # ファイルの書き込みテスト echo "$(hostname): $(date)" | sudo tee /mnt/efs/test.txt # 別のAZ(ap-northeast-1c)にある別のEC2から確認 cat /mnt/efs/test.txt # → ip-10-0-1-105.ap-northeast-1.compute.internal: Mon Aug 10 11:30:00 UTC 2026

Linuxのマウントコマンドの詳細については、mount コマンドの使い方も参考にしてください。

3. EFSアクセスポイントでUID/GIDを固定する

EFSのルートディレクトリはデフォルトでroot(UID=0)が所有します。Webサーバー(apache: UID=48、nginx: UID=101)がファイルを書き込むには、毎回chownで所有者を変更するか、EFSアクセスポイント(EFS Access Point)を使うと管理が楽になります。

アクセスポイントは「このマウントポイントからアクセスするときはUID/GIDをXXXに固定する」という設定を事前に定義できる仕組みです。Auto Scalingで新しいEC2が立ち上がっても、設定なしで正しいパーミッションが適用されます。

# apacheユーザー(UID=48, GID=48)向けのアクセスポイントを作成 aws efs create-access-point \ --file-system-id fs-0a1b2c3d4e5f67890 \ --posix-user '{"Uid": 48, "Gid": 48}' \ --root-directory '{"Path": "/web-content", "CreationInfo": {"OwnerUid": 48, "OwnerGid": 48, "Permissions": "755"}}' \ --tags Key=Name,Value=ap-apache # 出力例(一部) # { # "AccessPointId": "fsap-0abc123def456789", # "FileSystemId": "fs-0a1b2c3d4e5f67890", # "PosixUser": {"Uid": 48, "Gid": 48}, # "RootDirectory": {"Path": "/web-content"} # } # アクセスポイント経由でマウント(-o accesspoint=fsap-xxx) sudo mount -t efs \ -o tls,accesspoint=fsap-0abc123def456789 \ fs-0a1b2c3d4e5f67890 /var/www/html # マウント後の所有者確認 ls -la /var/www/ # drwxr-xr-x 2 apache apache 6144 Sep 10 11:45 html

4. 起動時に自動マウントする(/etc/fstab設定)

EC2を再起動しても自動的にEFSをマウントするには /etc/fstab に設定を追加します。

# /etc/fstab に追加する行(通常マウントの場合) fs-0a1b2c3d4e5f67890:/ /mnt/efs efs defaults,_netdev,tls,nofail 0 0 # アクセスポイント使用時の場合 fs-0a1b2c3d4e5f67890:/ /var/www/html efs defaults,_netdev,tls,accesspoint=fsap-0abc123def456789,nofail 0 0 # fstabの設定を確認(アンマウント→再マウントで検証) sudo umount /mnt/efs sudo mount -a df -hT | grep efs

Auto Scalingと組み合わせる場合のTips:Auto Scaling Groupでスケールアウトした新規EC2にも確実にEFSをマウントさせるには、上記の /etc/fstab エントリをあらかじめAMIに焼き込んでおくのが確実です。設定済みEC2から aws ec2 create-image でゴールデンAMIを作成し、Auto ScalingのLaunch Templateに適用することで、スケールアウト時に追加の設定作業なしで全インスタンスがEFSをマウントした状態で起動します。user_dataでマウントコマンドを実行する方法より安定しており、起動時間も短縮できます。

また、IMDSv2(Instance Metadata Service v2)を強制しているEC2環境では、amazon-efs-utilsのバージョンが古いと認証トークン取得に失敗してマウントが止まることがあります。sudo dnf update amazon-efs-utilsで最新版に更新してから再確認してください。

パフォーマンスモードとスループットモードの選択

EFSにはパフォーマンスモードとスループットモードの2軸があります。

パフォーマンスモード(作成後変更不可のため要注意)

・General Purpose(汎用): 低レイテンシ。Webサーバーのコンテンツ、CMS(WordPressなど)、ホームディレクトリに向く。ほとんどのケースでこちらを選ぶ
・Max I/O(最大I/O): 高スループット・高並行処理。ただしレイテンシが増加する。数千台のEC2から大量のファイルを同時操作するビッグデータ処理向け

スループットモード(作成後でも変更可能)

・Elastic(弾力的): 負荷に応じて自動的にスループットが増減する。可変ワークロードに最適。2022年10月以降の推奨設定
・Bursting(バースト): ストレージ量に比例したベーススループット+バーストクレジット方式。ファイルサイズが小さい(1TB未満)段階では制限される場合がある
・Provisioned(プロビジョニング済み): 固定スループットを事前に指定。安定した高スループットが必要なケースで使用

# スループットモードの変更(BurstingからElasticへ) aws efs update-file-system \ --file-system-id fs-0a1b2c3d4e5f67890 \ --throughput-mode elastic # 変更確認 aws efs describe-file-systems \ --file-system-id fs-0a1b2c3d4e5f67890 \ --query "FileSystems[0].[PerformanceMode,ThroughputMode]" \ --output text # 出力例 # generalPurpose elastic

ライフサイクルポリシーでコストを最適化する

EFSにはライフサイクルポリシーを設定することで、アクセスが少ないファイルを自動的にIA(Infrequent Access)ストレージクラスに移動できます。EFS IAの料金はEFS標準の約92%オフ(東京リージョン: $0.025/GB vs $0.36/GB)です。

【鉄則】CMSのメディアファイルや、頻繁には参照されない添付ファイル置き場には必ずライフサイクルポリシーを設定してください。7日または14日アクセスがなければIAへ移動する設定が多くの現場で採用されています。

# 30日間アクセスがないファイルをEFS IAへ移動 aws efs put-lifecycle-configuration \ --file-system-id fs-0a1b2c3d4e5f67890 \ --lifecycle-policies '[{"TransitionToIA":"AFTER_30_DAYS"}]' # 確認 aws efs describe-lifecycle-configuration \ --file-system-id fs-0a1b2c3d4e5f67890 # 出力例 # { # "LifecyclePolicies": [ # { "TransitionToIA": "AFTER_30_DAYS" } # ] # } # アクセス後は標準クラスへ戻す設定も追加できる(IA→標準への自動復帰) aws efs put-lifecycle-configuration \ --file-system-id fs-0a1b2c3d4e5f67890 \ --lifecycle-policies '[{"TransitionToIA":"AFTER_30_DAYS"},{"TransitionToPrimaryStorageClass":"AFTER_1_ACCESS"}]'

TransitionToIA に指定できる値は AFTER_7_DAYS / AFTER_14_DAYS / AFTER_30_DAYS / AFTER_60_DAYS / AFTER_90_DAYS です。サイトの訪問頻度と運用コストを天秤にかけて選んでください。

トラブルシュート・よくあるエラー対処

「Connection timed out」でマウントできない場合

最もよくある原因はセキュリティグループの設定ミスです。

・マウントターゲットのSGが、EC2のSGからのTCP 2049を許可しているか確認
・EC2とマウントターゲットが同じVPC内にあるか確認

ポートの疎通確認は telnet や nc コマンドで行えます。Linuxでのポート確認方法については、Linux ポート確認の全コマンドを参考にしてください。

# マウントターゲットのIPアドレスを取得 aws efs describe-mount-targets \ --file-system-id fs-0a1b2c3d4e5f67890 \ --query "MountTargets[?AvailabilityZoneName=='ap-northeast-1a'].IpAddress" \ --output text # 出力例 # 10.0.1.155 # EC2からTCP 2049への疎通確認 nc -zvw 3 10.0.1.155 2049 # 疎通OKの例: Connection to 10.0.1.155 2049 port [tcp/nfs] succeeded! # タイムアウト: sg-efs-mountのインバウンドルールを確認すること

EFS DNS名が解決できずマウントできない場合

fs-xxxx.efs.ap-northeast-1.amazonaws.com の名前解決に失敗してマウントがタイムアウトするケースがあります。VPCのDNS設定が原因であることがほとんどです。VPCの「DNS解決を有効にする」と「DNSホスト名を有効にする」が両方オンになっていないと、EFSのDNS名が引けません。

# VPCのDNS解決設定を確認 aws ec2 describe-vpc-attribute \ --vpc-id vpc-0a1b2c3d4e5f67890 \ --attribute enableDnsSupport # 出力例(有効な場合) # { "VpcId": "vpc-0a1b2c3d4e5f67890", "EnableDnsSupport": { "Value": true } } aws ec2 describe-vpc-attribute \ --vpc-id vpc-0a1b2c3d4e5f67890 \ --attribute enableDnsHostnames # 出力例(有効な場合) # { "VpcId": "vpc-0a1b2c3d4e5f67890", "EnableDnsHostnames": { "Value": true } } # いずれかがfalseの場合、以下で有効化する aws ec2 modify-vpc-attribute \ --vpc-id vpc-0a1b2c3d4e5f67890 \ --enable-dns-support '{"Value": true}' aws ec2 modify-vpc-attribute \ --vpc-id vpc-0a1b2c3d4e5f67890 \ --enable-dns-hostnames '{"Value": true}' # DNS解決を手動確認(EC2から実行) nslookup fs-0a1b2c3d4e5f67890.efs.ap-northeast-1.amazonaws.com # 同一AZのマウントターゲットIPが返れば正常

「wrong fs type」でマウントできない場合

mount: wrong fs type, bad option, bad superblock というエラーは、amazon-efs-utilsまたはnfs-utilsがインストールされていないときに発生します。

# amazon-efs-utilsの状態確認 rpm -qa | grep amazon-efs-utils # 出力なし → インストール必要 # Amazon Linux 2023でインストール sudo dnf install -y amazon-efs-utils # nfs-utilsを使って直接NFSv4でマウントする代替手順 # (マウントターゲットのDNS名を使う。EFSマウントヘルパーより低機能) sudo mount -t nfs4 \ -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 \ fs-0a1b2c3d4e5f67890.efs.ap-northeast-1.amazonaws.com:/ \ /mnt/efs

マウント後にアクセス権限エラーが出る場合

EFSのルートディレクトリはデフォルトでrootが所有しています。アプリケーションユーザー(例: apache, nginx)が書き込めるようにchownで所有者を変更するか、前述のEFSアクセスポイントを使い特定のUIDでマウントするディレクトリを定義します。

# マウントポイントの所有者をapacheユーザーに変更 sudo chown apache:apache /mnt/efs sudo chmod 755 /mnt/efs # 確認 ls -la /mnt/ # drwxr-xr-x 2 apache apache 6144 Aug 10 11:45 efs

EC2起動時に自動マウントが失敗する場合

/etc/fstab の設定で nofail オプションが抜けていると、ネットワーク到達前にマウントを試みて起動失敗する場合があります。必ず _netdev,nofail を組み合わせてください。

本記事のまとめ

やりたいこと コマンド
EFSファイルシステムを作成する aws efs create-file-system --performance-mode generalPurpose --throughput-mode elastic
AZごとにマウントターゲットを作成する aws efs create-mount-target --file-system-id fs-xxx --subnet-id subnet-xxx
マウントターゲットの一覧を確認する aws efs describe-mount-targets --file-system-id fs-xxx
EFSをTLS暗号化マウントする mount -t efs -o tls fs-xxx:/ /mnt/efs
アクセスポイントを作成する aws efs create-access-point --file-system-id fs-xxx --posix-user '{"Uid":48,"Gid":48}'
起動時に自動マウントする /etc/fstab に fs-xxx:/ /mnt/efs efs defaults,_netdev,tls,nofail 0 0
スループットモードを変更する aws efs update-file-system --file-system-id fs-xxx --throughput-mode elastic
ライフサイクルポリシーを設定する aws efs put-lifecycle-configuration --file-system-id fs-xxx --lifecycle-policies '[{"TransitionToIA":"AFTER_30_DAYS"}]'
マウントターゲットのIP確認 aws efs describe-mount-targets --query "MountTargets[*].IpAddress"
VPCのDNS設定を確認する aws ec2 describe-vpc-attribute --vpc-id vpc-xxx --attribute enableDnsSupport
Amazon EFSをマルチAZに配置することで、Auto Scalingで増減するEC2すべてが同じファイルを参照できる冗長構成を実現できます。アクセスポイントでUID/GIDを固定し、ライフサイクルポリシーでコストを最適化する仕組みも合わせて整えておくと、本番運用がよりシンプルになります。次のステップとして、RDSのマルチAZ設計やElastiCacheクラスター設計といったデータ層の冗長化も合わせて検討してみてください。

AWSのマルチAZ冗長設計を「実務の型」として身につけませんか?

EFSのマウント方法は調べれば分かります。でも「なぜマウントターゲットをAZごとに分けるのか」「パフォーマンスモードをどう選ぶべきか」を現場で即答できますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

※ 「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。