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 , nossa ferramenta preferida para aplicativos no AWS Lambda 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 .
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ê.
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 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.
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 . -
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 .
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:
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
:
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:
AlarmActions:
- Ref: TopicCloudwatchAlarm
Só falta acionar o alarme e verificar sua caixa de entrada!
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 do CloudWatch é ú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, escrito originalmente por James Allardice.
Top comments (0)