Lab : Publicação de um Serviço Web
Objetivo do Lab
Neste lab, você irá projetar e documentar o deploy de um serviço web completo na AWS. Você irá analisar diferentes opções de arquitetura e produzir um plano de deploy.
Este lab é focado em projeto e documentação. Você utilizará comandos CLI para simular com LocalStack se disponível.
Contexto
Você é responsável por fazer o deploy da aplicação BlogPro, uma plataforma de blogging para empresas.
Requisitos Funcionais
┌─────────────────────────────────────────────────────────────┐
│ REQUISITOS BLOGPRO │
├─────────────────────────────────────────────────────────────┤
│ │
│ APLICAÇÃO │
│ • Site web acessível via HTTPS │
│ • API backend (Node.js ou Python) │
│ • Banco de dados MySQL │
│ • Armazenamento de imagens (S3) │
│ │
│ PERFORMANCE │
│ • Tempo de resposta < 500ms │
│ • Suporte a 1000 usuários simultâneos │
│ │
│ DISPONIBILIDADE │
│ • 99.9% uptime (aprox. 8h downtime/ano máx) │
│ • Zero downtime durante deploys │
│ │
│ SEGURANÇA │
│ • Certificado SSL/TLS │
│ • Banco de dados não acessível pela Internet │
│ • Conformidade com boas práticas AWS │
│ │
│ ORÇAMENTO │
│ • Aproximadamente $200-300/mês │
│ │
└─────────────────────────────────────────────────────────────┘
Parte 1 : Projeto da Arquitetura
Exercício 1.1 : Escolha da Arquitetura
Analise as três opções abaixo e escolha a melhor para o BlogPro:
Opção A : Arquitetura Simples
Internet → IGW → EC2 (public) → RDS (private)
Opção B : Arquitetura com ALB
Internet → IGW → ALB → EC2 (private) → RDS (private)
Opção C : Arquitetura Serverless
Internet → CloudFront → API Gateway → Lambda → RDS/DynamoDB
Sua análise:
| Critério | Opção A | Opção B | Opção C |
|---|---|---|---|
| Custo estimado | ? | ? | ? |
| Alta disponibilidade | ? | ? | ? |
| Escalabilidade | ? | ? | ? |
| Complexidade | ? | ? | ? |
| Adequado para BlogPro? | ? | ? | ? |
💡 Solução sugerida
| Critério | Opção A | Opção B | Opção C |
|---|---|---|---|
| Custo estimado | ~$50/mês | ~$200/mês | Variável |
| Alta disponibilidade | ❌ Não | ✅ Sim | ✅ Sim |
| Escalabilidade | ❌ Limitada | ✅ Boa | ✅✅ Excelente |
| Complexidade | ⭐ Simples | ⭐⭐ Média | ⭐⭐⭐ Complexa |
| Adequado para BlogPro? | ❌ | ✅ | ❌ (over-engineering) |
Recomendação: Opção B
- Atende aos requisitos de HA e performance
- Custo dentro do orçamento
- Complexidade razoável para o time
Exercício 1.2 : Diagrama da Arquitetura
Desenhe a arquitetura completa com todos os componentes:
Template:
┌─────────────────────────────────────────────────────────────────────────┐
│ ARQUITETURA BLOGPRO │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ INTERNET │
│ │ │
│ [Seu diagrama aqui] │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└─────────────────────────────────────────────────────────────────────────┘
💡 Diagrama solução
┌─────────────────────────────────────────────────────────────────────────┐
│ ARQUITETURA BLOGPRO │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ Usuários / Internet │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Route 53 │ blog.example.com │
│ └────────┬────────┘ │
│ │ │
│ ┌────────▼────────┐ │
│ │ CloudFront │ CDN + SSL │
│ └────────┬────────┘ │
│ │ │
│ ┌─────────────────────────┼─────────────────────────────────┐ │
│ │ VPC │ (10.0.0.0/16) │ │
│ │ │ │ │
│ │ ┌──────────▼──────────┐ │ │
│ │ │ IGW │ │ │
│ │ └──────────┬──────────┘ │ │
│ │ │ │ │
│ │ ┌─────────────────────┼─────────────────────────┐ │ │
│ │ │ PUBLIC SUBNETS │ │ │ │
│ │ │ │ │ │ │
│ │ │ ┌─────────┐ ┌─────▼─────┐ ┌─────────┐ │ │ │
│ │ │ │ NAT GW │ │ ALB │ │ NAT GW │ │ │ │
│ │ │ │ 1a │ │ │ │ 1b │ │ │ │
│ │ │ └────┬────┘ └─────┬─────┘ └────┬────┘ │ │ │
│ │ └───────┼─────────────┼─────────────┼──────────┘ │ │
│ │ │ │ │ │ │
│ │ ┌───────┼─────────────┼─────────────┼──────────┐ │ │
│ │ │ PRIVATE SUBNETS │ │ │ │
│ │ │ │ ┌────┴────┐ │ │ │ │
│ │ │ ┌────────▼────┤ ├────▼────────┐ │ │ │
│ │ │ │ │ │ │ │ │ │
│ │ │ │ ┌───────┐ │ │ ┌───────┐ │ │ │ │
│ │ │ │ │ EC2 │ │ │ │ EC2 │ │ │ │ │
│ │ │ │ │ App 1 │ │ │ │ App 2 │ │ │ │ │
│ │ │ │ └───┬───┘ │ │ └───┬───┘ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ └──────┼──────┘ └──────┼──────┘ │ │ │
│ │ └─────────┼───────────────────────┼─────────┘ │ │
│ │ │ │ │ │
│ │ ┌─────────┼───────────────────────┼─────────┐ │ │
│ │ │ DB SUBNETS │ │ │ │
│ │ │ │ ┌──────────────────┘ │ │ │
│ │ │ │ │ │ │ │
│ │ │ ┌────▼────▼────┐ │ │ │
│ │ │ │ RDS │ │ │ │
│ │ │ │ Multi-AZ │ │ │ │
│ │ │ │ MySQL │ │ │ │
│ │ │ └──────────────┘ │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ S3 Bucket │ │ │
│ │ │ (images/assets) │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ │ │
│ └────────────────────────────────────────────────────┘ │
│ │
└───────────────────────────────────────────────────────────────┘
Parte 2 : Plano de Endereçamento IP
Exercício 2.1 : Definir os CIDR
Complete o plano de endereçamento:
| Recurso | CIDR | IPs Utilizáveis | Uso |
|---|---|---|---|
| VPC | 10.0.0.0/16 | 65.531 | - |
| Public Subnet 1a | ? | ? | ALB, NAT |
| Public Subnet 1b | ? | ? | ALB, NAT |
| Private Subnet 1a | ? | ? | App servers |
| Private Subnet 1b | ? | ? | App servers |
| DB Subnet 1a | ? | ? | RDS |
| DB Subnet 1b | ? | ? | RDS |
💡 Solução
| Recurso | CIDR | IPs Utilizáveis | Uso |
|---|---|---|---|
| VPC | 10.0.0.0/16 | 65.531 | - |
| Public Subnet 1a | 10.0.1.0/24 | 251 | ALB, NAT |
| Public Subnet 1b | 10.0.2.0/24 | 251 | ALB, NAT |
| Private Subnet 1a | 10.0.11.0/24 | 251 | App servers |
| Private Subnet 1b | 10.0.12.0/24 | 251 | App servers |
| DB Subnet 1a | 10.0.21.0/24 | 251 | RDS |
| DB Subnet 1b | 10.0.22.0/24 | 251 | RDS |
Parte 3 : Configuração de Segurança
Exercício 3.1 : Security Groups
Defina as regras para cada Security Group:
sg-alb:
Inbound:
- Tipo: ?, Porta: ?, Origem: ?
- Tipo: ?, Porta: ?, Origem: ?
Outbound:
- Tipo: ?, Porta: ?, Destino: ?
sg-app:
Inbound:
- Tipo: ?, Porta: ?, Origem: ?
- Tipo: ?, Porta: ?, Origem: ?
Outbound:
- Tipo: ?, Porta: ?, Destino: ?
- Tipo: ?, Porta: ?, Destino: ?
sg-db:
Inbound:
- Tipo: ?, Porta: ?, Origem: ?
Outbound:
- Tipo: ?, Porta: ?, Destino: ?
💡 Solução
sg-alb:
Inbound:
- Tipo: HTTPS, Porta: 443, Origem: 0.0.0.0/0
- Tipo: HTTP, Porta: 80, Origem: 0.0.0.0/0 (redirect para HTTPS)
Outbound:
- Tipo: HTTP, Porta: 80, Destino: sg-app
sg-app:
Inbound:
- Tipo: HTTP, Porta: 80, Origem: sg-alb
- Tipo: SSH, Porta: 22, Origem: sg-bastion (ou IP admin)
Outbound:
- Tipo: MySQL, Porta: 3306, Destino: sg-db
- Tipo: HTTPS, Porta: 443, Destino: 0.0.0.0/0 (APIs, atualizações)
sg-db:
Inbound:
- Tipo: MySQL, Porta: 3306, Origem: sg-app
Outbound:
- (Nenhuma regra explícita necessária - stateful)
Parte 4 : Plano de Validação
Exercício 4.1 : Testes End-to-End
Liste os testes a serem realizados para validar o deploy:
| Teste | Comando/Ação | Resultado Esperado |
|---|---|---|
| Resolução DNS | ? | ? |
| HTTPS acessível | ? | ? |
| Health check | ? | ? |
| Conexão DB | ? | ? |
| Failover AZ | ? | ? |
💡 Solução
| Teste | Comando/Ação | Resultado Esperado |
|---|---|---|
| Resolução DNS | nslookup blog.example.com | Retorna IP do ALB |
| HTTPS acessível | curl -I https://blog.example.com | HTTP 200 OK |
| Health check | curl https://blog.example.com/health | status: healthy |
| Conexão DB | Log da aplicação | Database connected |
| Failover AZ | Parar instância AZ-a | Site continua acessível |
| Load balancing | Várias requisições | Respostas das 2 instâncias |
| Certificado SSL | Verificação no navegador | Certificado válido |
Parte 5 : Documentação
Entregável Final
Produza um documento contendo:
-
Diagrama da arquitetura (com todos os componentes)
-
Tabela de endereçamento IP
-
Matriz de Security Groups
-
Plano de testes de validação
-
Estimativa de custos:
| Serviço | Configuração | Custo Mensal |
|---|---|---|
| EC2 (x2) | t3.medium | ~$60 |
| RDS | db.t3.small Multi-AZ | ~$50 |
| ALB | + transferência de dados | ~$30 |
| NAT Gateway (x2) | + dados | ~$70 |
| Route 53 | 1 hosted zone | ~$1 |
| Total | ~$211/mês |
- Riscos identificados e mitigação
Critérios de Avaliação
| Critério | Pontos |
|---|---|
| Arquitetura correta e completa | /25 |
| Plano de endereçamento coerente | /15 |
| Security Groups bem configurados | /20 |
| Testes de validação pertinentes | /15 |
| Estimativa de custos realista | /10 |
| Qualidade da documentação | /15 |
| Total | /100 |
Bônus : Script de Deploy
Se você tiver acesso ao LocalStack, teste estes comandos:
#!/bin/bash
# deploy-blogpro.sh
ENDPOINT="--endpoint-url=http://localhost:4566"
# 1. Criar o VPC
VPC_ID=$(aws $ENDPOINT ec2 create-vpc \
--cidr-block 10.0.0.0/16 \
--query 'Vpc.VpcId' --output text)
echo "VPC criado: $VPC_ID"
# 2. Criar as subnets públicas
SUBNET_PUB_1A=$(aws $ENDPOINT ec2 create-subnet \
--vpc-id $VPC_ID \
--cidr-block 10.0.1.0/24 \
--availability-zone us-east-1a \
--query 'Subnet.SubnetId' --output text)
echo "Subnet pública 1a: $SUBNET_PUB_1A"
# ... continuar com os outros recursos
Próxima seção: Testes e Validação