Em 2019, a empresa de streaming DAZN reduziu sua fatura AWS em 50% em seis meses sem reduzir capacidade ou desacelerar crescimento. O processo foi simples em retrospecto: eles taggaram todos os recursos por serviço e time, tornaram o custo visível para cada squad responsável, e identificaram que 40% do gasto estava em instâncias EC2 com utilização média abaixo de 10%. A maior parte do desperdício estava invisível porque ninguém era responsável pela fatura — ela era paga por um centro de custo centralizado de TI sem visibilidade granular. Tornar o custo visível foi mais impactante que qualquer otimização técnica.
FinOps (Financial Operations) é a prática de gestão financeira de cloud que busca equilibrar velocidade de inovação, custo de infraestrutura, e qualidade. O princípio central da FinOps Foundation é que "todos são responsáveis pelo custo de cloud" — não só o time de infraestrutura ou de finanças.
O triângulo FinOps
Cloud permite escalar velocidade e qualidade praticamente sem limitação — mas o custo cresce proporcionalmente. A disciplina FinOps existe para equilibrar os três vértices do triângulo: velocidade de entrega (não throttle a engenharia), custo adequado ao retorno (não pague por recursos ociosos), e qualidade/performance (não degrade a experiência para economizar).
O erro clássico é tratar FinOps como "redução de custo" — cortar infraestrutura para economizar. A abordagem correta é "otimização de valor": garantir que cada dólar de cloud gera valor proporcional. Uma instância cara que serve 10.000 requests/segundo de um serviço crítico é um bom investimento. Uma instância barata rodando 24/7 sem tráfego é desperdício — independente do custo absoluto.
Tagging — a fundação de tudo
Sem tags, a fatura de cloud é uma lista de serviços sem contexto. Com tags corretas, você sabe exatamente quem gasta o quê. Tags mínimas obrigatórias:
# Política de tags obrigatórias — AWS Tag Policy
{
"tags": {
"Service": {
"tag_value": {
"@@assign": ["api-gateway", "processador-pagamentos", "relatorio", "..."]
}
},
"Environment": {
"tag_value": {
"@@assign": ["dev", "staging", "producao"]
}
},
"Team": {
"tag_value": {
"@@assign": ["backend", "data", "platform", "..."]
}
},
"Owner": {
"tag_value": {
"@@assign": ["*"] # qualquer email do time
}
}
}
}
AWS Tag Policies (via AWS Organizations) podem bloquear a criação de recursos sem as tags obrigatórias. No Terraform, tags podem ser definidas como variáveis padrão e aplicadas via default_tags no provider — qualquer recurso criado herda as tags automaticamente:
provider "aws" {
region = "us-east-1"
default_tags {
tags = {
ManagedBy = "terraform"
Environment = var.environment
Team = "platform"
}
}
}
Recursos não taggeáveis (como requests de dados) podem ser atribuídos via Cost Allocation Tags depois — mas recursos taggeados desde a criação são muito mais fáceis de analisar retroativamente.
Showback vs chargeback
Showback é mostrar para cada time quanto gasta, sem cobrar. É o passo inicial — cria visibilidade e consciência de custo sem gerar conflito financeiro. A maioria das organizações começa aqui: um dashboard no Grafana ou no AWS Cost Explorer por tag de serviço e time.
Chargeback é cobrar os custos do departamento de TI para os times de negócio que os geram. Requer sistema de billing interno mais sofisticado e alinhamento financeiro entre TI e produto. Mais eficaz para criar incentivo real de otimização — quando a fatura do squad de pagamentos sobe, o squad sente no orçamento. Mais complexo de implementar e pode criar comportamentos disfuncionais (squads evitando usar cloud para não ser cobrados).
A maioria das organizações começa com showback e migra para chargeback parcial (accountability sem billing real) em 12-18 meses de maturidade FinOps.
Rightsizing — identificando superprovisionamento
Rightsizing é o processo de ajustar o tamanho das instâncias ao uso real. O superprovisionamento é quase universal em cloud: times provisionam para o pico teórico, não para o uso médio. Uma instância m5.2xlarge com utilização de CPU de 5% está desperdiçando 95% da capacidade.
O processo de rightsizing:
- Coletar métricas: CPU, memória, e network utilization por instância nos últimos 14-30 dias. AWS Cost Optimization Hub e GCP Recommender fazem isso automaticamente.
- Identificar candidatos: instâncias com percentil 95 de CPU abaixo de 30% são candidatos a downsize. Memória requer cuidado — workloads com caches grandes usam memória intencionalmente.
- Dimensionar corretamente: target de 60-70% de utilização no percentil 95 — deixa headroom para variações de carga sem superprovisionamento.
- Validar e monitorar: após mudança, monitorar por 1-2 semanas antes de considerar estável.
Em Kubernetes, o VPA (Vertical Pod Autoscaler) em modo Off faz rightsizing contínuo automaticamente — analisa consumo histórico e recomenda requests ideais. Ver Conceito 03.
Reserved Instances e Savings Plans
On-demand pricing é o mais caro e o mais flexível. Para cargas estáveis e previsíveis, commitments de longo prazo oferecem descontos significativos:
| Opção AWS | Commitment | Desconto vs on-demand | Flexibilidade |
|---|---|---|---|
| On-Demand | Nenhum | 0% | Total |
| Savings Plans (Compute) | $/hora por 1 ou 3 anos | ~40% (1 ano) / ~66% (3 anos) | Alta (qualquer família, AZ, OS) |
| Reserved Instance (Standard) | Instância específica por 1 ou 3 anos | ~40% (1 ano) / ~60% (3 anos) | Baixa (família e AZ fixos) |
| Spot Instance | Nenhum | ~70-90% | Zero (pode ser interrompida com 2 min de aviso) |
Savings Plans Compute são mais flexíveis que Reserved Instances: o commitment é em $/hora de uso de compute, independente de família de instância, região, ou OS. Se você muda de m5.xlarge para c5.2xlarge (porque descobriu que a carga é CPU-bound), o Savings Plan continua aplicando. Reserved Instances standard são para cargas onde você sabe exatamente qual tipo de instância vai usar pelos próximos 3 anos — raramente a situação real.
Estratégia de commitment
O erro clássico é reservar com base no pico — você compra capacity que fica ociosa na maioria do tempo. A estratégia correta:
- Identificar o baseline de compute nos últimos 90 dias: quantas instâncias você sempre tem rodando, independente de horário ou pico
- Cobrir 60-70% do baseline com Savings Plans de 1 ano (não 3 anos — muita coisa muda em 3 anos)
- Restante do baseline e tráfego variável fica on-demand
- Picos extremos e workloads fault-tolerant ficam em spot
- Revisar o commitment trimestralmente
Spot Instances — custo mínimo para workloads tolerantes
Spot instances são capacidade ociosa que a AWS vende com desconto de 70-90%. O trade-off: a AWS pode interromper a instância com 2 minutos de aviso quando precisa da capacidade de volta. Workloads adequados para spot:
- Processamento de jobs em batch (CI/CD runners, machine learning training, ETL)
- Testes automatizados (os runners de teste podem ser interrompidos e reiniciados)
- Nós de worker em clusters Kubernetes com drain grace period configurado
- Workloads stateless que podem recomeçar do checkpoint
Workloads inadequados para spot: bancos de dados (interrupção pode corromper dados), servidores de API síncronos (interrupção cria latência e erros para usuários), e qualquer workload sem capacidade de retomar do estado.
No Kubernetes, spot nodes ficam em um node pool separado com taints, e apenas os workloads adequados têm tolerations para spot. O Karpenter gerencia a escolha entre on-demand e spot automaticamente:
# Karpenter NodePool com mix de on-demand e spot
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
name: default
spec:
template:
spec:
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["spot", "on-demand"] # Karpenter prefere spot quando disponível
- key: kubernetes.io/arch
operator: In
values: ["amd64"]
disruption:
consolidationPolicy: WhenUnderutilized
consolidateAfter: 30s
Ferramentas de visibilidade de custo
AWS Cost Explorer: análise de custo por serviço, conta, região, e tag. Recomendações automáticas de Reserved Instances e Savings Plans. Gratuito mas limitado em granularidade.
AWS Cost Anomaly Detection: ML que detecta aumentos de custo anômalos e envia alertas. Útil para detectar vazamentos de custo (loop de autoscaling, teste de carga esquecido rodando em produção).
Kubecost / OpenCost: custo de cloud por namespace Kubernetes, pod, e deployment. Essencial para times com múltiplos serviços em Kubernetes que precisam de showback por squad. OpenCost é a versão open source e padrão CNCF.
Infracost: integração no PR de Terraform que mostra o delta de custo de uma mudança de infraestrutura antes de aplicar. Um PR que cria uma instância p3.8xlarge por engano aparece como "+$4.000/mês" no PR comment — impossível de passar despercebido.
Recursos não utilizados são a maior fonte de desperdício em cloud: instâncias de desenvolvimento que ficam rodando no fim de semana, snapshots de banco de dados de ambiente de teste de um ano atrás, load balancers de projetos encerrados. Um script simples de cleanup (ou uma ferramenta como cloud-nuke) rodando semanalmente pode reduzir a fatura 20-30% sem tocar em produção. O segundo maior: recursos superprovisionados. O terceiro: dados mal tiered (dados frios em S3 Standard em vez de S3 Glacier).
Decisões de engenharia
Perguntas de entrevista
Por que tagging é descrito como "a fundação de tudo" em FinOps, e quais são os anti-patterns mais comuns?
Sem tags, a fatura de cloud é uma lista de serviços AWS sem contexto — você sabe que gastou $50.000 em EC2, mas não sabe quais serviços, quais ambientes, ou quais times são responsáveis. Tags corretas tornam o custo atribuível: cada recurso tem um dono, um serviço, e um ambiente. Isso é o pré-requisito para qualquer prática FinOps — showback, chargeback, rightsizing por serviço, alertas de anomalia específicos.
Anti-patterns comuns: (1) Tags inconsistentes — metade dos recursos usa "Service" e metade usa "service" ou "app" (case-sensitive no AWS); use AWS Tag Policies para padronizar. (2) Tags aplicadas retroativamente — muito mais difícil do que enforcar desde a criação via Terraform default_tags ou SCPs. (3) Tags sem owner — sem um email de dono, não há como alertar quando o custo de um serviço explode. (4) Tag granularidade errada — tags por "time" mas não por "serviço" dentro do time impossibilitam identificar qual componente específico está custando mais.
AWS Tag Policies via Organizations podem bloquear criação de recursos sem as tags obrigatórias — mais eficaz que documentação ou processos manuais. No Terraform, default_tags no provider aplica tags a todos os recursos automaticamente, reduzindo a chance de esquecer.
Como fazer rightsizing de instâncias sem introduzir risco de performance degradada em produção?
Rightsizing sem dados é perigoso — você pode reduzir uma instância que parece ociosa mas que tem picos sazonais ou comportamento de cache que a torna crítica. O processo seguro requer coleta de métricas por pelo menos 14-30 dias, olhando o percentil 95 (não a média) de CPU e memória.
Instâncias com p95 de CPU abaixo de 30% são candidatas a downsize. O target correto após rightsizing é 60-70% de utilização no p95 — isso deixa headroom para picos sem superprovisionamento. Memória exige cuidado especial: workloads com caches grandes (Redis, Elasticsearch, aplicações que cachiam em memória) usam memória intencionalmente — alta utilização de memória não é indicativo de superprovisionamento.
O processo seguro: (1) fazer o downsize em staging primeiro e monitorar por 1 semana; (2) usar AWS Cost Optimization Hub ou GCP Recommender que já fazem a análise de métricas históricas automaticamente; (3) em produção, mudar um serviço de cada vez; (4) manter o monitoramento por 1-2 semanas antes de considerar estável. Em Kubernetes, o VPA em modo Off gera recomendações de requests sem aplicar automaticamente — permite revisar antes de implementar.
Qual a diferença entre Savings Plans Compute e Reserved Instances, e como decidir quanto commitar?
A diferença fundamental é flexibilidade: Savings Plans Compute comprometem um valor de $/hora de compute geral, aplicando o desconto a qualquer tipo de instância EC2, em qualquer família, AZ, região, ou OS. Reserved Instances Standard commitam uma instância específica — família, AZ, e OS fixos — por 1 ou 3 anos. Se você mudar de m5.xlarge para c6g.xlarge (ARM), o Savings Plan continua aplicando; a Reserved Instance não.
Para a maioria dos serviços modernos, Savings Plans Compute é a escolha certa — você não sabe exatamente qual tipo de instância vai usar em 2 anos. Reserved Instances Standard fazem sentido apenas para workloads extremamente estáveis como RDS em uma AZ específica com tipo de instância que não vai mudar.
Para decidir quanto commitar: analise os últimos 90 dias e identifique o baseline — a quantidade mínima de compute que você sempre tem rodando, independente de hora ou pico. Compre Savings Plans para 60-70% desse baseline (não 100% — quer headroom para flexibilidade). Commite por 1 ano, não 3 — muito muda em 3 anos. Revise trimestralmente e ajuste à medida que o produto cresce.
Como identificar e eliminar sistematicamente desperdício de cloud sem impactar produção?
As três maiores fontes de desperdício, em ordem: (1) recursos não utilizados — instâncias paradas ou com tráfego zero, snapshots orphaned, load balancers sem targets, elastic IPs não associados; (2) recursos superprovisionados — instâncias com utilização crônica baixa; (3) dados mal tiered — dados frios em storage caro (S3 Standard) em vez de S3 Glacier ou S3 Intelligent-Tiering.
O processo sistemático sem risco: comece pelos recursos não utilizados — é impossível impactar produção desligando instâncias com zero tráfego. AWS Trusted Advisor e Cost Optimization Hub identificam recursos inativos automaticamente. Revise a lista, confirme com os owners via tag, e desligue ou agende para cleanup.
Para ambientes de desenvolvimento: scripts de scheduled shutdown (instâncias dev desligam às 19h e reiniciam às 9h) podem reduzir o custo de dev 50-60% sem impacto. Ferramentas como cloud-nuke ou aws-nuke permitem limpar contas inteiras de sandbox periodicamente. Para dados: S3 Intelligent-Tiering move dados automaticamente entre classes baseado em acesso — habilitar para buckets antigos é zero-risco. Para superprovisionamento: siga o processo de rightsizing com métricas históricas antes de qualquer mudança em produção.
Como o Infracost muda a cultura de consciência de custo em um time de engenharia?
O problema da visibilidade de custo em cloud é que o custo é invisível no momento em que a decisão é tomada: um engenheiro escolhe m5.4xlarge em vez de m5.2xlarge "por precaução" sem saber que está adicionando $150/mês por instância, e a fatura só aparece 30 dias depois quando ninguém lembra mais qual PR fez a mudança.
O Infracost resolve isso adicionando o custo estimado como comentário no PR do Terraform, no momento em que o code review está acontecendo. Um PR que muda o tipo de instância de t3.medium para m5.4xlarge aparece com "+$280/mês" no comentário — imediatamente visível para todos os reviewers. Isso cria uma cultura onde o custo é uma dimensão explícita de code review, não uma surpresa na fatura.
O efeito comportamental é significativo: engenheiros começam a checar o custo antes de propor mudanças de infra, não depois. Times desenvolvem intuição de custo — "uma instância RDS db.r5.2xlarge custa ~$600/mês" vira conhecimento compartilhado. Isso é mais eficaz do que qualquer treinamento de FinOps, porque o feedback é imediato e contextual.
Exercícios práticos
Configure um módulo Terraform com default_tags no provider AWS aplicando as tags obrigatórias: Service, Environment, Team, e Owner. Crie recursos de teste (S3 bucket, security group) e verifique via aws resourcegroupstaggingapi get-resources que as tags foram aplicadas automaticamente. Opcionalmente, configure uma AWS Tag Policy via Organizations que bloqueia criação de recursos sem as tags obrigatórias e teste a rejeição de um recurso sem tag.
Em um cluster Kubernetes com pelo menos dois namespaces (ex: staging e producao), instale OpenCost via Helm. Configure a integração com o provedor cloud (AWS spot e on-demand pricing). Crie um dashboard no Grafana usando as métricas do OpenCost que mostre: custo por namespace nas últimas 24h, custo por deployment, e eficiência de recursos (custo de resources requested vs resources used). Configure um alerta quando o custo de um namespace ultrapassa um threshold.
Acesse o AWS Cost Optimization Hub e analise as recomendações de rightsizing para instâncias EC2 (ou RDS) em uma conta AWS real ou de sandbox com pelo menos 14 dias de histórico. Para cada recomendação: anote o tipo atual, o tipo recomendado, a economia estimada, e o impacto estimado na performance. Selecione uma instância de ambiente de desenvolvimento ou staging e faça o downsize seguindo o processo — snapshot antes, mudança, monitoramento por 24h. Documente o resultado: a recomendação foi correta?
Critério: Relatório com pelo menos três recomendações analisadas (aceitas ou rejeitadas com justificativa); pelo menos uma mudança implementada em ambiente não-produção com monitoramento documentado.Configure o Infracost em um repositório Terraform com GitHub Actions. O workflow deve rodar em todo PR que altere arquivos *.tf, calcular o delta de custo entre a branch atual e o main, e postar um comentário no PR com o sumário de custo. Configure o Infracost para falhar o check se o aumento de custo mensal ultrapassar $500. Crie um PR de teste que adiciona uma instância cara (ex: db.r5.2xlarge) e verifique o comentário e a falha do check.
Usando o AWS Cost Explorer, analise os últimos 90 dias de uso de EC2 na conta. Calcule: (a) o baseline de compute — mínimo de vCPUs rodando em qualquer momento do dia nos últimos 90 dias; (b) a cobertura atual de Savings Plans e Reserved Instances; (c) a economia potencial de cobrir 60% do baseline descoberto com Savings Plans Compute de 1 ano. Usando a calculadora de Savings Plans do AWS, calcule o valor de commitment necessário e o ROI projetado em 12 meses. Documente a recomendação com os dados calculados.
Critério: Documento com o baseline calculado em $/hora, a cobertura atual vs a cobertura recomendada, a economia projetada em 12 meses, e o cálculo de payback period do commitment.Referências
- docs FinOps Foundation — What is FinOps?
- book J.R. Storment & Mike Fuller — Cloud FinOps
- docs AWS — Cost Optimization Pillar (Well-Architected)
- docs OpenCost — CNCF Cost Standard for Kubernetes
- docs AWS — Understanding Savings Plans
- docs AWS — Cost Anomaly Detection
- docs Karpenter — Cost Optimization with NodePools
- article Infracost — Cloud Cost Estimation in Pull Requests
- article AWS — Tagging Best Practices
- article Google Cloud — Cost optimization best practices
- article The New Stack — FinOps: The Missing Link Between DevOps and Finance
- article AWS — Spot Instance Best Practices