Pular para o conteúdo principal

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.

Formato do Lab

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érioOpção AOpção BOpção C
Custo estimado???
Alta disponibilidade???
Escalabilidade???
Complexidade???
Adequado para BlogPro????
💡 Solução sugerida
CritérioOpção AOpção BOpção C
Custo estimado~$50/mês~$200/mêsVariá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:

RecursoCIDRIPs UtilizáveisUso
VPC10.0.0.0/1665.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
RecursoCIDRIPs UtilizáveisUso
VPC10.0.0.0/1665.531-
Public Subnet 1a10.0.1.0/24251ALB, NAT
Public Subnet 1b10.0.2.0/24251ALB, NAT
Private Subnet 1a10.0.11.0/24251App servers
Private Subnet 1b10.0.12.0/24251App servers
DB Subnet 1a10.0.21.0/24251RDS
DB Subnet 1b10.0.22.0/24251RDS

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:

TesteComando/AçãoResultado Esperado
Resolução DNS??
HTTPS acessível??
Health check??
Conexão DB??
Failover AZ??
💡 Solução
TesteComando/AçãoResultado Esperado
Resolução DNSnslookup blog.example.comRetorna IP do ALB
HTTPS acessívelcurl -I https://blog.example.comHTTP 200 OK
Health checkcurl https://blog.example.com/healthstatus: healthy
Conexão DBLog da aplicaçãoDatabase connected
Failover AZParar instância AZ-aSite continua acessível
Load balancingVárias requisiçõesRespostas das 2 instâncias
Certificado SSLVerificação no navegadorCertificado válido

Parte 5 : Documentação​

Entregável Final​

Produza um documento contendo:

  1. Diagrama da arquitetura (com todos os componentes)

  2. Tabela de endereçamento IP

  3. Matriz de Security Groups

  4. Plano de testes de validação

  5. Estimativa de custos:

ServiçoConfiguraçãoCusto Mensal
EC2 (x2)t3.medium~$60
RDSdb.t3.small Multi-AZ~$50
ALB+ transferência de dados~$30
NAT Gateway (x2)+ dados~$70
Route 531 hosted zone~$1
Total~$211/mês
  1. Riscos identificados e mitigação

Critérios de Avaliação​

CritérioPontos
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