DEV Community

Paulo Ponciano
Paulo Ponciano

Posted on • Edited on • Originally published at Medium

Automatizar Start/Stop EC2 com Lambda

Esse roteiro pode fazer sentido para você, caso esteja precisando automatizar algumas tarefas em seu ambiente, como um simples Start e Stop de suas instâncias EC2 em determinados horários, dias, etc.

Além de automatizar, podemos é claro, economizar!

Facilmente aplicável a ambientes de desenvolvimento e homologação, que normalmente, são mais consumidos durante o dia (8AM às 6PM).

Pré-requisitos

  • Acesso ao console AWS e aos serviços: EC2, IAM, Lambda e EventBridge

O que esperar

  • Agendamento com EventBridge para Start automático de EC2 as 8AM utilizando função lambda e python 3.7

  • Agendamento com EventBridge para Stop automático de EC2 as 6PM utilizando função lambda e python 3.7

  • Criação de IAM policy e role para permitir as ações das funções lambda

  • Classificação das instâncias EC2 utilizando a TAG ‘Scheduled’ com valor ‘yes’

Execução

  • Criação de IAM policy:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:Start*",
                "ec2:Stop*"
            ],
            "Resource": "*"
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

  • Criação de IAM role utilizando a policy criada anteriormente — Assim a função lambda poderá assumir temporariamente as permissões que informamos na policy:

  • Criação da função lambda para Start utilizando python:
import boto3

ec2 = boto3.resource('ec2')

def lambda_handler(event, context):

    filters = [{
        'Name': 'tag:Scheduled',
        'Values': ['yes']
        },
        {
            'Name': 'instance-state-name', 
            'Values': ['stopped']
        }
    ]

    instances = ec2.instances.filter(Filters=filters)   

    RunningInstances = [instance.id for instance in instances]

    print(RunningInstances)

    if len(RunningInstances) > 0:
        shuttingDown = ec2.instances.filter(InstanceIds=RunningInstances).start()
        print("Start")
    else:
        print("All Running")
Enter fullscreen mode Exit fullscreen mode

Associação da IAM role criada anteriormente

Deploy

  • Criação da função lambda para Stop utilizando python:
import boto3

ec2 = boto3.resource('ec2')

def lambda_handler(event, context):

    filters = [{
        'Name': 'tag:Scheduled',
        'Values': ['yes']
        },
        {
            'Name': 'instance-state-name', 
            'Values': ['running']
        }
    ]

    instances = ec2.instances.filter(Filters=filters)   

    RunningInstances = [instance.id for instance in instances]

    print(RunningInstances)

    if len(RunningInstances) > 0:

        shuttingDown = ec2.instances.filter(InstanceIds=RunningInstances).stop()
        print("Stopping")
    else:
        print("All Stopped")
Enter fullscreen mode Exit fullscreen mode

Associação da IAM role criada anteriormente

Deploy

  • Criando rule do EventBridge para agendar acionamento da função lambda de Start — Acionamento diário 8AM (GMT-3):

cron (00 11 ? * * *)

Definição de target para rule

  • Criando rule do EventBridge para agendar acionamento da função lambda de Stop — Acionamento diário 6PM (GMT-3):

cron (00 21 ? * * *)

Definição de target para rule

  • No passo final, adicionar TAG ‘Scheduled’ na instância desejada com valor ‘yes’ — Dessa forma, a instância se torna alvo das funções lambda:

Happy building!

Top comments (0)