🧠FFVAcademy
🪣

S3 Profundo: Classes, Lifecycle, Replication e Criptografia

15 min de leitura·+80 XP

S3 é o serviço mais antigo da AWS (2006) e, provavelmente, o mais cobrado no SAA-C03. Não é só “um bucket onde jogo arquivo”: é object store com 8 storage classes, lifecycle transitions, replicação cross-region/cross-account, WORM para compliance, 4 modos de criptografia e performance tuning. Saber escolher a classe certa pode reduzir o custo em 80% — e cair em pegadinha de classe errada é quase garantido na prova.

📘 Cost-Optimized· 20%
📘 Secure· 30%
📘 Resilient· 26%

Modelo mental: S3 é object store, não file system

Cada objeto é um blob imutável com key (caminho completo tipo fotos/2026/abril/ana.jpg), metadados e tags. O “/” no nome é só visual — S3 não tem pastas reais, só prefixos. Você não edita objeto; você sobrescreve. E se Versioning estiver ligado, cada sobrescrita cria uma nova versão.

BucketContainer global único. Nome precisa ser único no mundo. Vive em 1 região.
ObjectArquivo + metadata + tags. Até 5 TB. Key até 1024 bytes.
KeyNome completo incluindo prefixos. S3 ordena lexicograficamente.
PrefixSubstring da key. Define paralelismo de I/O e escopo de policies.
ETagHash do objeto (MD5 para single PUT; hash-of-hashes para multipart).
Version IDIdentificador único quando Versioning está ligado. null se desligado.

As 8 storage classes — a pegadinha mais comum do SAA

Decorar classes não é suficiente — você precisa saber quando cada uma ganha. Os vetores de decisão são: (1) frequência de acesso, (2) latência tolerada, (3) duração mínima cobrada, (4) custo de retrieval, (5) durabilidade multi-AZ ou single-AZ.

ClasseCasos de usoLatênciaMínimo cobradoCusto armazenamento*
S3 StandardDados quentes, aplicações, conteúdo webmsNenhum$$$$ (0,023/GB)
S3 Intelligent-TieringPadrão de acesso desconhecido/mutávelms30 dias$$$ + $0,0025/1k obj monitor
S3 Standard-IABackups, DR secundário, acesso mensalms30 dias + 128KB$$ (0,0125/GB)
S3 One Zone-IARéplica secundária de dados já replicadosms30 dias + 128KB$ (0,01/GB) — 1 AZ só
S3 Glacier Instant RetrievalImagens médicas, mídia acessada 1x/trimestrems90 dias + 128KB$ (0,004/GB)
S3 Glacier Flexible RetrievalArquivamento, compliance com acesso mensal1min–12h90 dias + 40KB$ (0,0036/GB)
S3 Glacier Deep ArchiveArquivamento long-term 7–10 anos12h ou 48h180 dias + 40KB¢ (0,00099/GB)
S3 Express One ZoneML training, analytics high-IOPS single-AZsub-msNenhum$$$$$ — 10× mais rápido

* Preços us-east-1 referência abril/2026, podem variar. Foco no ordenamento relativo, não no número absoluto.

Intelligent-Tiering: quando o padrão é imprevisível

Esta classe monitora acessos por objeto e move automaticamente entre tiers. Cobra um pequeno fee de monitoramento ($0,0025 por 1.000 objetos), mas elimina o risco de pagar Standard para dados frios. Tiers internos:

🧠 Intelligent-Tiering tiers (automáticos)

  • Frequent Access — default, objeto recém-escrito ou acessado nos últimos 30d
  • Infrequent Access — sem acesso por 30d, custo ~40% menor
  • Archive Instant Access — sem acesso por 90d, custo ~68% menor, latência ms
  • Archive Access (opt-in) — sem acesso por 90–730d, minutos para recuperar
  • Deep Archive Access (opt-in) — sem acesso por 180–730d, horas para recuperar

Lifecycle policies — automatize a redução de custo

Regras de lifecycle aplicam transições e expirações a objetos baseados em idade, tags ou prefixo. Você não paga pela transição de forma gratuita — cada transição entre classes tem um custo por 1.000 requisições (além do mínimo de dias da classe de destino). Por isso, transitions sem critério podem aumentar custo.

