Amazon EFS ファイルシステム設計と実装ガイド
Amazon EFS(Elastic File System)は、AWS クラウド内のAmazon EC2インスタンスで使用できる、シンプルでスケーラブル、フルマネージドなファイルシステムです。NFSv4プロトコルを使用し、複数のEC2インスタンス間でファイルを共有できる高可用性ストレージソリューションを提供します。
EFS基本概念とアーキテクチャ
EFSの核となる特徴
EFSは従来のファイルサーバーの制約を解決し、クラウドネイティブなファイルストレージを実現します。本番環境では、Infrastructure as Code アプローチでの構築を推奨します。
CloudFormationによる包括的EFS実装
yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Comprehensive Amazon EFS Implementation for Production'
Parameters:
Environment:
Type: String
Default: Production
Description: 'Environment name'
PerformanceMode:
Type: String
Default: generalPurpose
AllowedValues: [generalPurpose, maxIO]
Description: 'EFS Performance Mode'
ThroughputMode:
Type: String
Default: provisioned
AllowedValues: [bursting, provisioned]
Description: 'EFS Throughput Mode'
ProvisionedThroughput:
Type: Number
Default: 500
MinValue: 1
MaxValue: 4000
Description: 'Provisioned throughput in MiB/s'
Resources:
# EFSファイルシステム
ProductionEFS:
Type: AWS::EFS::FileSystem
Properties:
CreationToken: !Sub '${Environment}-efs-${AWS::StackName}'
PerformanceMode: !Ref PerformanceMode
ThroughputMode: !Ref ThroughputMode
ProvisionedThroughputInMibps: !If
- IsProvisionedMode
- !Ref ProvisionedThroughput
- !Ref AWS::NoValue
Encrypted: true
KmsKeyId: alias/aws/elasticfilesystem
FileSystemTags:
- Key: Name
Value: !Sub '${Environment}-EFS'
- Key: Environment
Value: !Ref Environment
- Key: Application
Value: WebApplication
- Key: ThroughputMode
Value: !Ref ThroughputMode
# セキュリティグループ
EFSSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: 'Security group for EFS mount targets'
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 2049
ToPort: 2049
SourceSecurityGroupId: !Ref ClientSecurityGroup
Description: 'NFS access from application servers'
Tags:
- Key: Name
Value: !Sub '${Environment}-EFS-SecurityGroup'
# マウントターゲット(複数AZ)
MountTargetAZ1:
Type: AWS::EFS::MountTarget
Properties:
FileSystemId: !Ref ProductionEFS
SubnetId: !Ref PrivateSubnet1
SecurityGroups:
- !Ref EFSSecurityGroup
MountTargetAZ2:
Type: AWS::EFS::MountTarget
Properties:
FileSystemId: !Ref ProductionEFS
SubnetId: !Ref PrivateSubnet2
SecurityGroups:
- !Ref EFSSecurityGroup
MountTargetAZ3:
Type: AWS::EFS::MountTarget
Properties:
FileSystemId: !Ref ProductionEFS
SubnetId: !Ref PrivateSubnet3
SecurityGroups:
- !Ref EFSSecurityGroup
Conditions:
IsProvisionedMode: !Equals [!Ref ThroughputMode, provisioned]
Outputs:
FileSystemId:
Description: 'EFS File System ID'
Value: !Ref ProductionEFS
Export:
Name: !Sub '${AWS::StackName}-FileSystemId'
FileSystemDNS:
Description: 'EFS DNS name for mounting'
Value: !Sub '${ProductionEFS}.efs.${AWS::Region}.amazonaws.com'
Export:
Name: !Sub '${AWS::StackName}-FileSystemDNS'
アクセスポイントの実装
yaml
# EFSアクセスポイントのCloudFormation実装
# Webアプリケーション用アクセスポイント
WebAppAccessPoint:
Type: AWS::EFS::AccessPoint
Properties:
FileSystemId: !Ref ProductionEFS
PosixUser:
Uid: 1000
Gid: 1000
RootDirectory:
Path: '/web-app'
CreationInfo:
OwnerUid: 1000
OwnerGid: 1000
Permissions: '755'
AccessPointTags:
- Key: Name
Value: WebApp-AccessPoint
- Key: Purpose
Value: WebApplication
# 共有データ用アクセスポイント
SharedDataAccessPoint:
Type: AWS::EFS::AccessPoint
Properties:
FileSystemId: !Ref ProductionEFS
PosixUser:
Uid: 2000
Gid: 2000
RootDirectory:
Path: '/shared'
CreationInfo:
OwnerUid: 2000
OwnerGid: 2000
Permissions: '777'
AccessPointTags:
- Key: Name
Value: SharedData-AccessPoint
- Key: Purpose
Value: SharedData
# ログ格納用アクセスポイント
LogsAccessPoint:
Type: AWS::EFS::AccessPoint
Properties:
FileSystemId: !Ref ProductionEFS
PosixUser:
Uid: 1001
Gid: 1001
RootDirectory:
Path: '/logs'
CreationInfo:
OwnerUid: 1001
OwnerGid: 1001
Permissions: '750'
AccessPointTags:
- Key: Name
Value: Logs-AccessPoint
- Key: Purpose
Value: LogStorage
EFS設計の考慮事項
yaml
EFS設計原則:
性能設計:
- Performance Mode: generalPurpose(低レイテンシー)または maxIO(高並行性)
- Throughput Mode: bursting(コスト効率)または provisioned(一貫性能)
- 暗号化: 保存時・転送時の両方を有効化
セキュリティ設計:
- VPC内プライベートサブネットに配置
- セキュリティグループで NFS(2049)ポートを制限
- アクセスポイントによる細粒度アクセス制御
- IAMポリシーによる操作権限管理
可用性設計:
- 複数AZにマウントターゲット配置
- 自動的な冗長化とレプリケーション
- リージョナルサービスによる高可用性
運用設計:
- バックアップポリシーの設定
- CloudWatch監視とアラート
- コスト最適化(使用量ベース課金)
パフォーマンスモードの選択
yaml
EFS性能最適化ガイドライン:
Performance Mode選択:
General Purpose:
- 使用例: 一般的なWebアプリケーション
- 特徴: 低レイテンシー(~2.9ms)
- 制限: 7,000 NFS操作/秒まで
- 推奨: 大部分のワークロードに最適
Max IO:
- 使用例: 高並行性、多数のクライアント
- 特徴: 高いスループット
- トレードオフ: やや高いレイテンシー(~5.8ms)
- 推奨: 1,000+ 並行クライアントの場合
Throughput Mode選択:
Bursting:
- 特徴: ファイルシステムサイズに基づくバースト
- ベースライン: 50 MiB/s per TB
- バースト: 100 MiB/s per TB(最初12時間)
- コスト: 追加料金なし
Provisioned:
- 特徴: 必要なスループットを事前指定
- 範囲: 1 MiB/s - 4,000 MiB/s
- コスト: プロビジョンド分の料金
- 推奨: 一貫した高スループットが必要な場合
ワークロード別推奨設定:
Webアプリケーション:
- Performance: generalPurpose
- Throughput: bursting
- 理由: コストバランスと性能の最適化
ビッグデータ分析:
- Performance: maxIO
- Throughput: provisioned (500+ MiB/s)
- 理由: 高並行性と一貫したスループット要件
EFS暗号化とセキュリティ
包括的なセキュリティ設定
EFSのセキュリティ実装では、暗号化、アクセス制御、ネットワークセキュリティを包括的に設定します。
yaml
# セキュリティ強化されたEFS実装
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Security-enhanced EFS Implementation'
Resources:
# EFSファイルシステム(暗号化有効)
SecureEFS:
Type: AWS::EFS::FileSystem
Properties:
CreationToken: !Sub 'secure-efs-${AWS::StackName}'
Encrypted: true
KmsKeyId: !Ref EFSKMSKey
PerformanceMode: generalPurpose
ThroughputMode: bursting
FileSystemPolicy:
Version: '2012-10-17'
Statement:
# TLS暗号化の強制
- Sid: RequireTLS
Effect: Deny
Principal: '*'
Action: '*'
Resource: !Sub 'arn:aws:elasticfilesystem:${AWS::Region}:${AWS::AccountId}:file-system/*'
Condition:
Bool:
aws:SecureTransport: 'false'
# アクセスポイント経由のアクセスのみ許可
- Sid: RequireAccessPoint
Effect: Deny
Principal: '*'
Action: '*'
Resource: !Sub 'arn:aws:elasticfilesystem:${AWS::Region}:${AWS::AccountId}:file-system/*'
Condition:
StringEquals:
elasticfilesystem:AccessPointArn: ''
# 専用KMSキー
EFSKMSKey:
Type: AWS::KMS::Key
Properties:
Description: 'EFS Encryption Key'
KeyPolicy:
Version: '2012-10-17'
Statement:
- Sid: Enable IAM User Permissions
Effect: Allow
Principal:
AWS: !Sub 'arn:aws:iam::${AWS::AccountId}:root'
Action: 'kms:*'
Resource: '*'
- Sid: Allow EFS Service
Effect: Allow
Principal:
Service: elasticfilesystem.amazonaws.com
Action:
- kms:Decrypt
- kms:GenerateDataKey
Resource: '*'
EFSKMSKeyAlias:
Type: AWS::KMS::Alias
Properties:
AliasName: alias/efs-encryption-key
TargetKeyId: !Ref EFSKMSKey
# セキュリティグループ(最小権限)
EFSSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: 'Restricted access for EFS'
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 2049
ToPort: 2049
SourceSecurityGroupId: !Ref ApplicationSecurityGroup
Description: 'NFS access from application tier only'
# バックアップポリシー
EFSBackupPolicy:
Type: AWS::EFS::BackupPolicy
Properties:
FileSystemId: !Ref SecureEFS
BackupPolicy:
Status: ENABLED
EFS Client接続とマウント最適化
高性能マウント設定
yaml
EFS最適化マウントオプション:
一般的なワークロード:
オプション: "nfsvers=4.1,rsize=1048576,wsize=1048576,hard,intr,timeo=600,retrans=2"
特徴: バランスの取れた性能と信頼性
用途: Webアプリケーション、一般的なファイル共有
高スループットワークロード:
オプション: "nfsvers=4.1,rsize=1048576,wsize=1048576,hard,intr,timeo=600,retrans=2,fsc"
特徴: ローカルキャッシュ有効
用途: 大容量ファイル処理、メディア配信
低レイテンシ重視:
オプション: "nfsvers=4.1,rsize=65536,wsize=65536,hard,intr,timeo=150,retrans=3"
特徴: 小さなI/Oサイズで高応答性
用途: リアルタイムアプリケーション
多数の小ファイル処理:
オプション: "nfsvers=4.1,rsize=65536,wsize=65536,hard,intr,timeo=600,retrans=2,actimeo=1"
特徴: 属性キャッシュ時間を短縮
用途: 開発環境、多数のファイル操作
推奨マウントコマンド:
TLS暗号化: "sudo mount -t efs -o tls <file-system-id> /mount/point"
アクセスポイント使用: "sudo mount -t efs -o tls,accesspoint=<access-point-id> <file-system-id> /mount/point"
自動マウント設定: "/etc/fstab に追加: <file-system-id> /mount/point efs tls,_netdev 0 0"
EFS監視とパフォーマンス分析
CloudWatch監視実装
yaml
# EFS監視CloudFormationテンプレート
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Comprehensive EFS Monitoring'
Resources:
# EFSスループット監視アラーム
EFSThroughputAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Sub 'EFS-ThroughputUtilization-${FileSystemId}'
AlarmDescription: 'EFS throughput utilization is high'
MetricName: ThroughputUtilization
Namespace: AWS/EFS
Statistic: Maximum
Period: 300
EvaluationPeriods: 2
Threshold: 90
ComparisonOperator: GreaterThanThreshold
Dimensions:
- Name: FileSystemId
Value: !Ref FileSystemId
# バーストクレジット監視
EFSBurstCreditAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Sub 'EFS-BurstCreditBalance-${FileSystemId}'
AlarmDescription: 'EFS burst credit balance is low'
MetricName: BurstCreditBalance
Namespace: AWS/EFS
Statistic: Minimum
Period: 300
EvaluationPeriods: 2
Threshold: 1000000000 # 1GB相当
ComparisonOperator: LessThanThreshold
EFS監視の重要指標:
性能メトリクス:
- DataReadIOBytes/DataWriteIOBytes: データ転送量
- MetadataIOBytes: メタデータ操作量
- ThroughputUtilization: スループット使用率
- PercentIOLimit: I/O制限到達率
接続メトリクス:
- ClientConnections: 接続クライアント数
- BurstCreditBalance: バーストクレジット残高
推奨アラート設定:
- スループット使用率: 90%以上
- バーストクレジット: 1GB未満
- クライアント接続数: 5,000以上
Infrastructure as Code (IaC)による運用の重要性
IaCアプローチのメリット
yaml
EFS運用におけるIaCの価値:
構成管理:
- 宣言的な設定による一貫性確保
- 環境間の構成差異の排除
- 設定変更の追跡可能性
セキュリティガバナンス:
- 暗号化設定の標準化
- アクセス制御ポリシーの一元管理
- コンプライアンス要件への対応
運用効率化:
- 自動バックアップ設定の標準化
- 監視・アラート設定の自動展開
- 障害時の迅速な復旧
コスト最適化:
- 不要リソースの自動削除
- 適切なサイジングの実装
- タグベースのコスト管理
Python手続き型アプローチの問題点:
- 実行後の状態把握困難
- 構成ドリフトの発生
- エラー時のロールバック複雑化
- チーム間の設定共有困難
まとめ
Amazon EFSは、スケーラブルでフルマネージドなファイルシステムとして、従来のオンプレミスファイルサーバーの課題を解決します。本番環境での効果的な活用には以下が重要です:
1. Infrastructure as Code による管理
- CloudFormation/CDK: 宣言的なインフラ定義
- セキュリティファースト: 暗号化とアクセス制御の標準化
- 再現可能な構成: 環境間の一貫性確保
2. 適切な性能設計
- Performance Mode: ワークロード特性に応じた選択
- Throughput Mode: コストと性能のバランス
- アクセスポイント: 細粒度アクセス制御の実装
3. 包括的な運用戦略
- 監視とアラート: CloudWatchによる自動監視
- バックアップ戦略: 自動化されたライフサイクル管理
- セキュリティ強化: TLS暗号化とIAMポリシー
Infrastructure as Codeアプローチにより、エンタープライズレベルの要件に対応できる、管理しやすく監査可能なEFSインフラストラクチャを構築できます。
引用元: