Verificar rotinas de Snapshots via Lambda
Tags: aws, python, lambda, ptbr
Published: 2023-02-11 16:05:52

## Introdução

O backup é peça chave nas operações de qualquer ambiente e deixar de realizar alguma rotina pode resultar em surpresas desagradáveis em algum procedimento de recuperação.

Existem diversas formas de realizar backups dos seus recursos e serviços na AWS. Quando se trata de Instâncias EC2 e RDS, a AWS oferece ferramentas como o [AWS Backup](https://aws.amazon.com/pt/backup/) ou serviço de backup integrado no próprio recurso, como é o caso do RDS por exemplo.

Apesar da facilidade em manter seus backups em dia, sabemos que sempre tem aquela exceção(zinha) que foge à regra e com o tempo pode acabar no limbo. Pensando nisso, elaborei este script em Python para poder verificar se os volumes de suas contas estão com o snapshot em dia. 🙂

## Vamos aos passos

**1 - Criar uma função do IAM para o Lambda**

Acesse o console do **IAM**, no menu lateral esquerdo clique em **Roles** e depois clique no botão **Create role**. 

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8hf2vmimd5zc1rfh4eag.png)

Em **Select trusted entity** selecione **AWS service**, **Lambda** e clique em **Next**. 

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dthxh38gsqt4n09hgerg.png)

Clique no botão **Create policy**. Uma nova guia será aberta para criação da policy. Vá na guia **JSON** do editor, cole o seguinte código abaixo e depois clique em **Next** para avançar para a parte de **Review policy**:

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudwatch:PutMetricData",
                "ec2:DescribeInstances",
                "ec2:DescribeVolumeStatus",
                "ec2:DescribeSnapshotAttribute",
                "ec2:DescribeRegions",
                "ec2:DescribeVolumes",
                "ec2:DescribeVolumesModifications",
                "ec2:DescribeSnapshots",
                "ec2:DescribeVolumeAttribute"
            ],
            "Resource": [
                "*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*"
            ],
            "Effect": "Allow"
        }
    ]
}
```

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4hu2j8owpicefj8bjzhv.png)

Dê um nome para sua Policy e clique em **Create policy**.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eeuhxhkgrd8vphue42pw.png)

Volte para a guia da criação da Role em seu navegador e atualize a lista de policies. Pesquise pela policy criada anteriormente, selecione-a e clique em **Next**.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g43we8l6wjl8hm1p144s.png)

Dê um nome para sua Role e clique em **Create role**. Pronto, sua Role está criada.

## 2 - Criar função Lambda

Abra o console do **Lambda**, no menu lateral esquerdo clique em **Functions** e depois no botão **Create function**.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/saj3btosax159u0dv2dj.png)

Selecione **Author from scratch**, dê um nome para sua função e escolha o **Runtime Python 3.9**.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/853d4hd9czfqbfe65jiz.png)

Em **Permissions**, selecione o item **Use an existing role** e no campo de seleção escolha a Role criada anteriormente. Feito isso clique em **Create function**.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qu0t5kkc2u16mxxgojv0.png)

Com isso sua função está criada. Agora vamos substituir o código de exemplo da função pelo código [deste repositório](https://github.com/isaque21/lambda/blob/main/ebs-check-snapshots/lambda_function.py). 

Este código seleciona todos os volumes da conta e verifica se cada um deles possui ou não algum snapshot realizado. 

Caso NÃO possua algum snapshot realizado, será impresso a seguinte mensagem nos logs de execução: 

`[ALERT] The Volume-ID: vol-a1b2c3d4e5f6g7 does not have a Snapshot.`

Se o volume possuir algum snapshot mas esse for mais antigo do que a quantidade de dias inserida na constante de verificação `DAYS = x` será impresso a mensagem: 

`[ALERT] The last Snapshot of Volume-ID: vol-a1b2c3d4e5f6g7 was in 2022-09-23 01:33:04.596000+00:00.`

Se por algum motivo você quiser excluir algum volume da verificação, basta adicionar a tag `snapshot:false` no volume desejado. Então verá na saída de logs a mensagem: 

`[WARNING] Volume-ID: vol-a1b2c3d4e5f6g7 excluded from snapshot routine.`

Por padrão, o código verifica se os snapshots mais recentes possuem mais de 3 dias, mas você pode alterar esse valor na constante `DAYS = x` no início do código.

Caso a saída do código **não retorne nada** significa que seus volumes estão com o snapshot **em dia**.

Após substituir o código, clique em **Deploy** para salvar.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5u6oz4ps9jiwyayg79wq.png)

Após salvar o código, vá até a guia **Configuration** e clique em **Edit**.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kv9260nwwce3owrnk9rm.png)

Altere o **Timeout** para 1 minuto e 30 segundos (pode ser necessário um tempo maior dependendo da quantidade de volumes na conta) e depois clique em **Save**.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9lpuxlz6h69n6bmu2ylz.png)

Volte na guia **Code**, clique em **Test** para configurar um novo evento de teste.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ap5k171ht58rs86i0k6c.png)

Dê um nome ao evento, mantenha o restante das configurações padrão e clique em **Save**.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dqw1udl3dflbv6z5jlg0.png)

Após salvar o Evento, clique no botão **Test** novamente para executar sua função Lambda.

## 3 - Analisando os Logs

Após executar a função, você verá uma saída parecida com esta abaixo:

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dhtj4yc9v8yz3hofc8u6.png)

Para uma visualização mais completa, vamos analisar essa saída no **Log Groups** do **CloudWatch**. Para isso clique na guia **Monitor** e depois em **View CloudWatch logs**.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nvmthd5hlk4tqwprcvp9.png)

Com isso você será redirecionado para o Grupo de logs da função Lambda que você criou. Clique no **Log stream** mais recente para visualizar a saída completa da Função.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l1lrsrsgs9ca48d6nm2m.png)

Dessa forma você pode ter uma visão completa, o que dependendo do seu ambiente pode ser bem extensa.

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ezacj0nc6tr7zf9tx00e.png)

## Conclusão

A partir dos logs no **CloudWatch** podemos criar alarmes com base em filtros de métricas e assim termos uma monitoria de backup de todos os volumes da conta, mas isso é um assunto para um próximo post. 

Vou ficando por aqui e qualquer feedback só deixar nos comentários.