MÓDULO 12 · CONCEITO 06 DE 12

FinOps e Custo de Cloud — rightsizing, Reserved Instances e showback

A cultura FinOps: triângulo velocidade-custo-qualidade. Tagging obrigatório. Cost allocation: showback vs chargeback. Rightsizing com métricas. Reserved Instances e Savings Plans. Spot instances. Identificando desperdício.

Tempo de leitura ~20 min Pré-requisito 01 · Modelos de Cloud · 06 · FinOps Foundation Próximo 07 · Serverless →

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:

  1. 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.
  2. 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.
  3. Dimensionar corretamente: target de 60-70% de utilização no percentil 95 — deixa headroom para variações de carga sem superprovisionamento.
  4. 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:

  1. Identificar o baseline de compute nos últimos 90 dias: quantas instâncias você sempre tem rodando, independente de horário ou pico
  2. Cobrir 60-70% do baseline com Savings Plans de 1 ano (não 3 anos — muita coisa muda em 3 anos)
  3. Restante do baseline e tráfego variável fica on-demand
  4. Picos extremos e workloads fault-tolerant ficam em spot
  5. 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:

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.

a maior fonte de desperdício

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

Savings Plans vs Reserved Instances
Savings Plans Compute para a maioria dos casos: o commitment é em $/hora de compute total, não em instância específica — se você mudar de família de instância, região, ou OS, o desconto continua. Reserved Instances Standard apenas quando você tem certeza absoluta de que vai usar exatamente aquele tipo de instância pelo período do commitment (ex: banco de dados RDS em uma AZ específica que nunca vai mudar). O erro clássico é comprar Reserved Instances Standard e depois mudar de arquitetura — o desconto não transfere, e você paga capacity que não usa.
Spot vs on-demand para workers Kubernetes
Spot para nodes de worker que rodam workloads stateless e fault-tolerant: CI/CD runners, jobs de batch, machine learning training, processamento de filas. Configure PodDisruptionBudgets para garantir que o drain de um node spot não derruba todos os pods de um serviço simultaneamente. On-demand para nodes que rodam serviços síncronos com SLA de disponibilidade, bancos de dados, e componentes de infra compartilhada (ingress, cert-manager). Karpenter é superior ao Cluster Autoscaler para mistura inteligente de spot e on-demand — ele otimiza custo e diversifica tipos de instância para reduzir risco de interrupção simultânea.
Showback vs chargeback — qual implementar primeiro
Comece sempre com showback: é reversível, não cria resistência, e já cria visibilidade suficiente para identificar os maiores desperdícios. A maioria das otimizações acontece na fase de showback — times que veem seu custo tendem a otimizar voluntariamente antes de qualquer cobrança. Chargeback apenas quando showback está maduro (dados confiáveis, tags completas), a organização tem orçamentos por squad, e há um processo claro para contestar alocações incorretas. Chargeback implementado prematuramente cria desincentivos perversos e conflitos entre times.
Kubecost/OpenCost vs AWS Cost Explorer para times Kubernetes
AWS Cost Explorer para visão de conta/serviço/região — responde "quanto estamos gastando em EC2 esta semana". Kubecost/OpenCost para visão de namespace/deployment/pod — responde "qual serviço específico dentro do cluster está consumindo mais, e qual squad é responsável". Para times com múltiplos serviços em Kubernetes, Cost Explorer é cego: todos os nodes EC2 do cluster aparecem agregados, sem separação por serviço. OpenCost (padrão CNCF) é gratuito e integra com Prometheus/Grafana. Kubecost tem features adicionais (savings recommendations, Slack alerts) na versão paga.

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

01 · Implementar política de tags obrigatórias com Terraform e AWS Tag Policy

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.

Critério: Todo recurso criado pelo módulo Terraform herda as quatro tags obrigatórias sem precisar declará-las explicitamente em cada recurso; a AWS Tag Policy rejeita a criação de recursos via console sem as tags necessárias.
02 · Instalar OpenCost e criar dashboard de custo por namespace

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.

Critério: O dashboard mostra o custo por namespace em tempo real; é possível identificar qual deployment específico consome mais recursos; o alerta dispara quando o custo ultrapassa o limite configurado.
03 · Rightsizing de instâncias usando AWS Cost Optimization Hub

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.
04 · Integrar Infracost no pipeline de CI/CD

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.

Critério: O comentário com estimativa de custo aparece automaticamente em todo PR com mudanças Terraform; o check falha quando o delta de custo supera o limite; o comentário mostra breakdown por recurso com custo atual vs proposto.
05 · Calcular e comprar Savings Plans para baseline de compute

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

  1. docs FinOps Foundation — What is FinOps? finops.org · definição oficial, framework de maturidade, e recursos de treinamento certificado
  2. book J.R. Storment & Mike Fuller — Cloud FinOps O'Reilly · 2022 · guia prático de FinOps por fundadores da FinOps Foundation
  3. docs AWS — Cost Optimization Pillar (Well-Architected) docs.aws.amazon.com · princípios de otimização de custo no AWS Well-Architected Framework
  4. docs OpenCost — CNCF Cost Standard for Kubernetes opencost.io · padrão CNCF para custo de Kubernetes — integra com Prometheus e Grafana
  5. docs AWS — Understanding Savings Plans docs.aws.amazon.com/savingsplans · diferenças entre Compute, EC2 Instance e SageMaker Savings Plans
  6. docs AWS — Cost Anomaly Detection docs.aws.amazon.com/cost-management/anomaly-detection · configuração de monitores e alertas de anomalia de custo
  7. docs Karpenter — Cost Optimization with NodePools karpenter.sh/docs · configuração de mix spot/on-demand e consolidação de nodes ociosos
  8. article Infracost — Cloud Cost Estimation in Pull Requests infracost.io/blog · guia de integração do Infracost em GitHub Actions e GitLab CI
  9. article AWS — Tagging Best Practices docs.aws.amazon.com/whitepapers/tagging-best-practices · whitepaper oficial de estratégias de tagging
  10. article Google Cloud — Cost optimization best practices cloud.google.com/architecture/cost-optimization · estratégias de rightsizing e commitment no GCP
  11. article The New Stack — FinOps: The Missing Link Between DevOps and Finance thenewstack.io · como FinOps cria cultura de responsabilidade de custo compartilhada
  12. article AWS — Spot Instance Best Practices aws.amazon.com/ec2/spot/getting-started · estratégias para spot em Kubernetes com Karpenter e diversificação de tipos