kb.erickguedes.com
AWS: Cloud Computing na Prática

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

ClasseDisponibilidadeCaso de Uso
S3 Standard99.99%Dados frequentes, produção
S3 Intelligent-Tiering99.99%Padrão de acesso imprevisível
S3 Standard-IA99.9%Acesso infrequente, recuperação rápida
S3 One Zone-IA99.5%Dados recriáveis (menos crítico)
S3 Glacier Instant99.9%Arquivos, acesso em ms
S3 Glacier Flexible99.99%Backup, 1-5 min restore
S3 Glacier Deep Archive99.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.