Automatizar Start/Stop EC2 com Lambda
Tags: community, aws, lambda
Published: 2024-01-29 10:19:53

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

![](https://cdn-images-1.medium.com/max/2000/1*hx3NQ7ZDAGWdWI_qO2D1bA.jpeg)

### 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:

```json
{
    "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": "*"
        }
    ]
}
```

![](https://cdn-images-1.medium.com/max/2000/1*-xQs7EpKkTLA9Z_BDE6JRw.png)

![](https://cdn-images-1.medium.com/max/2198/1*w9mP1xq3W55s1pKW7oMNkA.png)

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

![](https://cdn-images-1.medium.com/max/2910/1*WlNJQx_Fa-iTgrxZI_NL2A.png)

![](https://cdn-images-1.medium.com/max/2360/1*6RRbwL36SHYzOf8jLk_48w.png)

![](https://cdn-images-1.medium.com/max/2360/1*L51f6-NaJmj0Z8tGc_agrA.png)

- Criação da função lambda para *Start* utilizando python:

```py
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")
```

![](https://cdn-images-1.medium.com/max/2000/1*C9uIjJXcR7dgxxrmj00-dg.png)

![Associação da IAM role criada anteriormente](https://cdn-images-1.medium.com/max/2262/1*QHwdHxZ2-MwIvN1GPxOs6w.png)

![Deploy](https://cdn-images-1.medium.com/max/2000/1*OiJSjYB5HO0Rr7ucs3fZzg.png)

- Criação da função lambda para *Stop* utilizando python:

```py
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")
```

![](https://cdn-images-1.medium.com/max/2000/1*ODvTKk_w3Uv-YtGEFnDU7Q.png)

![Associação da IAM role criada anteriormente](https://cdn-images-1.medium.com/max/2262/1*QHwdHxZ2-MwIvN1GPxOs6w.png)

![Deploy](https://cdn-images-1.medium.com/max/2000/1*63p00ZODyjm7wX4tYLyg5Q.png)

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

![](https://cdn-images-1.medium.com/max/2032/1*eXjBJUbYzMH6bWzkDlKfmw.png)

![cron (00 11 ? * * *)](https://cdn-images-1.medium.com/max/2032/1*2itma9aUVXUuU5cKmhxGAA.png)

![Definição de target para rule](https://cdn-images-1.medium.com/max/2032/1*koSBcjOLwtkN3Sb3Itmyyg.png)

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

![](https://cdn-images-1.medium.com/max/2032/1*LvYbk1CQFnvNe3flOAPJig.png)

![cron (00 21 ? * * *)](https://cdn-images-1.medium.com/max/2032/1*fe1yrHCGOeyFZ6Sqx4Ecdw.png)

![Definição de target para rule](https://cdn-images-1.medium.com/max/2032/1*I7QMKL8uE3v1uf1Alhmg0A.png)

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

![](https://cdn-images-1.medium.com/max/2000/1*3ATDTMvnbzeHxrpe5wCQCg.png)

Happy building!