Automação para Reiniciar Apache via Cloudwatch Logs + AWS Lambda
1- Criar uma instância EC2:
:::
2- Adicionar as seguintes políticas na role da instância:
:::
Essa serve para publicar os logs no CloudWatch Logs:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogStreams"
    ],
      "Resource": [
        "*"
    ]
  }
 ]
}
3- Instalar o apache na instância:
:::
\$ avá
4- Instalar o agente do Cloudwatch logs:
:::
- Para Ubuntu
sudo apt update -y
cd /tmp
curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O
sudo apt install python
sudo python ./awslogs-agent-setup.py --region us-east-1
Na instalação, você pode adicionar quantos logs quiser, porem se quiser adicionar somente o do apache, altere a configuração padrão durante a configuração do primeiro log.
Outra questão é você pular as etapas de configurar uma credencial programática, porque voce ja colocou na função da instância.
5- Crie uma Lambda para triggar um restart no apache2
:::
- Para isso, devemos criar uma rule do tipo LAMBDA, com as seguintes permissões
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "logs:ListTagsLogGroup",
                "logs:GetDataProtectionPolicy",
                "ssm:SendCommand",
                "logs:GetLogRecord",
                "ec2:DescribeInstances",
                "logs:DescribeLogStreams",
                "logs:DescribeSubscriptionFilters",
                "logs:StartQuery",
                "logs:DescribeMetricFilters",
                "logs:GetLogDelivery",
                "logs:ListLogDeliveries",
                "logs:CreateLogStream",
                "logs:GetLogEvents",
                "logs:FilterLogEvents",
                "logs:DescribeQueryDefinitions",
                "logs:DescribeResourcePolicies",
                "logs:DescribeDestinations",
                "logs:DescribeQueries",
                "ec2:RebootInstances",
                "logs:DescribeLogGroups",
                "logs:Unmask",
                "logs:StopQuery",
                "logs:TestMetricFilter",
                "logs:PutLogEvents",
                "logs:CreateLogGroup",
                "logs:ListTagsForResource",
                "logs:DescribeExportTasks",
                "logs:GetQueryResults",
                "logs:GetLogGroupFields"
            ],
            "Resource": "*"
        }
    ]
}
- 
Vá ao painel do AWS Lambda - Crie uma nova função
- Dê um nome a esta função, sugestivo
- Use python 3.9
- Escolha a rule que você criou com as políticas acima
 
- No código substitua por este aqui 
 
import boto3
import json
def lambda_handler(event, context):
    client = boto3.client('logs')
    pattern = "erro" # Substitua por uma palavra que deseja procurar no log que deseja triggar
    log_group = "/var/log/apache2/error.log" # Substitua pelo nome do grupo de logs que deseja monitorar
    response = client.filter_log_events(logGroupName=log_group, filterPattern=pattern)
    if len(response['events']) > 0:
        ssm_client = boto3.client('ssm')
        instance_id = "i-0635fe42216b1dcd8" # Substitua pelo ID da instância que deseja reiniciar
        response = ssm_client.send_command(
            InstanceIds=[instance_id],
            DocumentName="AWS-RunShellScript",
            Parameters={'commands': ['systemctl restart apache2']}) # Substitua pelo comando que deseja executar
Observações:
Preste atenção em “pattern”, “log_group”, “instance_id” e “Parameters”
- Altere o tempo de duração para 1 min.
- Faça o Deploy e um teste, quando realizei, ele retornou algo dessa forma, e quando abri a instância, o apache foi reiniciado, ou seja, a lambda esta funcionando.
7- Agora vamos configurar uma regra para o CloudWatch e triggar a lambda ao receber a palavra erro.
:::
No console da lambda que criou;
- Clique em Add Trigger,
- Procure por Cloudwatch Logs,
- Selecione seu grupo de logs que deseja filtrar,
- Coloque um apelido para o filtro,
- Adicione a palavra “erro” ou correspondente que queira filtrar para a lambda ler, depois aplique.
Pronto! Agora você criou uma regra do CloudWatch Logs que monitorará seus logs do Apache e acionará uma ação da Lambda para reiniciar o serviço sempre que receber um log com a palavra "erro".
 


 
    
Top comments (0)