Intégration de SNS et SQS avec CloudWatch

Supervision et dépannage sur AWS

John Q. Martin

Principal Consultant

Relier 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és — Email, SMS, Lambda et SQS

Supervision et dépannage sur AWS

Concepts clés de SNS

Composants

  • SNS suit le modèle publication/abonnement : sujets, éditeurs, abonnés
  • Sujet : canal nommé ; les éditeurs envoient, les abonnés reçoivent
  • Publiez une fois, livraison simultanée à tous les abonnés

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

  • Email, SMS
  • HTTP / HTTPS
  • Lambda, SQS
  • Notifications mobiles, Kinesis Firehose
Supervision 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

Supervision 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
Supervision et dépannage sur AWS

Ajouter des abonné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
Supervision et dépannage sur AWS

Format des messages SNS issus des 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"
  }
}
Supervision 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
Supervision et dépannage sur AWS

Mise en forme personnalisée des notifications avec Lambda

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

    message = f"""
ALERT: {alarm['AlarmName']}
Status: {alarm['NewStateValue']}
Reason: {alarm['NewStateReason']}
Resource: {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 met en forme un message lisible et publie vers le sujet formatted-alerts pour l'astreinte, tandis que les consommateurs machines restent sur le sujet brut

Supervision et dépannage sur AWS

Architecture « fan-out » avec SQS

Architecture « fan-out » où un message SNS alimente plusieurs files SQS et un consommateur Lambda

Supervision et dépannage sur AWS

Mise en place du 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 (polling, traitement, suppression)

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

Traitement des messages

Modèle 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'])
Supervision et dépannage sur AWS

Fan-out avec filtrage et files de lettres mortes

Livraison ciblée par abonnement

  • File de tickets : {"NewStateValue":["ALARM"],"Severity":["Critical"]}
  • File de logs : 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\"}"
  }'
Supervision et dépannage sur AWS

SNS vs SQS : quand utiliser chacun

Comparaison entre la diffusion « push » de SNS et la mise en file d'attente « pull » de SQS

Supervision et dépannage sur AWS

Exemples d'architecture

 

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

 

Traitement asynchrone : une API envoie vers une file SQS consommée par un worker

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

Pipeline d'événements routant un événement source vers plusieurs files SQS pour traitement

Supervision et dépannage sur AWS

Résumé de la vidéo

 

  • Les sujets SNS livrent des alertes par email, SMS, HTTP, Lambda et SQS
  • Modèle fan-out : un message SNS → plusieurs files SQS pour un traitement parallèle et fiable
  • Le filtrage réduit le bruit par abonné
  • Les files de lettres mortes capturent les échecs
  • SNS pour le push, SQS pour le traitement fiable ; ensemble pour un fan-out fiable
Supervision et dépannage sur AWS

Passons à la pratique !

Supervision et dépannage sur AWS

Preparing Video For Download...