Automatizar Start/Stop EC2 com Lambda

Paulo Ponciano
4 min readJul 23, 2022

--

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

  1. 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": "*"
}
]
}

2. 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:

3. 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")
Associação da IAM role criada anteriormente
Deploy

4. 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")
Associação da IAM role criada anteriormente
Deploy

5. 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

6. 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

7. 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!

--

--

Paulo Ponciano

Solutions Architect | 7x AWS Certified | AWS Black Belt | AWS Community Builder