O armazenamento em nuvem é um dos pilares da infraestrutura moderna, permitindo que dados sejam persistidos, acessados e escalados de forma elástica. Nesta aula, vamos mergulhar nos principais tipos de armazenamento — object, block e file —, entender como eles se diferenciam e quando usar cada um. Também veremos uma visão geral dos bancos de dados gerenciados, que são serviços que abstraem a complexidade de operar um banco, e discutiremos os fatores que impactam os custos na nuvem.

Dominar esses conceitos é essencial para qualquer profissional de DevOps, pois a escolha correta de armazenamento afeta diretamente desempenho, disponibilidade, escalabilidade e orçamento. Vamos explorar cada tópico com exemplos práticos usando a AWS como referência, mas os conceitos se aplicam a outros provedores como Azure e GCP.

Object storage

O object storage é um modelo de armazenamento que trata os dados como objetos discretos, cada um com seus metadados e um identificador único (chave). Ele é projetado para escalar horizontalmente e é ideal para dados não estruturados, como imagens, vídeos, backups, logs e arquivos estáticos. Diferente de um sistema de arquivos tradicional, não há hierarquia de diretórios; em vez disso, usa-se um namespace plano (bucket) com chaves que podem simular uma estrutura.

O exemplo mais conhecido é o Amazon S3 (Simple Storage Service). No S3, você cria buckets, faz upload de objetos, define políticas de acesso e versionamento. O object storage é altamente durável (geralmente 99,999999999% de durabilidade) e oferece classes de armazenamento para otimizar custos, como S3 Standard, S3 Glacier para arquivamento, etc. O acesso é feito via API REST ou SDKs, e é comum integrar com CDNs para distribuição global de conteúdo.

Exemplo de uso com AWS CLI para fazer upload de um arquivo:

# Criar um bucket (nome globalmente único)
aws s3api create-bucket --bucket meu-bucket-exemplo --region us-east-1

# Fazer upload de um arquivo
aws s3 cp meu-arquivo.txt s3://meu-bucket-exemplo/

# Listar objetos
aws s3 ls s3://meu-bucket-exemplo/

No dia a dia, o object storage é usado para hospedar sites estáticos, armazenar mídias, fazer backup de bancos de dados e armazenar dados para análise (data lakes). Sua escalabilidade ilimitada e baixo custo por GB o tornam a escolha padrão para dados frios e quentes.

Block e file storage

O block storage divide os dados em blocos de tamanho fixo e os armazena em volumes, que são montados em máquinas virtuais (VMs) como discos rígidos virtuais. Cada bloco tem seu próprio endereço, mas o sistema operacional gerencia a organização. É o tipo de armazenamento mais comum para discos de VMs, oferecendo baixa latência e alto desempenho. Na AWS, o serviço é o Amazon EBS (Elastic Block Store). Os volumes EBS são anexados a uma instância EC2 e podem ser dimensionados conforme necessidade.

O file storage, por sua vez, fornece um sistema de arquivos compartilhado acessível por múltiplas máquinas, usando protocolos como NFS e SMB. Na AWS, temos o Amazon EFS (Elastic File System) para NFS e o Amazon FSx para Windows File Server (SMB). Ele é ideal para aplicações que exigem compartilhamento de arquivos entre servidores, como clusters, ferramentas de análise e sistemas legados.

Exemplo de criação de um volume EBS e anexação a uma instância:

# Criar um volume EBS de 10 GiB na mesma zona da instância
aws ec2 create-volume --availability-zone us-east-1a --size 10 --volume-type gp3

# Anexar o volume à instância (substitua pelos IDs reais)
aws ec2 attach-volume --volume-id vol-1234567890abcdef0 --instance-id i-0abcdef1234567890 --device /dev/sdf

Em resumo, block storage é como um disco rígido interno (baixa latência, alto desempenho), enquanto file storage é como um servidor de arquivos compartilhado (acesso concorrente). A escolha depende do caso de uso: bancos de dados geralmente usam block, aplicações distribuídas podem usar file, e conteúdo estático usa object.

Bancos gerenciados (visão geral)

Bancos de dados gerenciados são serviços em nuvem que oferecem bancos de dados prontos para uso, sem que o usuário precise se preocupar com instalação, configuração, backup, replicação ou patches. O provedor cuida da infraestrutura subjacente, permitindo que a equipe foque no esquema e nas consultas. Exemplos incluem Amazon RDS (relacional), Amazon DynamoDB (NoSQL), Amazon Redshift (data warehouse) e serviços equivalentes na Azure (Azure SQL Database, Cosmos DB) e GCP (Cloud SQL, Firestore).

Esses serviços oferecem alta disponibilidade, escalabilidade automática (em alguns casos), backups automáticos e monitoramento integrado. No entanto, eles têm custos maiores do que rodar seu próprio banco em uma VM, mas economizam tempo de operação. Para escolher, considere o modelo de dados (relacional vs. NoSQL), requisitos de consistência, padrão de acesso e orçamento.

