Testes e Validação End-to-End
Introdução
Antes de declarar um deploy "em produção", é essencial validar que todos os componentes funcionam corretamente em conjunto. Esta seção apresenta uma metodologia de testes completa.
Metodologia de Teste
┌─────────────────────────────────────────────────────────────┐
│ PIRÂMIDE DE TESTES DE INFRAESTRUTURA │
├─────────────────────────────────────────────────────────────┤
│ │
│ ▲ │
│ ╱ ╲ │
│ ╱ ╲ │
│ ╱ E2E ╲ Testes End-to-End │
│ ╱───────╲ (usuário real) │
│ ╱ ╲ │
│ ╱Integração╲ Testes de Integração │
│ ╱─────────────╲ (componentes juntos) │
│ ╱ ╲ │
│ ╱ Componentes ╲ Testes Unitários │
│ ╱───────────────────╲ (cada serviço) │
│ ╱ ╲ │
│ ╱ Infraestrutura ╲ Validação de Config │
│ ╱─────────────────────────╲(CloudFormation,etc) │
│ │
│ Comece pela base, suba progressivamente │
│ │
└─────────────────────────────────────────────────────────────┘
Testes de Validação de Infraestrutura
1. Validação de VPC e Rede
# Teste 1: VPC existe e está disponível
aws ec2 describe-vpcs --vpc-ids vpc-xxx \
--query 'Vpcs[0].State'
# Esperado: "available"
# Teste 2: Todos os subnets criados
aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-xxx" \
--query 'Subnets[*].[SubnetId,CidrBlock,AvailabilityZone]'
# Esperado: 6 subnets listados
# Teste 3: Internet Gateway anexado
aws ec2 describe-internet-gateways \
--filters "Name=attachment.vpc-id,Values=vpc-xxx" \
--query 'InternetGateways[0].Attachments[0].State'
# Esperado: "available"
# Teste 4: Rotas corretas
aws ec2 describe-route-tables \
--filters "Name=vpc-id,Values=vpc-xxx" \
--query 'RouteTables[*].Routes'
# Esperado: rota 0.0.0.0/0 para igw nos subnets públicos
2. Validação de Security Groups
# Teste 5: SG ALB permite HTTPS
aws ec2 describe-security-groups --group-ids sg-alb \
--query 'SecurityGroups[0].IpPermissions[?ToPort==`443`]'
# Esperado: regra com 0.0.0.0/0
# Teste 6: SG App permite somente do ALB
aws ec2 describe-security-groups --group-ids sg-app \
--query 'SecurityGroups[0].IpPermissions[*].UserIdGroupPairs[*].GroupId'
# Esperado: contém sg-alb
# Teste 7: SG DB permite somente do App
aws ec2 describe-security-groups --group-ids sg-db \
--query 'SecurityGroups[0].IpPermissions[*].UserIdGroupPairs[*].GroupId'
# Esperado: contém sg-app
3. Validação de Instâncias EC2
# Teste 8: Instâncias em execução
aws ec2 describe-instance-status \
--instance-ids i-app1 i-app2 \
--query 'InstanceStatuses[*].[InstanceId,InstanceState.Name,SystemStatus.Status,InstanceStatus.Status]'
# Esperado: todos "running", "ok", "ok"
# Teste 9: Instâncias nos subnets corretos
aws ec2 describe-instances --instance-ids i-app1 i-app2 \
--query 'Reservations[*].Instances[*].[InstanceId,SubnetId]'
# Esperado: subnets privados (10.0.11.0/24, 10.0.12.0/24)
Testes de Conectividade
Matriz de Testes
┌─────────────────────────────────────────────────────────────┐
│ MATRIZ DE CONECTIVIDADE │
├─────────────────────────────────────────────────────────────┤
│ │
│ DE / PARA │ Internet │ ALB │ App │ DB │ S3 │
│ ────────────┼──────────┼─────┼─────┼─────┼─────────── │
│ Internet │ - │ ✅ │ ❌ │ ❌ │ ✅(public) │
│ ALB │ ✅ │ - │ ✅ │ ❌ │ ❌ │
│ App │ ✅(NAT) │ ❌ │ ✅ │ ✅ │ ✅(endpoint) │
│ DB │ ❌ │ ❌ │ ❌ │ - │ ❌ │
│ │
│ ✅ = Deve funcionar │
│ ❌ = Deve ser bloqueado │
│ │
└─────────────────────────────────────────────────────────────┘
Scripts de Teste de Conectividade
#!/bin/bash
# test-connectivity.sh
echo "=== Testes de Conectividade BlogPro ==="
# Teste Internet → ALB (HTTPS)
echo -n "Teste 1: Internet → ALB (HTTPS)... "
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" https://blog.example.com)
if [ "$HTTP_CODE" = "200" ]; then
echo "✅ PASS ($HTTP_CODE)"
else
echo "❌ FAIL ($HTTP_CODE)"
fi
# Teste Internet → ALB (HTTP redirect)
echo -n "Teste 2: HTTP → HTTPS redirect... "
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://blog.example.com)
if [ "$HTTP_CODE" = "301" ] || [ "$HTTP_CODE" = "302" ]; then
echo "✅ PASS (redirect $HTTP_CODE)"
else
echo "❌ FAIL ($HTTP_CODE)"
fi
# Teste Health Check endpoint
echo -n "Teste 3: Health Check... "
HEALTH=$(curl -s https://blog.example.com/health | jq -r '.status')
if [ "$HEALTH" = "healthy" ]; then
echo "✅ PASS"
else
echo "❌ FAIL ($HEALTH)"
fi
# Teste acesso direto por IP (deve falhar - sem IP público)
echo -n "Teste 4: Acesso direto por IP (deve dar timeout)... "
timeout 5 curl -s http://10.0.11.20 > /dev/null 2>&1
if [ $? -eq 124 ]; then
echo "✅ PASS (corretamente bloqueado)"
else
echo "❌ FAIL (não deveria ser acessível)"
fi
echo "=== Testes finalizados ==="
Testes de Load Balancing
Verificar a Distribuição
#!/bin/bash
# test-load-balancing.sh
echo "=== Teste de Distribuição do Load Balancer ==="
# Fazer 20 requisições e contar as respostas de cada servidor
declare -A SERVER_COUNT
for i in {1..20}; do
SERVER=$(curl -s https://blog.example.com/api/server-id)
((SERVER_COUNT[$SERVER]++))
done
echo "Distribuição das requisições:"
for server in "${!SERVER_COUNT[@]}"; do
echo " $server: ${SERVER_COUNT[$server]} requisições"
done
# Verificar se os dois servidores receberam requisições
if [ ${#SERVER_COUNT[@]} -ge 2 ]; then
echo "✅ Load balancing funcional"
else
echo "❌ Load balancing com falha"
fi
Teste de Failover
┌─────────────────────────────────────────────────────────────┐
│ PROCEDIMENTO DE TESTE DE FAILOVER │
├─────────────────────────────────────────────────────────────┤
│ │
│ Etapa 1 : Verificar estado inicial │
│ ──────────────────────────────── │
│ $ aws elbv2 describe-target-health \ │
│ --target-group-arn arn:aws:...:tg-app │
│ → Os 2 targets devem estar "healthy" │
│ │
│ Etapa 2 : Simular falha de um servidor │
│ ───────────────────────────────────── │
│ $ aws ec2 stop-instances --instance-ids i-app1 │
│ │
│ Etapa 3 : Aguardar o health check (30-60s) │
│ ────────────────────────────────────────── │
│ $ watch -n 5 'curl -s https://blog.example.com/health' │
│ → O site deve permanecer acessível │
│ │
│ Etapa 4 : Verificar que o tráfego vai para App2 │
│ ──────────────────────────────────────────── │
│ $ for i in {1..10}; do curl -s https://blog.example.com/ │
│ api/server-id; done │
│ → Todas as respostas vêm do App2 │
│ │
│ Etapa 5 : Restaurar App1 │
│ ──────────────────────────── │
│ $ aws ec2 start-instances --instance-ids i-app1 │
│ → Após alguns minutos, tráfego distribuído novamente │
│ │
└─────────────────────────────────────────────────────────────┘
Testes de Performance
Teste de Carga Básico
# Usar Apache Benchmark (ab)
# 1000 requisições, 50 concorrentes
ab -n 1000 -c 50 https://blog.example.com/
# Resultados esperados:
# - Requests per second > 100
# - Time per request < 500ms (mean)
# - Failed requests: 0
Métricas a Monitorar
| Métrica | Limite Aceitável | Ação se Ultrapassar |
|---|---|---|
| Latência P50 | < 200ms | Otimizar código/cache |
| Latência P95 | < 500ms | Verificar queries DB |
| Latência P99 | < 1000ms | Investigar outliers |
| Error rate | < 0.1% | Verificar logs |
| CPU (EC2) | < 70% | Adicionar instâncias |
| Memória (EC2) | < 80% | Aumentar tamanho |
Testes de Segurança
Checklist de Segurança
┌─────────────────────────────────────────────────────────────┐
│ CHECKLIST DE SEGURANÇA │
├─────────────────────────────────────────────────────────────┤
│ │
│ REDE │
│ ☐ Nenhuma porta desnecessária aberta na Internet │
│ ☐ SSH acessível apenas via bastion/VPN │
│ ☐ Database não acessível pela Internet │
│ ☐ HTTPS obrigatório (redirect HTTP→HTTPS) │
│ │
│ CERTIFICADO SSL │
│ ☐ Certificado válido (não expirado) │
│ ☐ Cadeia de certificados completa │
│ ☐ Apenas TLS 1.2+ │
│ ☐ Sem vulnerabilidades SSL (testar no SSL Labs) │
│ │
│ INSTÂNCIAS │
│ ☐ Sem credenciais em código/user-data │
│ ☐ Uso de IAM roles (sem chaves) │
│ ☐ SO atualizado │
│ ☐ Firewall local configurado │
│ │
│ BANCO DE DADOS │
│ ☐ Encryption at rest ativado │
│ ☐ Encryption in transit (SSL) │
│ ☐ Sem credenciais padrão │
│ ☐ Backups automáticos ativados │
│ │
└─────────────────────────────────────────────────────────────┘
Teste SSL com SSL Labs
# Usar o teste online do SSL Labs
# https://www.ssllabs.com/ssltest/
# Ou com testssl.sh
docker run --rm -ti drwetter/testssl.sh https://blog.example.com
# Score esperado: A ou A+
Relatório de Validação
Template de Relatório
# Relatório de Validação - BlogPro
## Resumo Executivo
- Data: YYYY-MM-DD
- Versão: 1.0
- Status: ✅ VALIDADO / ❌ NÃO VALIDADO
## Testes de Infraestrutura
| Teste | Resultado | Notas |
|---------------|----------|------------|
| VPC criada | ✅ | vpc-xxx |
| Subnets (6) | ✅ | |
| IGW anexado | ✅ | |
| Rotas corretas| ✅ | |
## Testes de Segurança
| Teste | Resultado | Notas |
|---------|----------|--------------|
| SG ALB | ✅ | Apenas HTTPS |
| SG App | ✅ | Apenas ALB |
| SG DB | ✅ | Apenas App |
| SSL Grade | A | SSL Labs |
## Testes Funcionais
| Teste | Resultado | Notas |
|-----------------|----------|----------|
| Site acessível | ✅ | 200 OK |
| Health check | ✅ | healthy |
| Load balancing | ✅ | 50/50 |
| Failover | ✅ | < 60s |
## Testes de Performance
| Métrica | Valor | Limite | Status |
|--------------|--------|-----------|--------|
| Latência P50 | 150ms | < 200ms | ✅ |
| Latência P95 | 380ms | < 500ms | ✅ |
| Throughput | 250 rps| > 100 rps | ✅ |
## Problemas Identificados
1. Nenhum
## Recomendações
1. Ativar VPC Flow Logs para monitoramento
2. Configurar alertas no CloudWatch
## Aprovação
- [ ] Tech Lead
- [ ] Security Review
- [ ] Ops Team
Automação dos Testes
Script de Validação Completo
#!/bin/bash
# validate-deployment.sh
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color
DOMAIN="blog.example.com"
PASS=0
FAIL=0
function test_result() {
if [ $1 -eq 0 ]; then
echo -e "${GREEN}✅ PASS${NC}: $2"
((PASS++))
else
echo -e "${RED}❌ FAIL${NC}: $2"
((FAIL++))
fi
}
echo "========================================"
echo " VALIDAÇÃO DO DEPLOY BLOGPRO"
echo "========================================"
echo ""
# Teste 1: Site acessível
echo "Teste 1: Acessibilidade HTTPS"
curl -sf "https://${DOMAIN}" > /dev/null
test_result $? "Site acessível via HTTPS"
# Teste 2: Health check
echo "Teste 2: Health Check"
HEALTH=$(curl -sf "https://${DOMAIN}/health" | jq -r '.status' 2>/dev/null)
[ "$HEALTH" = "healthy" ]
test_result $? "Health check endpoint"
# Teste 3: HTTP redirect
echo "Teste 3: HTTP → HTTPS redirect"
CODE=$(curl -sf -o /dev/null -w "%{http_code}" "http://${DOMAIN}")
[ "$CODE" = "301" ] || [ "$CODE" = "302" ]
test_result $? "HTTP redirect para HTTPS"
# Teste 4: Certificado SSL
echo "Teste 4: Certificado SSL válido"
curl -sf --cert-status "https://${DOMAIN}" > /dev/null
test_result $? "Certificado SSL válido"
# Teste 5: Tempo de resposta
echo "Teste 5: Tempo de resposta < 500ms"
TIME=$(curl -sf -o /dev/null -w "%{time_total}" "https://${DOMAIN}")
[ $(echo "$TIME < 0.5" | bc) -eq 1 ]
test_result $? "Tempo de resposta (${TIME}s)"
echo ""
echo "========================================"
echo " RESULTADO: $PASS PASS, $FAIL FAIL"
echo "========================================"
if [ $FAIL -gt 0 ]; then
exit 1
fi
Resumo
| Fase | Testes | Ferramentas |
|---|---|---|
| Infraestrutura | VPC, SG, Rotas | AWS CLI |
| Conectividade | Matriz de acesso | curl, nc, telnet |
| Funcional | E2E, Health | curl, scripts |
| Performance | Carga, latência | ab, hey, k6 |
| Segurança | SSL, acesso | testssl, nmap |
Voltar: Visão geral MÓDULO 7