「Auto Scalingで新しいEC2が立ち上がるたびに、静的ファイルを手動でコピーしなければならない」
こうした問題は、単一EC2のローカルストレージにファイルを保存していることが根本原因です。複数のEC2インスタンスからファイルを共有するには、Amazon EFS(Elastic File System)をマルチAZ構成で設計するのが標準的なアプローチです。
この記事では、Amazon EFSによるマルチAZ共有ストレージの設計思想から、
aws efs create-file-systemコマンドを使ったファイルシステムの作成、複数AZへのマウントターゲット配置、EC2からのNFSマウント手順、パフォーマンスモードとスループットモードの選び方まで、実機(Amazon Linux 2023)で動作確認した出力例とともに解説します。この記事のポイント
・EFSはNFSv4を使い、複数EC2から同時に読み書きできる共有ストレージ
・マウントターゲットを複数AZに配置することでAZ障害時も継続してアクセスできる
・aws efs create-file-systemで作成し、各AZのサブネットにマウントターゲットを設ける
・パフォーマンスモードはGeneral Purpose、スループットはElasticを最初に選ぶのが現実解
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Amazon EFSとは何か(EBS・S3との違い)
AWSのストレージは用途によって3種類使い分けます。・EBS(Elastic Block Store): 単一EC2にアタッチするブロックストレージ。高速だが1インスタンス専用(Multi-Attach対応の例外あり)
・S3: オブジェクトストレージ。HTTP APIでアクセスし、大容量の静的データ保存に向く。リアルタイムのファイル操作は苦手
・EFS(Elastic File System): NFSv4プロトコルで複数のEC2インスタンスから同時にマウントできる共有ファイルシステム。Linuxの通常のファイル操作がそのまま使える
EFSの最大の特徴は「複数のEC2から同時に読み書きできる」点です。Auto Scaling Groupで複数インスタンスが起動した場合も、全インスタンスが同じEFSをマウントしていれば、どのインスタンスにアクセスしてもファイルが一元化されます。また、EFSはリージョン内の複数AZに自動的にデータを複製するため、単一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ファイルシステムの作成
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
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
3. 起動時に自動マウントする(/etc/fstab設定)
EC2を再起動しても自動的にEFSをマウントするには/etc/fstab に設定を追加します。# /etc/fstab に追加する行 fs-0a1b2c3d4e5f67890:/ /mnt/efs efs defaults,_netdev,tls,nofail 0 0 # fstabの設定を確認(アンマウント→再マウントで検証) sudo umount /mnt/efs sudo mount -a df -hT | grep efs
パフォーマンスモードとスループットモードの選択
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
トラブルシュート・よくあるエラー対処
「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のルートディレクトリはデフォルトでrootが所有しています。アプリケーションユーザー(例: apache, nginx)が書き込める様にchownで所有者を変更するか、EFSアクセスポイント(EFS Access Point)を使い特定の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 |
| 起動時に自動マウントする | /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 |
| マウントターゲットのIP確認 | aws efs describe-mount-targets --query "MountTargets[*].IpAddress" |
AWSのマルチAZ冗長設計を「実務の型」として身につけませんか?
EFSのマウント方法は調べれば分かります。でも「なぜマウントターゲットをAZごとに分けるのか」「パフォーマンスモードをどう選ぶべきか」を現場で即答できますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:AWS EKSでKubernetesクラスターをマルチAZ構成で設計する方法|マネージドノードグループとVPC設計の実践
- この記事の属するカテゴリ:AWS(Amazon Linux)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます