Intégration de SNS et SQS avec CloudWatch

Surveillance et dépannage sur AWS

John Q. Martin

Principal Consultant

Raccorder les alarmes CloudWatch à 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

 

Flux : une alarme CloudWatch envoie via --alarm-actions vers un sujet SNS, qui diffuse aux abonné·e·s — courriel, SMS, Lambda et SQS

Surveillance et dépannage sur AWS

Concepts clés de SNS

Composantes

  • SNS est un modèle publication/abonnement : sujets, diffuseurs, abonné·e·s
  • Sujet : canal nommé ; les diffuseurs envoient, les abonné·e·s reçoivent
  • Publier une fois, diffuser simultanément à tous les abonné·e·s

Protocoles d'abonné (un sujet, plusieurs points de terminaison) :

  • Courriel, SMS
  • HTTP / HTTPS
  • Lambda, SQS
  • Notification mobile, Kinesis Firehose
Surveillance et dépannage sur AWS

Types de sujets SNS

 

Comparaison des types de sujets SNS Standard et FIFO selon l'ordre, le débit et les garanties de livraison

Surveillance et dépannage sur AWS

Créer des sujets SNS : AWS CLI

Sujet Standard

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

Sujet FIFO

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

Avec chiffrement

aws sns create-topic \
  --name production-alerts \
  --attributes KmsMasterKeyId=alias/aws/sns
Surveillance et dépannage sur AWS

Ajouter des abonné·e·s Lambda et 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
Surveillance et dépannage sur AWS

Format de message SNS depuis les alarmes 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"
  }
}
Surveillance et dépannage sur AWS

Filtrage des messages 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
Surveillance et dépannage sur AWS

Mise en forme personnalisée avec Lambda

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

    message = f"""
ALERTE : {alarm['AlarmName']}
Statut : {alarm['NewStateValue']}
Raison : {alarm['NewStateReason']}
Ressource : {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
    )

 

Chaîne : le sujet d'alarme brut alimente une Lambda qui formate un message lisible et le publie vers le sujet formatted-alerts pour l'ingénierie de garde, tandis que les consommateurs machines restent sur le sujet brut

Surveillance et dépannage sur AWS

Architecture en éventail avec SQS

Architecture en éventail où un message SNS est remis à plusieurs files SQS et à un consommateur Lambda

Surveillance et dépannage sur AWS

Configurer l'éventail (fan-out)

Quatre étapes

  1. Créer des files SQS (une par consommateur)
  2. Configurer les stratégies de file (autoriser SNS à envoyer)
  3. Abonner les files au sujet SNS
  4. Construire les consommateurs (sonder, traiter, supprimer)

Stratégie de file

{
  "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"
    }
  }
}
Surveillance et dépannage sur AWS

Abonnement des files

 

Abonner chaque file

aws sns subscribe \
  --topic-arn arn:aws:sns:...:production-alerts \
  --protocol sqs \
  --notification-endpoint arn:aws:sqs:...:alarm-logging-queue
Surveillance et dépannage sur AWS

Traitement des messages

Schéma de consommateur

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'])
    # Traiter les données d'alarme
    sqs.delete_message(QueueUrl=queue_url,
                       ReceiptHandle=message['ReceiptHandle'])
Surveillance et dépannage sur AWS

Éventail avec filtrage et files de lettres mortes

Livraison ciblée par abonnement

  • File de billetterie : {"NewStateValue":["ALARM"],"Severity":["Critical"]}
  • File de journalisation : pas de filtre (reçoit tout)
  • File de métriques : {"MessageType":["Metric"]}

 

Files de lettres mortes (DLQ)

aws sqs set-queue-attributes \
  --queue-url https://sqs..../alarm-logging-queue \
  --attributes '{
    "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:...:alarm-logging-dlq\",\"maxReceiveCount\":\"3\"}"
  }'
Surveillance et dépannage sur AWS

SNS vs SQS : quand utiliser chacun

Comparaison de la diffusion par poussée SNS et de la mise en file d'attente SQS par tirage

Surveillance et dépannage sur AWS

Exemples d'architecture

 

Schéma d'alerte simple envoyant une notification SNS par courriel

 

Traitement asynchrone : une API envoie à une file SQS consommée par un travailleur

Alerte multicanal où une alarme se diffuse vers plusieurs canaux de notification

Canal d'événements acheminant un événement source vers plusieurs files SQS pour traitement

Surveillance et dépannage sur AWS

Résumé de la vidéo

 

  • Les sujets SNS livrent des alertes par courriel, SMS, HTTP, Lambda et SQS
  • Modèle en éventail : un message SNS → plusieurs files SQS pour un traitement parallèle fiable
  • Le filtrage réduit le bruit selon l'abonné
  • Les files de lettres mortes capturent les échecs
  • SNS pour la poussée, SQS pour le traitement fiable ; ensemble pour un éventail fiable
Surveillance et dépannage sur AWS

Passons à la pratique !

Surveillance et dépannage sur AWS

Preparing Video For Download...