Serverless Framework: Configurando alarmes do CloudWatch
Tags: ptbr, serverless, aws, monitoring
Published: 2020-09-11 02:32:07

Monitorar e alertar são aspectos essenciais para qualquer sistema de software em produção. Uma solução de monitoramento eficaz agrega dados em uma variedade de métricas e os apresenta de maneira legível e amigável. Um painel de monitoramento útil pode permitir que você responda rapidamente a perguntas sobre estatísticas de alto nível, como "quantos usuários se inscreveram em nosso aplicativo hoje" ou "quantas invocações do Lambda resultaram em erros na última hora". Do outro lado da moeda, um bom sistema de alerta permitirá que você responda a mudanças nessas métricas, talvez notificando um engenheiro de plantão de que algo deu errado.

No ambiente rápido de desenvolvimento do [Serverless Framework](https://serverless.com/) , nossa ferramenta preferida para aplicativos no [AWS Lambda](https://aws.amazon.com/lambda/) com [API Gateway](https://aws.amazon.com/api-gateway/) , é fácil esquecer a construção de uma solução robusta de monitoramento ou alerta. Felizmente, também é relativamente simples de fazer, graças à vasta gama de métricas disponíveis por padrão no [AWS CloudWatch](https://aws.amazon.com/cloudwatch/) .

## Métricas CloudWatch

Um bom conjunto de métricas forma a base de qualquer sistema de monitoramento ou alerta. O CloudWatch expõe métricas de uma ampla gama de serviços da AWS, incluindo aqueles comumente usados ​​em um aplicativo serverless, como API Gateway, Lambda, Cognito e DynamoDB. Você pode experimentar várias representações das métricas disponíveis no console do CloudWatch. Observe que você não precisa fazer nada para que essas métricas fluam para o CloudWatch. A AWS cuida de tudo para você.

[
![Um gráfico de uma métrica no CloudWatch](https://res.cloudinary.com/practicaldev/image/fetch/s--_Aut6Oix--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9um5lsm06obzk40bs537.png)](https://res.cloudinary.com/practicaldev/image/fetch/s--_Aut6Oix--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9um5lsm06obzk40bs537.png)  
_O console AWS CloudWatch que representa graficamente uma métrica do API Gateway_

As métricas podem ser visualizadas de várias maneiras, incluindo gráficos conforme mostrado na captura de tela acima, e essas visualizações podem ser adicionadas aos painéis do CloudWatch para um monitoramento rápido e certeiro. No entanto, isso requer que você esteja fisicamente observando a tela para detectar quaisquer possíveis anomalias. Deve haver uma maneira melhor!

## Alarmes do CloudWatch

Alarmes são o mecanismo exposto pelo CloudWatch para construir um sistema de alerta automatizado. Eles podem ser configurados para responder às mudanças em qualquer uma das métricas que exploramos anteriormente, notificando um tópico do [SNS](https://aws.amazon.com/sns/) sobre a mudança. Os tópicos do SNS são flexíveis e permitem uma variedade de respostas automáticas, como o envio de um e-mail para um endereço específico e manipuladores personalizados desenvolvidos no AWS Lambda.

CloudFormation tem um bom suporte para CloudWatch, portanto, é possível escrever sua infraestrutura de sistema de alerta como código na seção "recursos personalizados" de um projeto Serverless Framework. O exemplo a seguir configura um alarme CloudWatch que disparará quando qualquer número de erros 5xx for detectado por um estágio específico do API Gateway.  

```yaml
Resources:

  ApiGatewayAlarm5xx:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmDescription: Erros 5xx detectados no API Gateway
      Namespace: AWS/ApiGateway
      MetricName: 5XXError
      Statistic: Sum
      Threshold: 0
      ComparisonOperator: GreaterThanThreshold
      EvaluationPeriods: 1
      Period: 60
      Dimensions:
        - Name: ApiName
          Value:
            Fn::Join:
              - "-"
              -
                - Ref: ApiGatewayStage
                - ${self:service}
        - Name: Stage
          Value:
            Ref: ApiGatewayStage

```

Algumas das propriedades importantes aqui podem ser explicadas da seguinte forma:

-   `Namespace` - o namespace de serviço AWS cuja métrica você deseja alertar. Os namespaces disponíveis [estão listados na documentação](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/aws-services-cloudwatch-metrics.html) .
-   `MetricName` - a métrica específica que você deseja alertar. Geralmente, eles estão listados em algum lugar da documentação do serviço em questão. Por exemplo, o API Gateway os [lista aqui](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-metrics-and-dimensions.html) .

As propriedades `Statistic`, `Threshold` e `ComparisonOperator` definem uma mudança no estado da métrica que acionará o alarme. Neste caso, o alarme irá disparar se a métrica `5XXError` exceder um total de `0` em um período, `Period`, de `60` segundos (valor definido em segundos).

A propriedade `Dimensions` restringe efetivamente o alarme a um subconjunto de métricas disponíveis. Neste exemplo, o alarme só disparará para um estágio específico de um API Gateway específico. Se você tiver vários estágios ou APIs implantados em uma única conta, será importante garantir que seus alarmes sejam específicos o suficiente para não disparar falsos positivos.

## Adicionar ações aos alarmes

Com a configuração de exemplo acima, temos um alarme CloudWatch configurado e ele fará a transição entre os estados conforme o valor da métrica subjacente mudar. Para tornar este alarme uma parte útil de nossa estratégia de monitoramento e alerta, precisamos adicionar uma ação a ele.

Em um aplicativo serverless, é provável que a ação seja sempre uma notificação para um tópico SNS. Outras ações incluem determinadas ações EC2 e Auto Scaling que estão fora do escopo deste artigo. Como o próprio alarme CloudWatch, um tópico SNS pode ser codificado no CloudFormation:  

```yaml
Resources:

  TopicCloudwatchAlarm:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: ${self:service}-${self:custom.stage}-topic-cloudwatch-alarm

```

Um tópico SNS precisa de uma "assinatura" (_subscription_) para ser útil. Os tópicos SNS são capazes de enviar e-mails automaticamente para um determinado endereço para cada mensagem publicada neles. Podemos adicionar uma "assinatura" no CloudFormation também. Neste exemplo, a propriedade `TopicArn` faz referência ao recurso `TopicCloudwatchAlarm` definido acima por meio da função `Ref`:  

```yaml
Resources:

  TopicCloudwatchAlarmSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      Endpoint: alerts@example.com
      Protocol: email
      TopicArn:
        Ref: TopicCloudwatchAlarm

```

Com esses recursos implantados na AWS, qualquer mensagem publicada no novo tópico SNS será enviada para o endereço de e-mail especificado pela assinatura SNS. Resta apenas conectarmos o alarme CloudWatch ao tópico SNS. A propriedade `AlarmActions` no recurso de alarme CloudWatch leva o ARN do  
tópico SNS. Adicione o seguinte ao exemplo original para conectar tudo:  

```yaml
  AlarmActions:
    - Ref: TopicCloudwatchAlarm

```

Só falta acionar o alarme e verificar sua caixa de entrada!

[![Um email de alerta](https://res.cloudinary.com/practicaldev/image/fetch/s--XFhQYgUl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4ojaulmoebvy8ilw0ea2.png)](https://res.cloudinary.com/practicaldev/image/fetch/s--XFhQYgUl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4ojaulmoebvy8ilw0ea2.png)  
_Um e-mail enviado em resposta a um alarme CloudWatch_

## Próximos passos

O alarme que vimos neste artigo mal arranha a superfície do que é possível com o CloudWatch. Você pode criar alarmes que levam muitas métricas em consideração ao mesmo tempo. Você pode criar alarmes para avisá-lo quando um recurso da AWS está custando mais dinheiro do que você gostaria. Você pode até configurar alarmes com base na "detecção de anomalias", onde o CloudWatch analisará dados de métricas anteriores para criar um modelo de valores esperados e alertar sobre desvios dessa linha de base. Como acontece com a maioria dos serviços da AWS, a [documentação](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html) do [CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html) é útil e definitivamente recomendada para leitura se você quiser saber mais sobre esses alarmes mais avançados.

# Créditos

- [Setting up CloudWatch alarms with Serverless](https://dev.to/orangejellyfish/setting-up-cloudwatch-alarms-with-serverless-497i), escrito originalmente por [James Allardice](https://twitter.com/james_allardice).