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 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.
Em Select trusted entity selecione AWS service, Lambda e clique em Next.
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"}]}{ "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" } ] }{ "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" } ] }
Enter fullscreen mode Exit fullscreen mode
Dê um nome para sua Policy e clique em Create policy.
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.
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.
Selecione Author from scratch, dê um nome para sua função e escolha o Runtime Python 3.9.
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.
Com isso sua função está criada. Agora vamos substituir o código de exemplo da função pelo código deste repositório.
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.
Após salvar o código, vá até a guia Configuration e clique em Edit.
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.
Volte na guia Code, clique em Test para configurar um novo evento de teste.
Dê um nome ao evento, mantenha o restante das configurações padrão e clique em Save.
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:
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.
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.
Dessa forma você pode ter uma visão completa, o que dependendo do seu ambiente pode ser bem extensa.
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.
暂无评论内容