SNS- en SQS-integratie met CloudWatch

Monitoring en troubleshooting van AWS

John Q. Martin

Principal Consultant

CloudWatch-alarms koppelen aan 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

 

Stroom: een CloudWatch Alarm stuurt via --alarm-actions naar een SNS-topic, dat uitzendt naar abonnees — e-mail, SMS, Lambda en SQS

Monitoring en troubleshooting van AWS

Belangrijke SNS-concepten

Componenten

  • SNS is publisher/subscriber: topics, publishers, subscribers
  • Topic: benoemd kanaal; publishers sturen, subscribers ontvangen
  • Eén publicatie, tegelijk afgeleverd aan alle subscribers

Subscriber-protocollen (één topic, veel endpoints):

  • E-mail, SMS
  • HTTP / HTTPS
  • Lambda, SQS
  • Mobile push, Kinesis Firehose
Monitoring en troubleshooting van AWS

SNS-topictypes

 

Vergelijking van SNS Standard- en FIFO-topictypes op ordering, throughput en aflevergaranties

Monitoring en troubleshooting van AWS

SNS-topics maken: AWS CLI

Standaardtopic

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

FIFO-topic

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

Met versleuteling

aws sns create-topic \
  --name production-alerts \
  --attributes KmsMasterKeyId=alias/aws/sns
Monitoring en troubleshooting van AWS

Lambda- en SMS-subscribers toevoegen

 

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
Monitoring en troubleshooting van AWS

SNS-berichtformaat van CloudWatch-alarms

{
  "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"
  }
}
Monitoring en troubleshooting van AWS

SNS-berichtfiltering

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
Monitoring en troubleshooting van AWS

Aangepaste notificatieopmaak met 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
    )

 

Keten: het ruwe alarmtopic voedt een Lambda die een leesbaar bericht opmaakt en publiceert naar het formatted-alerts-topic voor de on-call engineer, terwijl machines op het ruwe topic blijven

Monitoring en troubleshooting van AWS

Fan-out-architectuur met SQS

Fan-out-architectuur waarbij één SNS-bericht wordt afgeleverd aan meerdere SQS-queues en een Lambda-consumer

Monitoring en troubleshooting van AWS

Fan-out instellen

Vier stappen

  1. Maak SQS-queues (één per consumer)
  2. Stel queue policies in (sta SNS toe berichten te sturen)
  3. Abonneer queues op het SNS-topic
  4. Bouw consumers (poll, verwerk, verwijder)

Queue policy

{
  "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"
    }
  }
}
Monitoring en troubleshooting van AWS

Queues abonneren

 

Abonneer elke queue

aws sns subscribe \
  --topic-arn arn:aws:sns:...:production-alerts \
  --protocol sqs \
  --notification-endpoint arn:aws:sqs:...:alarm-logging-queue
Monitoring en troubleshooting van AWS

Berichten verwerken

Consumer-patroon

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'])
    # Verwerk alarmgegevens
    sqs.delete_message(QueueUrl=queue_url,
                       ReceiptHandle=message['ReceiptHandle'])
Monitoring en troubleshooting van AWS

Fan-out met filtering en dead letter queues

Gerichte levering per abonnement

  • Ticketing-queue: {"NewStateValue":["ALARM"],"Severity":["Critical"]}
  • Logging-queue: geen filter (krijgt alles)
  • Metrics-queue: {"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\"}"
  }'
Monitoring en troubleshooting van AWS

SNS vs. SQS: wanneer gebruik je welke?

Vergelijking van SNS push-gebaseerde levering versus SQS pull-gebaseerde message queuing

Monitoring en troubleshooting van AWS

Architectuurvoorbeelden

 

Eenvoudig alertpatroon dat een SNS-notificatie naar e-mail stuurt

 

Async-verwerkingspatroon met een API die naar een SQS-queue stuurt die door een worker wordt verwerkt

Multi-channel alertingpatroon waarbij één alarm uitzendt naar meerdere notificatiekanalen

Eventpijplijnpatroon dat een bron-event routeert naar meerdere SQS-queues voor verwerking

Monitoring en troubleshooting van AWS

Videosamenvatting

 

  • SNS-topics leveren alarmnotificaties via e-mail, SMS, HTTP, Lambda en SQS
  • Fan-outpatroon: één SNS-bericht → meerdere SQS-queues voor parallelle, betrouwbare verwerking
  • Berichtfiltering vermindert ruis per subscriber
  • Dead letter queues vangen mislukte berichten af
  • SNS voor pushnotificaties, SQS voor betrouwbare verwerking; beide voor fan-out met betrouwbaarheid
Monitoring en troubleshooting van AWS

Laten we oefenen!

Monitoring en troubleshooting van AWS

Preparing Video For Download...