Integração de SNS e SQS com CloudWatch

Monitoramento e Solução de Problemas na AWS

John Q. Martin

Principal Consultant

Conectando alarmes do CloudWatch ao SNS

aws cloudwatch put-metric-alarm \
  --alarm-name HighCPUUtilization \
  --metric-name CPUUtilization \
  --namespace AWS/EC2 \
  --statistic Average \
  --period 300 \
  --evaluation-periods 2 \
  --threshold 80 \
  --comparison-operator GreaterThanThreshold \
  --alarm-actions arn:aws:sns:us-east-1:123456789012:production-alerts \
  --ok-actions arn:aws:sns:us-east-1:123456789012:recovery-notifications

 

Fluxo: um alarme do CloudWatch envia via --alarm-actions para um tópico SNS, que replica para assinantes — Email, SMS, Lambda e SQS

Monitoramento e Solução de Problemas na AWS

Conceitos centrais do SNS

Componentes

  • SNS é publisher/subscriber: tópicos, publicadores, assinantes
  • Tópico: canal nomeado; publicadores enviam, assinantes recebem
  • Publica uma vez; entregue simultaneamente a todos os assinantes

Protocolos de assinatura (um tópico, muitos endpoints):

  • Email, SMS
  • HTTP / HTTPS
  • Lambda, SQS
  • Push móvel, Kinesis Firehose
Monitoramento e Solução de Problemas na AWS

Tipos de tópico SNS

 

Comparação dos tipos de tópico SNS Standard e FIFO por ordenação, throughput e garantias de entrega

Monitoramento e Solução de Problemas na AWS

Criando tópicos SNS: AWS CLI

Tópico Standard

aws sns create-topic \
  --name production-alerts

Tópico FIFO

aws sns create-topic \
  --name production-alerts.fifo \
  --attributes FifoTopic=true,\
    ContentBasedDeduplication=true

Com criptografia

aws sns create-topic \
  --name production-alerts \
  --attributes KmsMasterKeyId=alias/aws/sns
Monitoramento e Solução de Problemas na AWS

Adicionando assinantes Lambda e SMS

 

Lambda

aws sns subscribe \
  --topic-arn arn:aws:sns:us-east-1:123456789012:production-alerts \
  --protocol lambda \
  --notification-endpoint arn:aws:lambda:us-east-1:123456789012:function:ProcessAlert

SMS

aws sns subscribe \
  --topic-arn arn:aws:sns:us-east-1:123456789012:critical-alerts \
  --protocol sms \
  --notification-endpoint +1234567890
Monitoramento e Solução de Problemas na AWS

Formato da mensagem SNS de alarmes do CloudWatch

{
  "AlarmName": "HighCPUUtilization",
  "NewStateValue": "ALARM",
  "OldStateValue": "OK",
  "NewStateReason": "Threshold Crossed: 2 datapoints [85.0, 90.0] were greater than the threshold (80.0).",
  "StateChangeTime": "2026-03-27T10:30:45.123+0000",
  "Trigger": {
    "MetricName": "CPUUtilization",
    "Namespace": "AWS/EC2",
    "Statistic": "AVERAGE",
    "Period": 300,
    "Threshold": 80.0,
    "ComparisonOperator": "GreaterThanThreshold"
  }
}
Monitoramento e Solução de Problemas na AWS

Filtragem de mensagens no SNS

aws sns set-subscription-attributes \
  --subscription-arn arn:aws:sns:...:production-alerts:abc123 \
  --attribute-name FilterPolicy \
  --attribute-value '{"AlarmName":["HighCPUUtilization"],"NewStateValue":["ALARM"]}'

aws sns set-subscription-attributes \
  --subscription-arn arn:aws:sns:...:production-alerts:abc123 \
  --attribute-name FilterPolicyScope \
  --attribute-value MessageBody
Monitoramento e Solução de Problemas na AWS

Formatação personalizada de notificações com Lambda

def lambda_handler(event, context):
    alarm = json.loads(event['Records'][0]['Sns']['Message'])

    message = f"""
ALERTA: {alarm['AlarmName']}
Status: {alarm['NewStateValue']}
Motivo: {alarm['NewStateReason']}
Recurso: {alarm['Trigger']['Dimensions'][0]['value']}
Runbook: https://wiki.example.com/runbooks/high-cpu
    """

    sns.publish(
        TopicArn='arn:aws:sns:...:formatted-alerts',
        Subject=f"{alarm['AlarmName']}",
        Message=message
    )

 

Cadeia: o tópico de alarme bruto aciona uma Lambda que formata uma mensagem legível e publica no tópico formatted-alerts para quem está de plantão, enquanto consumidores de máquina ficam no tópico bruto

Monitoramento e Solução de Problemas na AWS

Arquitetura fan-out com SQS

Arquitetura fan-out onde uma mensagem SNS entrega para múltiplas filas SQS e um consumidor Lambda

Monitoramento e Solução de Problemas na AWS

Configurando fan-out

Quatro etapas

  1. Criar filas SQS (uma por consumidor)
  2. Configurar políticas da fila (permitir SNS enviar mensagens)
  3. Assinar as filas ao tópico SNS
  4. Construir consumidores (poll, processar, deletar)

Política da fila

{
  "Effect": "Allow",
  "Principal": { "Service": "sns.amazonaws.com" },
  "Action": "sqs:SendMessage",
  "Resource": "arn:aws:sqs:...:alarm-logging-queue",
  "Condition": {
    "ArnEquals": {
      "aws:SourceArn": "arn:aws:sns:...:production-alerts"
    }
  }
}
Monitoramento e Solução de Problemas na AWS

Assinando filas

 

Assinar cada fila

aws sns subscribe \
  --topic-arn arn:aws:sns:...:production-alerts \
  --protocol sqs \
  --notification-endpoint arn:aws:sqs:...:alarm-logging-queue
Monitoramento e Solução de Problemas na AWS

Processando mensagens

Padrão do consumidor

response = sqs.receive_message(
    QueueUrl=queue_url,
    MaxNumberOfMessages=10,
    WaitTimeSeconds=20       # Long polling
)
for message in response.get('Messages', []):
    sns_msg = json.loads(message['Body'])
    alarm = json.loads(sns_msg['Message'])
    # Processar dados do alarme
    sqs.delete_message(QueueUrl=queue_url,
                       ReceiptHandle=message['ReceiptHandle'])
Monitoramento e Solução de Problemas na AWS

Fan-out com filtragem e dead letter queues

Entrega direcionada por assinatura

  • Fila de tickets: {"NewStateValue":["ALARM"],"Severity":["Critical"]}
  • Fila de logs: sem filtro (recebe tudo)
  • Fila de métricas: {"MessageType":["Metric"]}

 

Dead letter queues (DLQ)

aws sqs set-queue-attributes \
  --queue-url https://sqs..../alarm-logging-queue \
  --attributes '{
    "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:...:alarm-logging-dlq\",\"maxReceiveCount\":\"3\"}"
  }'
Monitoramento e Solução de Problemas na AWS

SNS vs. SQS: quando usar cada um

Comparação entre entrega push do SNS e enfileiramento pull do SQS

Monitoramento e Solução de Problemas na AWS

Exemplos de arquitetura

 

Padrão de alerta simples enviando uma notificação SNS para email

 

Padrão de processamento assíncrono com uma API enviando para uma fila SQS consumida por um worker

Padrão de alerta multicanal onde um alarme replica para vários canais de notificação

Padrão de pipeline de eventos roteando um evento de origem para múltiplas filas SQS para processamento

Monitoramento e Solução de Problemas na AWS

Resumo do vídeo

 

  • Tópicos SNS entregam alertas via email, SMS, HTTP, Lambda e SQS
  • Padrão fan-out: uma mensagem SNS → múltiplas filas SQS para processamento paralelo e confiável
  • Filtragem de mensagens reduz ruído por assinante
  • Dead letter queues capturam falhas
  • SNS para push, SQS para processamento confiável; ambos para fan-out com confiabilidade
Monitoramento e Solução de Problemas na AWS

Vamos praticar!

Monitoramento e Solução de Problemas na AWS

Preparing Video For Download...