メインコンテンツまでスキップ

Amazon EFS の使い方:EC2 からマウントして共有ストレージを構築する

タグ:

複数の EC2 インスタンスや Lambda から同じファイルを参照したい場面で活躍するのが Amazon EFS(Elastic File System)です。EBS がインスタンスに 1 対 1 で紐付くブロックストレージであるのに対して、EFS はネットワーク越しに NFS マウントできるため、複数のコンピューティングリソースがファイルを共有できます。この記事では EFS の基本的な仕組みから、実際にマウントして使うまでの手順を整理します。

Amazon EFS とは

Amazon EFS は AWS が提供するフルマネージドの NFS ファイルシステムサービスです。ファイルシステムを作成すると、複数のアベイラビリティーゾーン(AZ)をまたいでデータが自動的に冗長化されます。ストレージ容量は利用量に応じて自動でスケールするため、容量の見積もりや事前プロビジョニングは不要です。

EC2・ECS・EKS・Lambda などのさまざまな AWS コンピューティングサービスからアクセスでき、通常の Linux ファイルシステムと同じコマンドでファイルを操作できます。

ストレージクラスとライフサイクル管理

EFS には 4 つのストレージクラスがあります。アクセス頻度に合わせて適切なクラスを選ぶことでコストを最適化できます。

ストレージクラス特徴
標準(Standard)高頻度アクセス向け。マルチ AZ で冗長化
標準低頻度アクセス(Standard-IA)低頻度アクセス向け。標準より安価だが読み取りに追加料金あり
1 ゾーン(One Zone)単一 AZ に保存。標準より安価
1 ゾーン低頻度アクセス(One Zone-IA)単一 AZ の低頻度アクセス向け。最もコストが低い

ライフサイクルポリシーを設定しておくと、一定期間アクセスされていないファイルを自動的に低頻度アクセスクラスへ移動できます。頻繁に使うファイルと使わないファイルが混在する場合に有効です。

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

EFS には 2 種類のパフォーマンスモードと 3 種類のスループットモードがあります。用途に応じて組み合わせを選びましょう。

パフォーマンスモード

パフォーマンスモードはファイルシステムの作成時に選択します。後から変更できないため、用途に応じて選びましょう。

モード概要
汎用(General Purpose)ほとんどのワークロードに対応。推奨設定
最大 I/O(Max I/O)多数のクライアントが並列アクセスする大規模な分散処理向け。レイテンシーがやや高い

スループットモード

新規で作成する場合は Elastic スループットを選ぶと、コストとパフォーマンスのバランスが取りやすいです。

モード概要
Elastic スループット必要なときに自動でスループットが増減。予測困難なワークロード向け
Provisioned スループット必要なスループットを事前に指定。常時一定の書き込みが必要な場合に使用
Bursting スループットストレージサイズに連動してベーススループットが決まる

EBS と EFS の違い

EFS を理解する上で EBS との違いを押さえておくと、どちらを選ぶかの判断がしやすくなります。同じファイルを複数のサーバーから読み書きしたい場合や、コンテナのデータを永続化して再起動後も保持したい場合は EFS が適しています。

比較項目EBSEFS
アクセス方式EC2 に直接アタッチ(ブロックデバイス)NFS v4 でマウント
同時接続基本 1 インスタンス複数インスタンスから同時接続
AZ をまたいだ共有不可可能
容量管理事前にサイズを決める自動でスケール
主なユースケース単一 EC2 インスタンス専用ストレージ共有ファイル・コンテンツ管理・機械学習

セキュリティグループの設定

EC2 から EFS に接続するには、EC2 と EFS マウントターゲットのそれぞれに NFS ポート(TCP 2049)の通信を許可するセキュリティグループの設定が必要です。

リソース方向プロトコルポート送信元 / 送信先
EC2 のセキュリティグループアウトバウンドTCP2049EFS マウントターゲットのセキュリティグループ
EFS マウントターゲットのセキュリティグループインバウンドTCP2049EC2 のセキュリティグループ

また、EC2 と EFS は同じ VPC 内に配置する必要があります。別の VPC からアクセスする場合は VPC ピアリングや Transit Gateway を経由する構成になります。

AWS CLI で EFS を使ってみる

AWS CLI を使って EFS ファイルシステムの作成から EC2 へのマウントまでを実際にコマンドを実行して確認します。

EFS ファイルシステムを作成する

create-file-system コマンドでファイルシステムを作成します。パフォーマンスモードに generalPurpose、スループットモードに elastic を指定します。

