Ligar e Desligar Serviços AWS Automaticamente

Sua instância RDS de dev e os serviços ECS rodam 24/7, incluindo fins de semana quando ninguém está usando. Isso é dinheiro saindo da sua conta sem motivo. Uma função Lambda no schedule do EventBridge pode desligá-los na sexta à noite e reiniciá-los na segunda de manhã, sem nenhuma intervenção.

TL;DR: Use AWS Lambda + schedules cron do EventBridge para ligar e desligar automaticamente serviços RDS e ECS fora do horário comercial, reduzindo custos.
Stack: AWS Lambda, EventBridge, RDS, ECS, Python, boto3, IAM
Nível: Intermediário
Tempo de leitura: ~6 min

Criar cron no EventBridge + role IAM para Lambda

Crie uma role IAM para a Lambda com permissões para parar/iniciar instâncias RDS e atualizar serviços ECS:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["rds:StopDBInstance", "rds:StartDBInstance"],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "ecs:UpdateService",
      "Resource": "arn:aws:ecs:sa-east-1:SUA_CONTA:service/seu-cluster/seu-servico"
    }
  ]
}

Implementar a Lambda

import boto3
from datetime import datetime

def lambda_handler(event, context):
    now = datetime.utcnow()
    current_hour = now.hour

    ecs_client = boto3.client('ecs')
    rds_client = boto3.client('rds')

    ecs_services = [
        {'cluster': 'meu-cluster', 'service': 'meu-servico'},
    ]
    rds_instances = ['minha-instancia-db']

    # Horario comercial: 8h às 17h UTC
    if 8 <= current_hour < 17:
        desired_count = 1
        rds_action = 'start'
    else:
        desired_count = 0
        rds_action = 'stop'

    results = []
    try:
        for svc in ecs_services:
            ecs_client.update_service(
                cluster=svc['cluster'],
                service=svc['service'],
                desiredCount=desired_count
            )
            results.append({'service': svc['service'], 'desired_count': desired_count, 'status': 'success'})

        for db in rds_instances:
            if rds_action == 'stop':
                rds_client.stop_db_instance(DBInstanceIdentifier=db)
            else:
                rds_client.start_db_instance(DBInstanceIdentifier=db)
            results.append({'db': db, 'action': rds_action, 'status': 'success'})

        return results
    except Exception as e:
        return [{'status': 'error', 'message': str(e)}]

O que você construiu

Uma automação de redução de custos: uma Lambda com as permissões IAM certas, disparada pelo EventBridge em um cron schedule, que desliga seus recursos RDS e ECS fora do horário comercial e os inicia quando necessário. Pense nisso como um zelador de escritório que apaga as luzes quando todo mundo vai embora.

Próximos passos

  • Adicione notificações SNS para receber um alerta no Slack ou e-mail quando o start/stop rodar com sucesso ou falhar.
  • Expanda a Lambda para outros recursos custosos: instâncias EC2, clusters Elasticache, domínios OpenSearch.
  • Tageie seus recursos (Environment=dev) e atualize a Lambda para segmentar por tag em vez de IDs fixos, para que funcione conforme a infraestrutura cresce.

Dúvidas ou feedback? Me encontre no LinkedIn ou GitHub.

Deixe um comentário