A AWS tem mais de 200 serviços. Você não precisa saber todos. Para um backend escalável, esses 5 são o feijão com arroz que você vai usar todo dia.
EC2 — Elastic Compute Cloud
EC2 é uma máquina virtual na nuvem. É o serviço mais antigo e fundamental da AWS. Você escolhe sistema operacional, tamanho, disco, região, e em 90 segundos tem um servidor Linux ou Windows rodando, com IP público, pronto para receber SSH.
EC2 é como alugar um computador remotamente. Você escolhe "quero um Linux com 4 GB de RAM e 2 CPUs", paga por hora de uso e acessa via SSH como se fosse seu PC.
Tipos de instância
A AWS oferece famílias de instâncias para diferentes cargas:
| Família | Otimizada para | Exemplo de uso |
|---|---|---|
t3, t4g | Uso geral burstable (barato) | API pequena, ambiente de dev |
m5, m6i | Uso geral balanceado | Aplicação web típica |
c5, c6i | Computação (CPU) | Processamento de imagem, ML inference |
r5, r6i | Memória (RAM) | Cache, bancos in-memory |
g4, p4 | GPU | Treinamento de IA, vídeo |
Cada tipo tem tamanhos: nano, micro, small, medium, large, xlarge, 2xlarge... Quanto maior, mais cara, mais potente.
t3.micro ou t3.small. São baratas (a t3.micro é gratuita no Free Tier por 12 meses) e atendem a maioria dos cenários de aprendizado. Em produção, prefira a família M (uso geral) e vá para C ou R apenas se identificar gargalo de CPU ou memória.Modelos de cobrança
- On-Demand: paga por segundo de uso, sem compromisso. Ideal para cargas imprevisíveis ou aprendizado.
- Reserved Instances: você se compromete por 1 ou 3 anos. Desconto de até 72%.
- Savings Plans: compromisso de gasto/hora por 1 ou 3 anos. Mais flexível que Reserved.
- Spot: você usa capacidade ociosa da AWS, com até 90% de desconto, mas a AWS pode tomar de volta com 2 minutos de aviso. Ótimo para batch e jobs de processamento.
Exemplo prático — Subindo uma EC2
# Subir uma EC2 t3.micro Ubuntu via AWS CLI
aws ec2 run-instances \
--image-id ami-0c7217cdde317cfec \
--instance-type t3.micro \
--key-name minha-chave \
--security-group-ids sg-0abc123 \
--subnet-id subnet-0xyz789 \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=api-prod}]'Após subir, você conecta via SSH e instala o que quiser:
ssh -i my-key.pem ubuntu@ec2-54-23-x-x.compute.amazonaws.com
# Sobe o binário Go (compilado localmente e enviado via scp)
chmod +x /opt/api && /opt/apiS3 — Simple Storage Service
S3 é o armazenamento de objetos da AWS. Pense nele como um "Google Drive" infinito e absurdamente confiável para sua aplicação usar via API.
S3 é como um armário de arquivos infinito. Cada "gaveta" é um bucket (precisa ter nome único no mundo inteiro). Cada arquivo dentro é um objeto, identificado por uma chave (caminho). Você não se preocupa com disco lotando, RAID, backup. A AWS cuida de tudo e replica automaticamente em pelo menos 3 AZs.
Para que serve o S3?
- Armazenar uploads de usuários (fotos, vídeos, PDFs)
- Hospedar sites estáticos (HTML, CSS, JS)
- Backup de banco de dados
- Data lake para análise (Athena, Redshift Spectrum)
- Logs de aplicação para auditoria
- Distribuição de arquivos (em conjunto com CloudFront)
Classes de armazenamento
Nem todo arquivo precisa estar instantaneamente disponível. O S3 oferece classes para otimizar custo:
| Classe | Caso de uso | Custo aprox/GB/mês |
|---|---|---|
| Standard | Acesso frequente | $0,023 |
| Intelligent-Tiering | Padrão desconhecido | $0,023 + taxa |
| Standard-IA | Acesso pouco frequente | $0,0125 |
| Glacier Instant | Arquivamento, acesso ms | $0,004 |
| Glacier Deep Archive | Arquivamento longo prazo | $0,00099 |
Exemplo prático — Upload via SDK Go
// Go - usando AWS SDK v2
cfg, _ := config.LoadDefaultConfig(ctx,
config.WithRegion("sa-east-1"),
)
s3Client := s3.NewFromConfig(cfg)
file, _ := os.Open("/tmp/avatar.jpg")
defer file.Close()
_, err := s3Client.PutObject(ctx, &s3.PutObjectInput{
Bucket: aws.String("meu-app-uploads"),
Key: aws.String("users/42/avatar.jpg"),
ContentType: aws.String("image/jpeg"),
Body: file,
})RDS — Relational Database Service
RDS é banco de dados relacional gerenciado. Você escolhe o motor (PostgreSQL, MySQL, MariaDB, Oracle, SQL Server, Aurora) e a AWS cuida de:
- Instalação e configuração
- Backups automáticos diários (com retenção de até 35 dias)
- Patches de segurança
- Replicação multi-AZ (failover automático em ~60s)
- Read replicas para escalar leitura
- Snapshots e restauração point-in-time
RDS é como morar em um apartamento alugado com serviço de manutenção. Você mora lá (usa o banco), mas se o encanamento estourar (HD falhar), o síndico arruma sem você ter que se mexer. Você só paga o aluguel.
Quando usar RDS x Aurora x DynamoDB?
| Serviço | Tipo | Quando usar |
|---|---|---|
| RDS Postgres/MySQL | SQL gerenciado | Aplicações típicas, até alguns TB |
| Aurora | SQL otimizado AWS | Alta carga, performance crítica, até 128TB |
| DynamoDB | NoSQL key-value | Escala massiva, latência ms, schema flexível |
Exemplo — Criando um RDS PostgreSQL
aws rds create-db-instance \
--db-instance-identifier minha-api-db \
--db-instance-class db.t3.micro \
--engine postgres \
--engine-version 16.1 \
--master-username admin \
--master-user-password <SENHA_FORTE> \
--allocated-storage 20 \
--multi-az \
--backup-retention-period 7 \
--vpc-security-group-ids sg-0abc123Publicly Accessible = false). Coloque ele em uma subnet privada da VPC e libere acesso apenas para o Security Group das suas EC2/ECS. Senha do banco JAMAIS fica no código — use AWS Secrets Manager ou Parameter Store.Load Balancer — ELB
Quando você tem mais de uma EC2 rodando a mesma aplicação (escalabilidade horizontal), precisa de algo que distribua o tráfego entre elas. Esse algo é o Load Balancer.
Imagine um banco com 5 caixas atendendo. O Load Balancer é o porteiro com a senha eletrônica: "Cliente 1, vá ao caixa 3. Cliente 2, vá ao caixa 1. Cliente 3, caixa 5..." Se um caixa fechar (instância caiu), o porteiro não manda mais cliente para lá. Ninguém fica sabendo do problema.
Tipos de Load Balancer na AWS
| Tipo | Camada OSI | Quando usar |
|---|---|---|
| ALB (Application LB) | L7 — HTTP/HTTPS | APIs REST, microsserviços, roteamento por path/host |
| NLB (Network LB) | L4 — TCP/UDP | Latência ultra baixa, milhões de req/s, jogos, gRPC |
| GLB (Gateway LB) | L3 — IP | Aplicar firewalls de terceiros (raro) |
Para 99% dos backends web/API, você vai usar o ALB.
Recursos do ALB que você precisa conhecer
- Health checks: o ALB verifica
/healtha cada X segundos. Instância que não responde sai do pool automaticamente. - Path-based routing:
/api/*vai para o backend,/*vai para o frontend. - Host-based routing:
api.empresa.comeadmin.empresa.comno mesmo ALB. - SSL/TLS termination: o ALB descriptografa HTTPS, suas EC2 falam HTTP interno (mais simples).
- Sticky sessions: amarra um cliente na mesma instância (use com moderação).
IAM — Identity and Access Management
IAM é o serviço que controla QUEM pode fazer O QUE em QUAIS recursos da AWS. Toda chamada de API na AWS passa pelo IAM. É, com toda certeza, o serviço que mais frustra iniciantes — e o que mais separa amador de pro.
IAM é o sistema de crachá + permissões da empresa: USUÁRIOS = pessoas (você, seu colega de time). GRUPOS = equipes (Devs, DBAs, Financeiro). ROLES = crachá temporário que pode ser emprestado ("hoje você é auditor por 1 hora"). POLICIES = as regras: "Quem tem este crachá pode entrar nas salas A e B, mas não na C".
Os 4 elementos do IAM
- User: uma pessoa física com login na AWS. Pode ter senha + MFA + access keys.
- Group: conjunto de usuários. Aplicar policy num grupo aplica em todos.
- Role: identidade temporária assumida por serviços ou usuários. EC2 assume role para acessar S3 sem precisar de access key no código.
- Policy: documento JSON que define permissões (Allow/Deny em quais ações e recursos).
Exemplo de Policy IAM
Permitir leitura apenas no bucket meu-app-uploads:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::meu-app-uploads",
"arn:aws:s3:::meu-app-uploads/*"
]
}
]
}AdministratorAccess e "refinar depois" é o caminho mais rápido para um vazamento de dados. Use o IAM Access Analyzer para detectar policies muito permissivas.AKIAxxx) e secret key dentro do código, ou em arquivos .env commitados no Git. Bots varrem o GitHub público procurando credenciais AWS expostas e em segundos sobem 50 EC2.xlarge para minerar Bitcoin com a sua conta. Você vai pagar. EC2 → use IAM Role anexada à instância. Lambda → use a Execution Role. Local → use AWS SSO ou aws configure com perfil nomeado.