S3 — Armazenamento de Objetos
Aula 3 de 8
Amazon S3
S3 (Simple Storage Service) é armazenamento de objetos com durabilidade 99.999999999% (11 noves).
Conceitos
Bucket (nome global único) → Objects (chave + valor + metadados) → Versions
# Criar bucket
aws s3 mb s3://meu-bucket-unico --region us-east-1
# Upload
aws s3 cp arquivo.jpg s3://meu-bucket/fotos/ --acl private
aws s3 sync ./local s3://meu-bucket/fotos/ --delete
# Download
aws s3 cp s3://meu-bucket/fotos/arquivo.jpg ./local/
aws s3 sync s3://meu-bucket/fotos/ ./local/
# Listar
aws s3 ls s3://meu-bucket/
aws s3 ls s3://meu-bucket/fotos/ --recursive --summarize
# Remover
aws s3 rm s3://meu-bucket/arquivo.jpg
aws s3 rb s3://meu-bucket --force # remove bucket (precisa estar vazio)
Classes de Armazenamento
| Classe | Disponibilidade | Caso de Uso |
|---|---|---|
| S3 Standard | 99.99% | Dados frequentes, produção |
| S3 Intelligent-Tiering | 99.99% | Padrão de acesso imprevisível |
| S3 Standard-IA | 99.9% | Acesso infrequente, recuperação rápida |
| S3 One Zone-IA | 99.5% | Dados recriáveis (menos crítico) |
| S3 Glacier Instant | 99.9% | Arquivos, acesso em ms |
| S3 Glacier Flexible | 99.99% | Backup, 1-5 min restore |
| S3 Glacier Deep Archive | 99.99% | Compliance, 12h restore |
# Lifecycle policy — transição automática
aws s3api put-bucket-lifecycle-configuration \
--bucket meu-bucket \
--lifecycle-configuration file://lifecycle.json
{
"Rules": [{
"Id": "ExpireLogs",
"Status": "Enabled",
"Prefix": "logs/",
"Transitions": [
{"Days": 30, "StorageClass": "STANDARD_IA"},
{"Days": 90, "StorageClass": "GLACIER"}
],
"Expiration": {"Days": 365}
}]
}
Segurança no S3
# Bloquear acesso público (padrão, Block Public Access)
aws s3 control put-public-access-block \
--account-id 123456789012 \
--public-access-block-configuration \
BlockPublicAcls=true,IgnorePublicAcls=true,\
BlockPublicPolicy=true,RestrictPublicBuckets=true
# Bucket Policy — controle refinado
aws s3api put-bucket-policy \
--bucket meu-bucket \
--policy file://policy.json
# Encryption
aws s3api put-bucket-encryption \
--bucket meu-bucket \
--server-side-encryption-configuration \
'{"Rules":[{"ApplyServerSideEncryptionByDefault":{"SSEAlgorithm":"AES256"}}]}'
Bucket Policy Exemplo
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": ["arn:aws:s3:::meu-bucket/*"],
"Condition": {
"Bool": {"aws:SecureTransport": "false"}
}
}]
}
Versionamento e Replicação
# Habilitar versionamento
aws s3api put-bucket-versioning \
--bucket meu-bucket \
--versioning-configuration Status=Enabled
# Replicação entre regiões (CRR)
aws s3api put-bucket-replication \
--bucket meu-bucket \
--replication-configuration file://replication.json
# Restaurar versão deletada
aws s3api list-object-versions --bucket meu-bucket --prefix doc.txt
aws s3api get-object --bucket meu-bucket --key doc.txt --version-id "abc123" doc.txt
Lab: Static Website Hosting
# 1. Criar bucket
aws s3 mb s3://meu-site.com
# 2. Habilitar Static Website
aws s3 website s3://meu-site.com \
--index-document index.html \
--error-document error.html
# 3. Bucket Policy (público)
aws s3api put-bucket-policy --bucket meu-site.com --policy file://public-read.json
# 4. Fazer upload
aws s3 sync ./dist/ s3://meu-site.com/
# 5. URL: http://meu-site.com.s3-website-us-east-1.amazonaws.com
S3 é infinitamente escalável. Use lifecycle policies para otimizar custos. Sempre ative Block Public Access a menos que explicitamente necessário.