json
{
  "Rules": [{
    "ID": "arquivar-logs-antigos",
    "Status": "Enabled",
    "Filter": { "Prefix": "logs/" },
    "Transitions": [
      { "Days": 30,  "StorageClass": "STANDARD_IA" },
      { "Days": 90,  "StorageClass": "GLACIER_IR" },
      { "Days": 365, "StorageClass": "DEEP_ARCHIVE" }
    ],
    "Expiration": { "Days": 2555 },
    "NoncurrentVersionExpiration": { "NoncurrentDays": 30 }
  }]
}
⚠️
Pegadinha: você não pode pular direto de Standard para Glacier Flexible e depois voltarpara IA — transitions são sempre “descendo” na hierarquia de custo. Também não faz sentido transitar para uma classe mais cara (e a API rejeita).

Versioning e Object Lock — duas camadas diferentes de proteção

RecursoVersioningObject Lock
ObjetivoRecuperar sobrescrita/delete acidentalCompliance WORM, ninguém deleta
DeleteCria delete marker; versão anterior acessívelBloqueia delete até retention expirar
MFA DeleteExige MFA para remover versão ou desligarN/A
Pré-requisitoOpcionalVersioning obrigatório; bucket criado com Object Lock ON
ModosN/AGovernance (admin pode override) ou Compliance (ninguém, nem root)
HoldsN/ALegal Hold (indefinido) + Retention period
Uso típicoQualquer bucket com dados importantesSEC 17a-4, HIPAA, logs imutáveis
🗺️ Fluxo de delete com Versioning ligado
Estado inicial:
  foto.jpg  version=v1  (current)

Após DELETE foto.jpg (sem version-id):
  foto.jpg  version=null  isLatest=true   type=DeleteMarker
  foto.jpg  version=v1    isLatest=false  type=Object
  → GET foto.jpg retorna 404
  → GET foto.jpg?versionId=v1 retorna o arquivo original

Recuperar:
  DELETE foto.jpg?versionId=<delete-marker-id>
  → v1 volta a ser current

Replication — CRR e SRR em profundidade

TipoDescriçãoCaso de uso
SRR (Same-Region)Réplica no mesmo região, bucket diferenteAgregar logs de múltiplas contas em um bucket central
CRR (Cross-Region)Réplica em outra regiãoDR, baixa latência de leitura em múltiplas geografias, compliance de localização de dados
AsyncReplicação é assíncrona — S3 garante eventual consistency.
VersioningObrigatório em source E destination.
Objetos novos apenasPor padrão, só replica o que foi escrito após a regra ser criada. Use S3 Batch Replication para retroativa.
Cross-accountSuporta replicação entre contas — bucket policy do destino precisa conceder s3:ReplicateObject.
RTCReplication Time Control garante 99,99% das réplicas em <15min (SLA pago).
Delete markersPor padrão NÃO replica delete markers. Ative explicitamente se quiser. Tombstone rules se aplicam.
No-chainRéplica não replica de novo. Se bucket B é réplica de A, objetos que chegam em B via replicação não vão para bucket C (a menos que escritos diretamente em B).
Classes permitidasVocê pode forçar a classe do destino (ex: Standard → Standard-IA) para economizar em DR.

📋 Preciso atender compliance que exige cópia imutável em outra região + storage barato para DR

CRR + Object Lock no destino + classe Glacier Instant no destino

Cross-region cobre requisito geográfico; Object Lock garante imutabilidade; Glacier IR mantém leitura ms para recuperação rápida sem custo de Standard.

Alt: CRR + Standard-IAmais barato que Standard mas sem imutabilidade garantida.

Alt: AWS Backupabstração mais alta, mas menos controle sobre classes.

Criptografia — 4 modos com diferenças sutis

ModoQuem tem a chaveQuem criptografaAuditoria
SSE-S3 (AES-256)AWS (chave gerenciada por S3)S3 server-sideNenhuma visibilidade da chave
SSE-KMSAWS KMS (CMK customer-managed ou aws-managed)S3 server-side via KMSCloudTrail loga cada Decrypt/Encrypt — controle granular
SSE-C (customer-provided)Você envia a chave em cada request (header)S3 server-side com sua chaveS3 não armazena a chave — você é responsável
CSE (Client-Side)Você (S3 Encryption Client ou próprio)Cliente antes do PUTObjeto já chega criptografado em S3
💡
Desde janeiro/2023: SSE-S3 é defaultpara TODO bucket novo. Não existe mais objeto “em claro” em S3. Se você não especificar nada, AES-256 é aplicado. Para ter controle/auditoria via KMS, você precisa ativar SSE-KMS explicitamente.
⚠️
SSE-KMS tem limite de TPS: cada GET/PUT em objeto SSE-KMS chama kms:Decrypt/Encrypt. O limite default do KMS é 5.500–30.000 req/s dependendo da região — se você tem workload de altíssimo throughput em S3, ative S3 Bucket Keys (reduz chamadas KMS em ~99%) ou vá para SSE-S3.
bash
# Subir com SSE-KMS usando CMK específica
aws s3 cp relatorio.pdf s3://meu-bucket/ \
  --sse aws:kms \
  --sse-kms-key-id arn:aws:kms:us-east-1:111111111111:key/abc-123

