AWS Admin

O que Todo Dev Deve Saber sobre EBS e EFS: Block Storage vs File Storage em Casos Reais Já leu

O Que Todo Dev Deve Saber sobre EBS e EFS A escolha entre armazenamento em bloco (EBS) e arquivo (EFS) é uma das decisões mais críticas ao arquitetar soluções na AWS. Ambas são soluções robustas, mas servem propósitos fundamentalmente diferentes. EBS (Elastic Block Storage) funciona como um disco rígido tradicional anexado a uma instância EC2, enquanto EFS (Elastic File System) é um sistema de arquivos compartilhado acessível por múltiplas instâncias simultaneamente. Entender essas diferenças não é apenas teórico — impacta diretamente performance, custo e escalabilidade de suas aplicações. Quando Usar EBS EBS é ideal para aplicações que precisam de armazenamento de alta performance dedicado a uma única instância. Cada volume EBS é anexado a uma instância EC2 e funciona como um disco persistente. Use EBS quando trabalha com bancos de dados (RDS, MySQL em EC2), aplicações que exigem IOPS previsível ou quando a instância é o ponto único de acesso ao dado. Os volumes podem ser encriptados, ter snapshots automáticos

O Que Todo Dev Deve Saber sobre EBS e EFS

A escolha entre armazenamento em bloco (EBS) e arquivo (EFS) é uma das decisões mais críticas ao arquitetar soluções na AWS. Ambas são soluções robustas, mas servem propósitos fundamentalmente diferentes. EBS (Elastic Block Storage) funciona como um disco rígido tradicional anexado a uma instância EC2, enquanto EFS (Elastic File System) é um sistema de arquivos compartilhado acessível por múltiplas instâncias simultaneamente. Entender essas diferenças não é apenas teórico — impacta diretamente performance, custo e escalabilidade de suas aplicações.

Quando Usar EBS

EBS é ideal para aplicações que precisam de armazenamento de alta performance dedicado a uma única instância. Cada volume EBS é anexado a uma instância EC2 e funciona como um disco persistente. Use EBS quando trabalha com bancos de dados (RDS, MySQL em EC2), aplicações que exigem IOPS previsível ou quando a instância é o ponto único de acesso ao dado. Os volumes podem ser encriptados, ter snapshots automáticos e redimensionados sem downtime (em muitos casos).

Exemplo prático — Configurando e montando um volume EBS:

#!/bin/bash
# 1. Criar volume EBS (via CLI)
aws ec2 create-volume --size 100 --availability-zone us-east-1a --volume-type gp3

# 2. Anexar à instância (substitua os IDs)
aws ec2 attach-volume --volume-id vol-1234567 --instance-id i-1234567 --device /dev/sdf

# 3. Dentro da instância EC2, formatar e montar
sudo mkfs -t ext4 /dev/nvme1n1
sudo mkdir -p /data
sudo mount /dev/nvme1n1 /data
sudo chmod 777 /data

# 4. Para montar automaticamente ao boot, adicione ao /etc/fstab
echo "/dev/nvme1n1 /data ext4 defaults,nofail 0 2" | sudo tee -a /etc/fstab

Quando Usar EFS

EFS é um sistema de arquivos gerenciado que permite compartilhamento entre múltiplas instâncias EC2 em diferentes zonas de disponibilidade. É ideal para aplicações que precisam de acesso compartilhado (servidores web em Auto Scaling Groups, processamento distribuído, CI/CD pipelines). EFS cresce automaticamente conforme você escreve dados — não precisa pré-alocar espaço como em EBS.

Exemplo prático — Configurando EFS com Terraform:

# Criar o sistema de arquivos EFS
resource "aws_efs_file_system" "app_efs" {
  performance_mode = "generalPurpose"
  throughput_mode  = "bursting"
  encrypted        = true

  tags = {
    Name = "app-efs"
  }
}

# Criar mount targets em múltiplas AZs
resource "aws_efs_mount_target" "efs_mount_az1" {
  file_system_id      = aws_efs_file_system.app_efs.id
  subnet_id           = aws_subnet.private_az1.id
  security_groups     = [aws_security_group.efs_sg.id]
}

# Montar em uma instância EC2
resource "aws_instance" "web_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.micro"
  subnet_id     = aws_subnet.private_az1.id

  user_data = base64encode(<<-EOF
              #!/bin/bash
              sudo apt-get update
              sudo apt-get install -y nfs-common
              sudo mkdir -p /mnt/efs
              sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 \
                ${aws_efs_file_system.app_efs.dns_name}:/ /mnt/efs
              EOF
  )
}

Comparação Prática: EBS vs EFS

Aspecto EBS EFS
Acesso Uma instância Múltiplas instâncias
Performance Previsível (IOPS fixo) Escalável automaticamente
Preço Paga pelo tamanho alocado Paga pelo uso real
Use case BD, aplicações single-server Compartilhamento, Auto Scaling
Crescimento Manual Automático

Um caso real: você está rodando um WordPress em Auto Scaling Group. Com EBS, cada nova instância teria seu próprio storage — impossível compartilhar arquivos de upload. Com EFS, todas as instâncias veem os mesmos arquivos. Outro exemplo: um banco de dados PostgreSQL em uma única instância ec2 deve usar EBS (mais rápido e previsível) em vez de EFS.

Otimização e Boas Práticas

Para EBS, use volumes gp3 (melhor custo-benefício que gp2) e implemente snapshots para backup automatizado. Monitore IOPS e throughput com CloudWatch. Para EFS, prefira modo de throughput provisioned apenas se realmente precisar — bursting é mais econômico para cargas variáveis. Use IAM policies para controlar acesso e sempre encryte ambos em produção.

Script Python para monitorar EBS:

import boto3
from datetime import datetime, timedelta

ec2 = boto3.client('ec2', region_name='us-east-1')
cloudwatch = boto3.client('cloudwatch', region_name='us-east-1')

# Listar volumes EBS
volumes = ec2.describe_volumes()['Volumes']

for vol in volumes:
    vol_id = vol['VolumeId']

    # Obter métricas de IOPS
    response = cloudwatch.get_metric_statistics(
        Namespace='AWS/EBS',
        MetricName='VolumeReadOps',
        Dimensions=[{'Name': 'VolumeId', 'Value': vol_id}],
        StartTime=datetime.utcnow() - timedelta(hours=1),
        EndTime=datetime.utcnow(),
        Period=300,
        Statistics=['Average', 'Maximum']
    )

    print(f"Volume {vol_id}: {response['Datapoints']}")

Conclusão

Três pontos-chave: (1) EBS é seu disco rígido — use para performance garantida e dados que pertencem a uma instância específica; (2) EFS é seu servidor de arquivos compartilhado — use quando múltiplas instâncias precisam acessar os mesmos dados; (3) Custe a escolha: EFS é mais caro por GB, mas elimina complexidade de sincronização e é ideal para arquiteturas escaláveis. Na dúvida, protótipo com EFS em desenvolvimento e avalie custo/performance antes de produção.

Referências


Artigos relacionados