Pubblicato il 23/03/2024 da alnao nella categoria AWS

Amazon Elastic File System, abbreviato con la sigla EFS, è un servizio pensato per offrire un’archiviazione di file serverless completamente elastica che ti aiuta a condividere i dati senza effettuare la configurazione del provisioning o gestire la capacità di archiviazione e le prestazioni, presenta alcune caratteristiche principali:

  • è un servizio interamente gestito: l’infrastruttura di gestione dello storage non è gestita dall’utente
  • è un servizio elastico: è possibile memorizzare petabyte di dati e le dimensioni del filesystem si adattano automaticamente in caso di aggiunta e rimozione dei file. Non è necessario allocare anticipatamente dimensioni specifiche.
  • supporta migliaia di connnesioni ad istanze EC2 connesse simultaneamente

Queste caratteristiche lo differenziano da EBS (non elastico e usabile da una sola istanza) e S3 che necessita di API per lo scambio di dati.

Si rimanda alla documentazione ufficiale per tutti i dettagli del servizio, l’uso di questo servizio può necessitare un approfondimento riguardo ai temi di ciclo di vita (Intelligent-Tiering), le regole di replica e backup, il tipo di protocollo NFS v4.0 e 4.1 e la gestione della crittografia. Come tutti i servizi di AWS, questi sono a pagamento in base all’uso, per esempio in Irlanda il costo nella regione irlandese è di 0,33 USD per Gb al mese, si rimanda sempre alla pagina ufficiale per tutti i dettagli. Usando questo servizio bisogna sempre ricordare la gestione delle regole di accesso, in particolare ogni filesystem mette a disposizione dei punti di mount del tipo:

fs-<id>.efs.<region>.amazonaws.com

in aggiunta al endpoint devono essere configurate le subnet: di fatto il disco EFS viene assegnato ad una VPC e viene “posizionato” in almeno una subnet. Inoltre deve SEMPRE essere presente un security group nella sezione “Network access” per le impostazioni di accesso al disco: deve essere configurato il protocollo NFS per permettere alle istanze EC2 o gli altri servizi ad accedere al disco, senza queste istruzioni il disco non sarà disponibile da nessun punto del Cloud.

Per le istanze EC2 con sistema operativo GNU Linux è possibile eseguire il mount nello user-data grazie ad un pacchetto “amazon-efs-utils” installabile in fase di avvio delle istanze, un semplice esempio di script per eseguire il mount:

#!/bin/bash -xe
yum update -y aws-cfn-bootstrap
sudo yum install -y amazon-efs-utils
sudo mkdir /mnt/efs
sudo chmod 777 /mnt/efs 
sudo mount -t efs -o tls fs-<id> /mnt/efs

La CLI mette a disposizione una serie di comandi per la gestione dei dischi EFS,

  • creazione di un file system
    aws efs create-file-system --performance-mode generalPurpose --throughput-mode bursting --encrypted --tags Key=Name,Value=my-file-system
  • creazione di un punto di mount
    aws efs create-mount-target --file-system-id fs-0baed24c56c977151 --subnet-id subnet-xxxx --security-groups sg-xxxx
  • descrizione di un disco EFS
    aws efs describe-file-systems --file-system-id fs-0baed24c56c977151
  • rimozione di un disco
    aws efs delete-file-system --file-system-id fs-0baed24c56c977151

Con CloudFormation è possibile creare e gestire dischi creati con EFS, si rimanda sempre alla documentazione ufficiale per tutti i dettagli. Un semplice esempio di costruzione di un File system con EFS:

FileSystem:
  Type: AWS::EFS::FileSystem
  Properties:
    Encrypted: !Ref Encryption
    FileSystemTags:
    - Key: Name
      Value: !If [hasFsTags, !Ref FileSystemName, !Sub "${AWS::StackName}FileSystem"]
    KmsKeyId: !If [useDefaultCMK, !Ref "AWS::NoValue", !Ref KmsKeyId]
    PerformanceMode: !Ref PerformanceMode
    ThroughputMode: !Ref ThroughputMode
    ProvisionedThroughputInMibps: !If [provisionedThroughputMode, !Ref ProvisionedThroughputInMibps, !Ref 'AWS::NoValue']
MountTargetSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: FileSystem Security Group
    VpcId: !Ref VpcId
    GroupName: !If [hasFsTags, !Join ["", [!Ref FileSystemName, "SecurityGroup"]], !Join ["", [!Ref "AWS::StackName", "FileSystemSecurityGroup"]]]
    SecurityGroupIngress:
    - IpProtocol: "tcp"
      FromPort: !Ref FileSharePort
      ToPort: !Ref FileSharePort
      SourceSecurityGroupId: !Ref OriginSecurityGroup

In questo esempio la istanza EC2 esegue il mount del disco nel user data con i comandi:

- |
  sudo yum install -y amazon-efs-utils
  sudo mkdir /mnt/efs
  sudo chmod 777 /mnt/efs 
- 'sudo mount -t efs -o tls '
- !Ref EFSFileSystemId
- ':/ /mnt/efs '

Bisogna sempre ricordarsi che deve essere presente un security group collegato all’istanza EC2 e al disco EFS per gestire il collegamento tra le due risorse: il traffico in l’output dalla EC2 deve essere abilitato per essere in input al disco EFS, per esempio è possibile definire un security group:

MountTargetSecurityGroup:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: FileSystem Security Group
    VpcId: !Ref VpcId
    GroupName: !If [hasFsTags, !Join ["", [!Ref FileSystemName, "SecurityGroup"]], !Join ["", [!Ref "AWS::StackName", "FileSystemSecurityGroup"]]]
    SecurityGroupIngress:
    - IpProtocol: "tcp"
      FromPort: !Ref FileSharePort
      ToPort: !Ref FileSharePort
      SourceSecurityGroupId: !Ref OriginSecurityGroup

L’esempio completo può essere trovato al solito repository:

https://github.com/alnao/AWSCloudFormationExamples/tree/master/Esempio19efsEc2
MENU