# Negar uploads sem SSE-KMS via bucket policy
# "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } }

Controle de acesso — as 4 camadas que somam (não substituem)

🗺️ Ordem de avaliação de acesso a objeto S3
Request PUT/GET s3://bucket/key
         │
         ▼
  ┌──────────────────┐   NÃO   ┌──────────┐
  │ Block Public     │────────▶│ Bloqueia │
  │ Access ativo?    │         │ se for   │
  └────────┬─────────┘         │ público  │
           │ OK                 └──────────┘
           ▼
  ┌──────────────────┐
  │ IAM Policy da    │── Deny explicit  → NEGA
  │ identidade chama │
  └────────┬─────────┘
           │
           ▼
  ┌──────────────────┐
  │ Bucket Policy    │── Deny explicit  → NEGA
  │ (resource-based) │── Allow          → continua
  └────────┬─────────┘
           │
           ▼
  ┌──────────────────┐
  │ ACL (legado)     │── Allow (não recomendado hoje)
  └────────┬─────────┘
           │
           ▼
      PERMITE se ao menos um Allow e nenhum Deny
Block Public AccessFlag de 4 configurações a nível de conta + bucket. Liga por padrão em buckets novos. Override de qualquer policy que tentar expor público.
IAM PolicyIdentity-based. Quem é o principal e o que pode fazer.
Bucket PolicyResource-based (JSON). Mais comum para cross-account e requisitos como forçar HTTPS, exigir criptografia etc.
ACLLegado (pre-IAM). AWS recomenda desabilitar (Object Ownership = Bucket owner enforced). Ainda útil para alguns casos de delivery.
Access PointsEndpoints nomeados com policy própria. Útil para dezenas de equipes com escopos distintos no mesmo bucket.
Pre-signed URLsURL temporária com credenciais encodadas. Ideal para download direto via browser sem expor credenciais.

Performance — multipart, prefix parallelism e Transfer Acceleration

Multipart UploadRecomendado > 100MB, obrigatório > 5GB. Parte de 5MB–5GB. Até 10.000 partes. Permite retry por parte, paralelismo e resume.
Byte-range fetchesParalelize DOWNLOADS quebrando um objeto grande em faixas de bytes com Range: bytes=X-Y.
Prefix paralelismS3 escala automaticamente ~3.500 PUT/s e ~5.500 GET/s por prefixo. Distribua keys em muitos prefixos para throughput massivo.
Transfer AccelerationUsa POPs CloudFront como entrada. Custo extra $0,04/GB mas pode acelerar uploads globais em 50–500%.
S3 SelectExecuta SQL simples sobre CSV/JSON/Parquet e retorna só as colunas filtradas — reduz dados transferidos e custo de compute no client.
Requester PaysQuem faz download paga transferência. Use para distribuir datasets públicos sem arcar com egress.
Padrão de alto throughput: hash do hora/id no início da key para distribuir em múltiplos prefixos. Em vez de 2026/04/16/log-001, use a7f/2026/04/16/log-001 onde a7f é hash dos primeiros bytes — garante paralelismo horizontal no I/O interno do S3.

Eventos, inventário e observabilidade

S3 Event NotificationsDispara para SNS/SQS/Lambda/EventBridge em PUT/DELETE/Replication/Restore. Base de pipelines serverless.
EventBridgeDestino mais moderno — suporta filtros, regras cross-account e entrega para 20+ targets nativos.
S3 InventoryRelatório CSV/ORC/Parquet diário ou semanal com lista de objetos + metadata. Usado para auditoria, reconciliação e input de Batch Operations.
S3 Storage LensDashboard com métricas de uso, custo, atividade — 28 dias grátis, advanced 15 meses ($).
S3 Batch OperationsExecuta operação em milhões de objetos (copy, tag, invoke Lambda, restore Glacier) com um único job managed.

