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インフラストラクチャを構築できます。


引用元: