DEV Community

Railander Marques
Railander Marques

Posted on

Automação para Reiniciar Apache via Cloudwatch Logs + AWS Lambda

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": [
        "*"
    ]
  }
 ]
}
Enter fullscreen mode Exit fullscreen mode

3- Instalar o apache na instância:

:::

\$ avá
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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": "*"
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode
  • 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
Enter fullscreen mode Exit fullscreen mode

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.

Image description


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

Image of Datadog

How to Diagram Your Cloud Architecture

Cloud architecture diagrams provide critical visibility into the resources in your environment and how they’re connected. In our latest eBook, AWS Solution Architects Jason Mimick and James Wenzel walk through best practices on how to build effective and professional diagrams.

Download the Free eBook

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more