- Introdução: O Desafio dos Custos Ocultos na Nuvem
- O Imperativo do FinOps na Gestão de Recursos Ociosos
- Arquitetura de uma Solução de Automação Serverless
- Implementação Prática com AWS Lambda e EventBridge
- Passo 1: Definindo uma Estratégia de Tagging Coerente
- Passo 2: Criando a IAM Role para a Função Lambda
- Passo 3: Desenvolvendo a Função Lambda em Python (Boto3)
- Passo 4: Configurando o Gatilho com Amazon EventBridge
- Extensões e Considerações Avançadas
- Análise de Custo-Benefício e Métricas de Sucesso
Introdução: O Desafio dos Custos Ocultos na Nuvem
A migração para a nuvem oferece agilidade e escalabilidade sem precedentes, mas também introduz um novo paradigma de gerenciamento de custos. Um dos maiores vilões do orçamento de TI em ambientes cloud é o recurso ocioso – instâncias de computação, bancos de dados e outros serviços que permanecem em execução, e consequentemente gerando custos, fora do horário de expediente, durante fins de semana ou após a conclusão de um projeto. A disciplina de finops surge como uma resposta cultural e técnica a este desafio, promovendo a responsabilidade financeira na nuvem. Neste contexto, a automação do shutdown (desligamento) de recursos ociosos representa uma das práticas mais impactantes e eficientes.
Este artigo explora uma abordagem avançada para implementar essa automação de forma inteligente e escalável, utilizando serviços serverless como AWS Lambda (ou seus equivalentes como Azure Functions e Google Cloud Functions). Abordaremos a arquitetura da solução, a importância de uma estratégia de tagging robusta, a implementação prática do código e as considerações de segurança e governança para garantir que a otimização de custos não comprometa a operacionalidade.
O Imperativo do FinOps na Gestão de Recursos Ociosos
FinOps, uma junção de Finanças e DevOps, é uma prática que visa alinhar equipes de tecnologia, finanças e negócios para que tomem decisões de gastos na nuvem baseadas em dados e com responsabilidade compartilhada. Ela se baseia em três fases iterativas: Informar, Otimizar e Operar.
- Informar: Ganhar visibilidade sobre os gastos, alocando custos para equipes e projetos específicos através de tags e hierarquias de contas.
- Otimizar: Identificar e agir sobre oportunidades de redução de custos, como o dimensionamento correto de recursos (rightsizing) e o desligamento de ambientes ociosos.
- Operar: Implementar as otimizações de forma contínua e automatizada, ajustando políticas e métricas conforme a evolução do ambiente.
O desligamento de recursos não utilizados encaixa-se perfeitamente na fase de Otimização e é executado na fase de Operar. Ambientes de desenvolvimento, teste (QA) e homologação são os candidatos ideais para esta automação, pois raramente necessitam de operação 24/7. O impacto financeiro pode ser substancial: uma instância que roda apenas 8 horas por dia útil, em vez de 24 horas por dia, 7 dias por semana, pode gerar uma economia de aproximadamente 70% em seus custos de computação.
Arquitetura de uma Solução de Automação Serverless
A utilização de uma arquitetura serverless é ideal para esta tarefa. As funções são executadas apenas quando acionadas, têm um custo extremamente baixo (geralmente dentro do free tier para esta aplicação) e não exigem o gerenciamento de infraestrutura subjacente. Uma arquitetura típica na AWS seria composta pelos seguintes elementos:
- Scheduler (Agendador): O Amazon EventBridge (anteriormente CloudWatch Events) é o serviço responsável por disparar a execução da nossa lógica em um horário pré-definido. Ele utiliza expressões CRON para agendamentos recorrentes (ex: todos os dias às 22:00 UTC).
- Execution Engine (Motor de Execução): A AWS Lambda conterá o código (por exemplo, em Python com a biblioteca Boto3) que implementa a lógica para identificar e desligar os recursos.
- Identity and Access Management (IAM): Uma IAM Role com políticas de permissões estritamente definidas (princípio do menor privilégio) será associada à função Lambda, concedendo-lhe autoridade para listar e modificar o estado de outros recursos da AWS (ex: EC2, RDS).
- Tagging Strategy (Estratégia de Tagging): Este é o pilar da solução. As tags são metadados chave-valor que aplicamos aos recursos. A função Lambda usará essas tags para filtrar e decidir quais recursos devem ser desligados e quais devem ser ignorados.
- Logging e Monitoring: O Amazon CloudWatch Logs registrará todas as saídas e execuções da função Lambda, o que é crucial para auditoria, depuração e monitoramento da automação.
Implementação Prática com AWS Lambda e EventBridge
Vamos detalhar os passos para construir essa solução na AWS, focando em instâncias EC2 e bancos de dados RDS como exemplos primários.
Passo 1: Definindo uma Estratégia de Tagging Coerente
Uma estratégia de tagging bem definida é fundamental para o sucesso e a segurança da automação. Sem ela, corre-se o risco de desligar recursos críticos de produção. Sugerimos um conjunto de tags padrão:
finops:auto-shutdown: com o valortruepara recursos que devem ser incluídos na política de desligamento automático.finops:shutdown-schedule: (opcional) com valores comoweekdays-onlyouweekends-onlypara definir horários específicos, permitindo maior granularidade.Environment: com valores comodev,qa,stagingpara facilmente segmentar ambientes não produtivos.Owner: para identificar o responsável pelo recurso, útil para notificações.
A lógica principal da automação será buscar por todos os recursos que possuem a tag finops:auto-shutdown com o valor true.
Passo 2: Criando a IAM Role para a Função Lambda
A segurança é primordial. A função Lambda precisa de permissões mínimas para operar. Crie uma IAM Role com uma política de confiança para o serviço Lambda (lambda.amazonaws.com) e anexe uma política de permissões com as seguintes ações:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:StopInstances",
"rds:DescribeDBInstances",
"rds:StopDBInstance",
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
Nota: Embora "Resource": "*" seja usado aqui para simplicidade, em ambientes de produção rigorosos, é recomendável restringir os recursos por região, conta ou até mesmo por ARNs específicos, se possível.
Passo 3: Desenvolvendo a Função Lambda em Python (Boto3)
O código da função Lambda irá iterar sobre as regiões desejadas, procurar por recursos com a tag apropriada e executar a ação de desligamento.
Abaixo, um exemplo de código em Python para desligar instâncias EC2:
import boto3
import os
def lambda_handler(event, context):
# Região pode ser passada via variável de ambiente ou evento
region = os.environ.get('AWS_REGION')
ec2 = boto3.client('ec2', region_name=region)
# Filtros para buscar instâncias elegíveis
filters = [
{
'Name': 'instance-state-name',
'Values': ['running']
},
{
'Name': 'tag:finops:auto-shutdown',
'Values': ['true']
}
]
response = ec2.describe_instances(Filters=filters)
instances_to_stop = []
for reservation in response['Reservations']:
for instance in reservation['Instances']:
instances_to_stop.append(instance['InstanceId'])
if not instances_to_stop:
print("Nenhuma instância EC2 para desligar encontrada.")
return
print(f"Desligando as seguintes instâncias EC2: {', '.join(instances_to_stop)}")
ec2.stop_instances(InstanceIds=instances_to_stop)
print("Processo de shutdown de EC2 concluído.")
# Lógica similar pode ser adicionada para RDS
# rds = boto3.client('rds', region_name=region)
# ... buscar instâncias RDS com tags e estado 'available'
# ... iterar e chamar rds.stop_db_instance(DBInstanceIdentifier=...)
return {
'statusCode': 200,
'body': 'Execução concluída com sucesso.'
}
Este código deve ser expandido para incluir o tratamento de bancos de dados RDS (usando describe_db_instances e stop_db_instance), tratamento de erros, paginação para contas com muitos recursos e, idealmente, para operar em múltiplas regiões.
Passo 4: Configurando o Gatilho com Amazon EventBridge
No console do Amazon EventBridge, crie uma nova regra. Selecione a opção “Schedule” (Agendamento) e defina uma expressão CRON. Por exemplo, para executar a função todos os dias da semana às 20:00 (horário de Brasília, UTC-3), a expressão seria cron(0 23 * * MON-FRI *) em UTC.
Como alvo (Target) da regra, selecione “Lambda function” e escolha a função que você criou no passo anterior. O EventBridge irá invocar a Lambda automaticamente no horário agendado.
Extensões e Considerações Avançadas
Uma solução básica de shutdown pode ser aprimorada com funcionalidades mais sofisticadas para atender a necessidades complexas:
- Automação de Startup: Crie uma segunda função Lambda, com lógica similar, para iniciar os recursos. Agende-a para ser executada no início do dia útil (ex:
cron(0 11 * * MON-FRI *)para 08:00 BRT). A tag pode serfinops:auto-startupcom valortrue. - Modo “Dry Run”: Adicione uma variável de ambiente ou um parâmetro no evento de entrada da Lambda para controlar um modo “dry run”. Neste modo, a função apenas logaria os recursos que seriam desligados, sem executar a ação. Isso é fundamental para testes e validação inicial.
- Gestão de Exceções e “Snooze”: Implemente uma tag como
finops:snooze-untilcom uma data/hora no formato ISO 8601. A Lambda deve verificar esta tag e, se a data/hora atual for anterior à do valor da tag, o recurso é ignorado. Isso permite que equipes de desenvolvimento adiem o shutdown temporariamente para uma tarefa noturna. - Escalabilidade Multi-Account: Em organizações maiores, utilize o AWS Organizations. A solução pode ser implantada centralmente em uma conta de gerenciamento e assumir uma role (via
sts:AssumeRole) em cada conta-membro para executar as ações. Ferramentas de IaC como Terraform ou AWS CloudFormation StackSets são ideais para gerenciar essa implantação em escala. - Notificações Proativas: Integre a solução com o Amazon Simple Notification Service (SNS). Antes de desligar os recursos, a Lambda pode publicar uma mensagem em um tópico SNS, que por sua vez pode enviar e-mails ou mensagens para um canal do Slack, avisando os times sobre o desligamento iminente.
Análise de Custo-Benefício e Métricas de Sucesso
A eficácia desta automação deve ser mensurável. As métricas-chave para acompanhar o sucesso da iniciativa incluem:
- Custo Evitado (Cost Avoidance): A métrica mais importante. Utilize o AWS Cost Explorer, filtrando pelos recursos que possuem a tag de automação, para calcular o custo que foi economizado durante as horas em que estiveram desligados. Ferramentas de terceiros como CloudHealth ou Apptio Cloudability podem fornecer dashboards ainda mais detalhados.
- Número de Recursos Gerenciados: Quantas instâncias EC2, RDS, etc., são desligadas e iniciadas diariamente pela automação. Um aumento neste número indica uma maior adoção da política.
- Taxa de Adoção da Tagging: Monitore o percentual de recursos em ambientes não produtivos que possuem a tag
finops:auto-shutdowndefinida. Isso reflete a maturidade da governança e a colaboração das equipes de desenvolvimento.
O custo da própria solução de automação (execuções de Lambda, logs do CloudWatch e regras do EventBridge) é tipicamente marginal, muitas vezes ficando abaixo de um dólar por mês, enquanto o potencial de economia pode chegar a milhares ou dezenas de milhares de dólares, dependendo da escala do ambiente. O Retorno sobre o Investimento (ROI) é, portanto, extremamente alto e rápido de se obter, tornando esta uma das iniciativas de FinOps mais gratificantes e de alto impacto para qualquer organização na nuvem.
Sou um profissional na área de Tecnologia da informação, especializado em monitoramento de ambientes, Sysadmin e na cultura DevOps. Possuo certificações de Segurança, AWS e Zabbix.



