SNS- und SQS-Integration mit CloudWatch

Überwachung und Fehlersuche in AWS

John Q. Martin

Principal Consultant

CloudWatch-Alarme mit SNS verbinden

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

 

Ablauf: Eine CloudWatch-Alarmregel sendet via --alarm-actions an ein SNS-Topic, das an Abonnenten verteilt — E-Mail, SMS, Lambda und SQS

Überwachung und Fehlersuche in AWS

Zentrale SNS-Konzepte

Komponenten

  • SNS ist Publisher/Subscriber: Topics, Publisher, Subscriber
  • Topic: benannter Kanal; Publisher senden, Subscriber empfangen
  • Einmal publizieren, gleichzeitig an alle Subscriber zugestellt

Abonnentenprotokolle (ein Topic, viele Endpunkte):

  • E-Mail, SMS
  • HTTP / HTTPS
  • Lambda, SQS
  • Mobile Push, Kinesis Firehose
Überwachung und Fehlersuche in AWS

SNS-Topic-Typen

 

Vergleich der SNS-Topic-Typen Standard und FIFO nach Reihenfolge, Durchsatz und Zustellungsgarantien

Überwachung und Fehlersuche in AWS

SNS-Topics erstellen: AWS CLI

Standard-Topic

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

FIFO-Topic

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

Mit Verschlüsselung

aws sns create-topic \
  --name production-alerts \
  --attributes KmsMasterKeyId=alias/aws/sns
Überwachung und Fehlersuche in AWS

Lambda- und SMS-Abonnenten hinzufügen

 

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
Überwachung und Fehlersuche in AWS

SNS-Nachrichtenformat von CloudWatch-Alarmen

{
  "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"
  }
}
Überwachung und Fehlersuche in AWS

SNS-Nachrichten filtern

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
Überwachung und Fehlersuche in AWS

Benutzerdefiniertes Benachrichtigungsformat mit 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
    )

 

Kette: Das rohe Alarm-Topic speist eine Lambda-Funktion, die eine lesbare Nachricht formatiert und an das Topic formatted-alerts publiziert; die Rufbereitschaft erhält formatiert, Maschinen konsumieren roh

Überwachung und Fehlersuche in AWS

Fan-out-Architektur mit SQS

Fan-out-Architektur, bei der eine SNS-Nachricht an mehrere SQS-Warteschlangen und einen Lambda-Consumer zugestellt wird

Überwachung und Fehlersuche in AWS

Fan-out einrichten

Vier Schritte

  1. SQS-Warteschlangen erstellen (eine pro Consumer)
  2. Warteschlangenrichtlinien konfigurieren (SNS darf Nachrichten senden)
  3. Warteschlangen beim SNS-Topic abonnieren
  4. Consumer bauen (pollen, verarbeiten, löschen)

Warteschlangenrichtlinie

{
  "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"
    }
  }
}
Überwachung und Fehlersuche in AWS

Warteschlangen abonnieren

 

Jede Warteschlange abonnieren

aws sns subscribe \
  --topic-arn arn:aws:sns:...:production-alerts \
  --protocol sqs \
  --notification-endpoint arn:aws:sqs:...:alarm-logging-queue
Überwachung und Fehlersuche in AWS

Nachrichten verarbeiten

Consumer-Muster

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'])
    # Alarmdaten verarbeiten
    sqs.delete_message(QueueUrl=queue_url,
                       ReceiptHandle=message['ReceiptHandle'])
Überwachung und Fehlersuche in AWS

Fan-out mit Filterung und Dead-Letter-Warteschlangen

Gezielt pro Abonnement zustellen

  • Ticketing-Warteschlange: {"NewStateValue":["ALARM"],"Severity":["Critical"]}
  • Logging-Warteschlange: kein Filter (erhält alles)
  • Metrik-Warteschlange: {"MessageType":["Metric"]}

 

Dead-Letter-Warteschlangen (DLQ)

aws sqs set-queue-attributes \
  --queue-url https://sqs..../alarm-logging-queue \
  --attributes '{
    "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:...:alarm-logging-dlq\",\"maxReceiveCount\":\"3\"}"
  }'
Überwachung und Fehlersuche in AWS

SNS vs. SQS: Wann welches verwenden

Vergleich: SNS Push-Zustellung gegenüber SQS Pull-Nachrichtenwarteschlange

Überwachung und Fehlersuche in AWS

Architekturbeispiele

 

Einfaches Alarmmuster, das eine SNS-Benachrichtigung per E-Mail sendet

 

Asynchrones Verarbeitungsmuster mit einer API, die an eine SQS-Warteschlange sendet, die von einem Worker konsumiert wird

Multi-Channel-Alarmierungsmuster, bei dem ein Alarm auf mehrere Benachrichtigungskanäle verteilt

Event-Pipeline-Muster, das ein Quellereignis zur Verarbeitung an mehrere SQS-Warteschlangen leitet

Überwachung und Fehlersuche in AWS

Videozusammenfassung

 

  • SNS-Topics liefern Alarmbenachrichtigungen via E-Mail, SMS, HTTP, Lambda und SQS
  • Fan-out-Muster: eine SNS-Nachricht → mehrere SQS-Warteschlangen für parallele, zuverlässige Verarbeitung
  • Nachrichtenfilterung reduziert Lärm pro Abonnent
  • Dead-Letter-Warteschlangen fangen fehlgeschlagene Nachrichten ab
  • SNS für Push-Benachrichtigungen, SQS für zuverlässige Verarbeitung; gemeinsam für zuverlässiges Fan-out
Überwachung und Fehlersuche in AWS

Lass uns üben!

Überwachung und Fehlersuche in AWS

Preparing Video For Download...