Exemplo de criação de um banco RDS MySQL via CLI:

# Criar uma instância RDS MySQL (substitua os parâmetros)
aws rds create-db-instance \
    --db-instance-identifier meu-banco \
    --db-instance-class db.t3.micro \
    --engine mysql \
    --master-username admin \
    --master-user-password senha-segura \
    --allocated-storage 20 \
    --backup-retention-period 7

Bancos gerenciados são a opção recomendada para a maioria das aplicações, pois reduzem a carga operacional e aumentam a confiabilidade. No entanto, para workloads muito específicos ou com requisitos extremos de customização, pode-se optar por auto-gerenciados.

Custos

Os custos de armazenamento em nuvem variam conforme o tipo, a região, a capacidade provisionada, a quantidade de operações de leitura/escrita e a duração do armazenamento. No object storage, você paga pelo volume armazenado (GB/mês) e pelas operações (PUT, GET, etc.). Classes de armazenamento como Glacier são mais baratas para dados raramente acessados, mas têm custos de recuperação. No block storage, você paga pela capacidade provisionada (mesmo que não use totalmente) e por snapshots. No file storage, paga pela capacidade provisionada ou pelo throughput.

Para bancos gerenciados, o custo inclui a instância (CPU/memória), o armazenamento alocado, I/O, backups e transferência de dados. É importante dimensionar corretamente e usar recursos como Auto Scaling para otimizar custos. Além disso, a transferência de dados para fora da nuvem (egress) geralmente é cobrada, então evite mover dados desnecessariamente.

Exemplo de estimativa de custo: no S3, o preço é de cerca de $0.023 por GB/mês (padrão), enquanto no EBS gp3 é $0.08 por GB/mês. No RDS, uma instância db.t3.micro custa cerca de $0.016/hora + armazenamento. Use calculadoras oficiais, como a AWS Pricing Calculator, para estimar custos com precisão.

Boas práticas para reduzir custos: usar lifecycle policies para mover objetos para classes mais baratas, usar volumes EBS com capacidade provisionada adequada, desligar recursos não utilizados, e escolher a região mais barata quando possível.

Boas práticas e observações finais

Ao projetar soluções de armazenamento, comece pelos requisitos de acesso e durabilidade. Para dados críticos, use redundância (como S3 Standard ou EBS Multi-AZ). Para arquivamento, use Glacier. Monitore sempre o uso e os custos com ferramentas como AWS Cost Explorer. Lembre-se de que a escolha do tipo de armazenamento impacta não só o custo, mas também a latência e a escalabilidade. Teste diferentes configurações e use o modelo de custo total de propriedade (TCO) para tomar decisões.

Referências

Exercícios

  1. Qual é a principal diferença entre object storage e block storage? Em que cenário você usaria cada um?

    ✓ Resposta: Object storage trata dados como objetos com metadados e chave única, ideal para dados não estruturados e escalabilidade massiva (ex.: S3). Block storage divide dados em blocos e é montado como disco em VMs, oferecendo baixa latência (ex.: EBS). Use object para backups, mídias, logs; use block para discos de servidores e bancos de dados.
  2. Descreva o que é um banco de dados gerenciado e cite dois benefícios e uma desvantagem em relação a um banco auto-gerenciado.

    ✓ Resposta: Banco gerenciado é um serviço onde o provedor cuida da infraestrutura, patches, backups e alta disponibilidade. Benefícios: redução de carga operacional e maior confiabilidade. Desvantagem: custo mais alto e menor controle sobre a configuração do servidor.
  3. Como você reduziria os custos de armazenamento de objetos que são acessados raramente? Dê um exemplo de comando AWS CLI para aplicar uma política de ciclo de vida.

    ✓ Resposta: Para reduzir custos, use classes de armazenamento como S3 Glacier ou políticas de ciclo de vida para mover objetos automaticamente. Exemplo de comando:
    aws s3api put-bucket-lifecycle-configuration --bucket meu-bucket --lifecycle-configuration '{"Rules":[{"Status":"Enabled","Prefix":"","Transitions":[{"Days":30,"StorageClass":"STANDARD_IA"},{"Days":90,"StorageClass":"GLACIER"}]}]}'
  4. Qual serviço da AWS você usaria para compartilhar arquivos entre múltiplas instâncias EC2 usando o protocolo NFS? Explique brevemente.

    ✓ Resposta: O Amazon EFS (Elastic File System) é um serviço de file storage compatível com NFS, projetado para ser montado em múltiplas instâncias EC2, fornecendo armazenamento compartilhado e escalável.
  5. Cite dois fatores que influenciam o custo de um banco de dados gerenciado e como você poderia otimizá-los.

    ✓ Resposta: Fatores: tamanho da instância (CPU/memória) e armazenamento alocado. Para otimizar, escolha o tipo de instância adequado à carga, use Auto Scaling, reduza o armazenamento provisionado ao mínimo necessário e remova backups antigos.