❯ aws efs create-file-system \
--performance-mode generalPurpose \
--throughput-mode elastic \
--encrypted \
--tags Key=Name,Value=my-efs
実行結果
{
"OwnerId": "123456789012",
"CreationToken": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"FileSystemId": "fs-0a1b2c3d4e5f67890",
"FileSystemArn": "arn:aws:elasticfilesystem:ap-northeast-1:123456789012:file-system/fs-0a1b2c3d4e5f67890",
"CreationTime": "2026-05-06T10:00:00+09:00",
"LifeCycleState": "creating",
"Name": "my-efs",
"NumberOfMountTargets": 0,
"SizeInBytes": {
"Value": 0,
"ValueInIA": 0,
"ValueInStandard": 0,
"ValueInArchive": 0
},
"PerformanceMode": "generalPurpose",
"Encrypted": true,
"KmsKeyId": "arn:aws:kms:ap-northeast-1:123456789012:key/b2c3d4e5-f6a7-8901-bcde-f12345678901",
"ThroughputMode": "elastic",
"Tags": [
{
"Key": "Name",
"Value": "my-efs"
}
],
"FileSystemProtection": {
"ReplicationOverwriteProtection": "ENABLED"
}
}

次に、EC2 が NFS 接続するエンドポイントとなるマウントターゲットを作成します。--security-groups には、EC2 のセキュリティグループからの TCP 2049 インバウンドを許可した EFS 用セキュリティグループの ID を事前に作成して指定します。

❯ aws efs create-mount-target \
--file-system-id fs-0a1b2c3d4e5f67890 \
--subnet-id subnet-0a1b2c3d4e5f67890 \
--security-groups sg-0a1b2c3d4e5f67890
{
"OwnerId": "123456789012",
"MountTargetId": "fsmt-0a1b2c3d4e5f67890",
"FileSystemId": "fs-0a1b2c3d4e5f67890",
"SubnetId": "subnet-0a1b2c3d4e5f67890",
"LifeCycleState": "creating",
"IpAddress": "10.0.1.123",
"NetworkInterfaceId": "eni-0a1b2c3d4e5f67890",
"AvailabilityZoneId": "apne1-az4",
"AvailabilityZoneName": "ap-northeast-1a",
"VpcId": "vpc-0a1b2c3d4e5f67890"
}

マウントターゲットが available 状態になるまでしばらく待ちます。以下のコマンドで状態を確認できます。

❯ aws efs describe-mount-targets --file-system-id fs-0a1b2c3d4e5f67890
{
"MountTargets": [
{
"OwnerId": "123456789012",
"MountTargetId": "fsmt-0a1b2c3d4e5f67890",
"FileSystemId": "fs-0a1b2c3d4e5f67890",
"SubnetId": "subnet-0a1b2c3d4e5f67890",
"LifeCycleState": "available",
"IpAddress": "10.0.1.123",
"NetworkInterfaceId": "eni-0a1b2c3d4e5f67890",
"AvailabilityZoneId": "apne1-az4",
"AvailabilityZoneName": "ap-northeast-1a",
"VpcId": "vpc-0a1b2c3d4e5f67890"
}
]
}

EC2 に EFS をマウントする

EC2 インスタンス(Amazon Linux 2023)に SSH でログインして、EFS マウントヘルパー(amazon-efs-utils)をインストールします。

sudo dnf install -y amazon-efs-utils

マウント先のディレクトリを作成します。

sudo mkdir /mnt/efs

EFS ファイルシステムを TLS 暗号化を有効にしてマウントします。

sudo mount -t efs -o tls fs-0a1b2c3d4e5f67890:/ /mnt/efs

マウントできているか確認します。efs タイプのファイルシステムが表示されればマウント成功です。

df -h /mnt/efs
Filesystem Size Used Avail Use% Mounted on
127.0.0.1:/ 8.0E 0 8.0E 0% /mnt/efs

インスタンス再起動後も自動マウントする

インスタンスを再起動するとマウントが解除されます。再起動後も自動的にマウントされるよう /etc/fstab に設定を追記しましょう。

echo "fs-0a1b2c3d4e5f67890:/ /mnt/efs efs defaults,_netdev,tls 0 0" | sudo tee -a /etc/fstab

_netdev オプションを付けることで、ネットワークが利用可能になってからマウントを実行します。起動時に EFS を利用するシステムはオプションを付けましょう。

リソースを削除する

作成したリソースを削除します。EFS ファイルシステムを削除する前に、マウントターゲットを先に削除する必要があります。

❯ aws efs delete-mount-target --mount-target-id fsmt-0a1b2c3d4e5f67890

マウントターゲットの削除が完了したら、ファイルシステムを削除します。

❯ aws efs delete-file-system --file-system-id fs-0a1b2c3d4e5f67890

まとめ

  • Amazon EFS はフルマネージドの NFS ファイルシステムで、複数の EC2 インスタンスや Lambda から同じファイルを共有できる
  • EBS がインスタンス専用のブロックストレージであるのに対し、EFS はネットワーク越しに複数インスタンスから同時接続できる
  • EC2 から EFS に接続するには、NFS ポート(TCP 2049)を許可するセキュリティグループの設定が必要
  • EFS マウントヘルパーをインストールしてマウントコマンドを実行すると、通常の Linux ファイルシステムと同じ感覚で操作できる
  • 再起動後も自動マウントするには fstab に設定を追記する