Lambda 'Start-Stop' AWS EC2 - python3.9
Tags: aws, python, lambda
Published: 2023-03-07 12:05:03

1- Crie uma função Lambda no console do AWS Lambda
    
- Acesse o console do AWS Lambda e clique no botão "Criar função"
- Escolha "Autor do zero/Author from scratch" e dê um nome à sua função
- Escolha a linguagem Python 3.9
- Clique em "Criar função" para criar a sua função

---

2- Adicione a política de acesso à função Lambda para gerenciar as instâncias EC2 (Configuration > Execution role)
    
- Clique na guia "Permissões" na página da sua função
- Clique no botão "Adicionar política"
- Selecione a política "AmazonEC2FullAccess" e clique em "Adicionar política" ou adicione uma política mais granular.

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:RebootInstances",
                "ec2:StartInstances",
                "ec2:DescribeInstances",
                "ec2:StopInstances"
            ],
            "Resource": "*"
        }
    ]
}
```
- Voltando ao painel do Lambda, na aba "Configuration" clique em "General Configuration" no menu a esquerda e altere o tempo de execução da lambda para 5 minutos.

---

3- Agora vamos adicionar código para ligar e desligar as instâncias com tag Desliga com valor true:
    
- Substitua o código da função Lambda pelo seguinte: (Clique em Deploy para salvar)
    
```
import boto3

ec2 = boto3.client('ec2')

def lambda_handler(event, context):
    instances = []
    filters = [
        {
            'Name': 'tag:Desliga',
            'Values': ['true']
        },
        {
            'Name': 'instance-state-name', 
            'Values': ['running', 'stopped']
        }
    ]
    response = ec2.describe_instances(Filters=filters)
    for reservation in response['Reservations']:
        for instance in reservation['Instances']:
            instances.append(instance['InstanceId'])

    # Ligando as instâncias
    ec2.start_instances(InstanceIds=instances)
    print('Instâncias ligadas: ' + str(instances))
    
    # Desligando as instâncias
    ec2.stop_instances(InstanceIds=instances)
    print('Instâncias desligadas: ' + str(instances))
    
    return 'Done!'
```

---

4- Adicione o trigger do EventBridge
    
- Clique na guia "Add Trigger" na página da sua função lambda
- Procure por Event Bridge e selecione-o
- Selecione "Create new rule"
- Em "Rule name", defina um nome para sua regra. (Ex.: start_stop_instances)
- Em "Rule description", defina o que a regra faz. (Ex.: Liga e Desliga instancias EC2 às 23 horas de segunda a sexta)
- Em "Schedule expression" coloque a seguinte sintaxe: cron(0 23 ? * MON-FRI *)
- Clique em Add para salvar a regra.

---

5- Teste sua função Lambda
    
- Clique no botão "Test" para testar sua função Lambda com um evento de exemplo.
- Verifique se as instâncias com a tag "Desliga" e valor "true" são ligadas ou desligadas corretamente.

---

- Este código em Python 3.9 é uma função Lambda que é executada pelo serviço AWS Lambda e é projetada para ser acionada por um evento do Amazon EventBridge.

- O objetivo da função é verificar o estado de todas as instâncias EC2 em uma conta da AWS e ligar ou desligar aquelas que possuem uma tag "Desliga" com valor "true".

---

Explicação:

- O código acima primeiro define o cliente EC2 com o Boto3.
- Em seguida, ele utiliza a função `describe_instances()` para buscar todas as instâncias com a tag "Desliga" com valor "true" e que estejam nos estados "running" ou "stopped".
- Depois, o código adiciona as IDs das instâncias encontradas em uma lista chamada "instances".
- Por fim, ele utiliza as funções `start_instances()` e `stop_instances()` para ligar e desligar as instâncias, respectivamente, e imprime uma mensagem no console.