Automação para Reiniciar Apache via Cloudwatch Logs + AWS Lambda
Tags: apache, lambda, cloudwatch, ec2
Published: 2024-01-04 13:03:03

# 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:

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogStreams"
    ],
      "Resource": [
        "*"
    ]
  }
 ]
}
```


---



**3- Instalar o apache na instância:**

:::

```yaml
\$ avá
```


---



**4- Instalar o agente do Cloudwatch logs:**

:::


* Para Ubuntu

```bash
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

```json
{
    "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

```python
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.

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


---



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