Decisões arquiteturais típicas do SAA

📋 Website estático servido globalmente com latência baixa e HTTPS + domínio custom

S3 + CloudFront + Route 53 + ACM

S3 Static Website hosting sozinho não faz HTTPS com domínio custom. CloudFront resolve HTTPS, cache global, WAF opcional, e usa OAC para restringir o bucket a tráfego só via CF.

Alt: S3 Static Website diretoHTTP apenas, sem CDN. Não passa em exame moderno.

📋 Data lake com Parquet particionado — analistas rodam queries ad-hoc

S3 Standard + Athena + Glue Data Catalog + S3 Select/Intelligent-Tiering

Athena paga por TB escaneado. Parquet colunar + S3 Select reduzem scan. Intelligent-Tiering move partições frias sem quebrar queries.

Alt: Redshiftcaro se queries são esporádicas; faz sentido em workload dedicado.

📋 Upload de 5TB on-prem para S3, link de 100 Mbps

AWS Snowball Edge (ou DataSync em rede adequada)

5TB em 100Mbps = ~5 dias 24h contínuos. Snowball chega em 1 semana e transfere em horas. DataSync faz sentido se o link aguentar + agendamento incremental.

Alt: CLI com multipart + TAviável para dezenas de GB, não TB sobre 100Mbps.

Armadilhas clássicas do exame

🚨
Standard-IA vs One Zone-IA:One Zone é single-AZ. Se a AZ for perdida, dados somem. Use SOMENTE para réplicas secundárias de dados já duráveis em outro lugar. Exame tenta te fazer escolher One Zone para “primário de backup” — é pegadinha, não passe.
🚨
Glacier ≠ S3 Glacier storage class:o exame ainda cita “S3 Glacier” como classe dentro de S3 (não o serviço standalone antigo). Glacier Flexible Retrieval = antigo “Glacier”. Glacier Instant Retrieval é classe nova com latência ms. Glacier Deep Archive é a mais barata com retrieval de horas.
🚨
Encryption in transit: S3 aceita HTTP e HTTPS por padrão. Para forçar HTTPS only, bucket policy com "aws:SecureTransport": "false" em Deny. Questões de compliance sempre esperam essa policy.
🚨
Bucket Names são globais: não pode ter dois buckets com o mesmo nome no mundo. Por isso não há namespace por conta. Exame pergunta sobre conflitos de nome quando alguém tenta recriar.

Q&A estilo exame

A aplicação escreve 10.000 objetos/s em um único prefixo e está recebendo 503 SlowDown. Solução mais barata?

Distribuir as keys em múltiplos prefixos (hash ou partição temporal reversa). S3 escala por prefixo — 3.500 PUT/s é o limite aproximado por prefix, mas você pode ter milhares de prefixos no bucket automaticamente. Nada precisa ser provisionado.

Preciso que arquivos expirem automaticamente após 30 dias exceto os marcados com tag 'legal-hold'.

Lifecycle rule com filtro por tag: a regra de expiração aplica-se quando todas as condições batem. Para excluir tag específica, crie duas regras: uma geral de expiração em 30d sem filtro de tag, e uma regra mais específica com filtro legal-hold=true que NÃO expira — na verdade, o jeito correto é filtrar positivamente no prefixo/tag alvo. Object Lock Legal Hold é alternativa mais forte.

Bucket privado tem public read via Block Public Access desligado e bucket policy allow *. Alguém consegue acessar?

Depende do BPA da conta. Se BPA de conta está ativo, override. Se nem conta nem bucket bloqueiam, a policy public allow vale e qualquer um acessa anonimamente. Lição: sempre deixe BPA ligado e use Access Points ou pre-signed URLs para exposição pontual.
Take-aways: (1) escolha de storage class = custo × latência × duração mínima; (2) Versioning + Object Lock + Replication são camadas independentes e combináveis; (3) SSE-KMS dá auditoria mas escala via Bucket Keys; (4) BPA é seu backstop; (5) multipart + prefix paralelism + Transfer Acceleration resolvem 95% dos casos de performance. Entenda esses cinco vetores e S3 deixa de ser pegadinha.
🧩

Quiz rápido

3 perguntas · Acerte tudo e ganhe o badge 🎯 Gabarito