Integrace SNS a SQS s CloudWatch

Monitoring and Troubleshooting AWS

John Q. Martin

Principal Consultant

Propojení alarmů CloudWatch se 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

 

Tok: alarm CloudWatch odesílá přes --alarm-actions do tématu SNS, které rozvětvuje zprávy odběratelům — e-mail, SMS, Lambda a SQS

Monitoring and Troubleshooting AWS

Základní koncepty SNS

Komponenty

  • SNS je model vydavatel/odběratel: témata, vydavatelé, odběratelé
  • Téma: pojmenovaný kanál; vydavatelé posílají, odběratelé přijímají
  • Zpráva se publikuje jednou a doručí všem odběratelům současně

Protokoly odběratelů (jedno téma, více koncových bodů):

  • E-mail, SMS
  • HTTP / HTTPS
  • Lambda, SQS
  • Mobilní push, Kinesis Firehose
Monitoring and Troubleshooting AWS

Typy témat SNS

 

Porovnání typů témat SNS Standard a FIFO podle řazení, propustnosti a záruk doručení

Monitoring and Troubleshooting AWS

Vytváření témat SNS: AWS CLI

Standardní téma

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

Téma FIFO

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

Se šifrováním

aws sns create-topic \
  --name production-alerts \
  --attributes KmsMasterKeyId=alias/aws/sns
Monitoring and Troubleshooting AWS

Přidání odběratelů Lambda a 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
Monitoring and Troubleshooting AWS

Formát zprávy SNS z alarmů 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"
  }
}
Monitoring and Troubleshooting AWS

Filtrování zpráv 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
Monitoring and Troubleshooting AWS

Vlastní formátování notifikací pomocí 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
    )

 

Řetězec: téma s raw alarmem napájí Lambda, která zprávu naformátuje a publikuje do tématu formatted-alerts pro pohotovostního technika; strojové konzumenty zůstávají na raw tématu

Monitoring and Troubleshooting AWS

Architektura fan-out s SQS

Architektura fan-out, kde jedna zpráva SNS doručuje do více front SQS a konzumentu Lambda

Monitoring and Troubleshooting AWS

Nastavení fan-out

Čtyři kroky

  1. Vytvoř fronty SQS (jednu pro každého konzumenta)
  2. Nakonfiguruj zásady fronty (povol SNS odesílat zprávy)
  3. Přihlaste fronty k odběru tématu SNS
  4. Vytvoř konzumenty (přijmi, zpracuj, smaž)

Zásada fronty

{
  "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 and Troubleshooting AWS

Přihlášení front k odběru

 

Přihlášení každé fronty k odběru

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

Zpracování zpráv

Vzor konzumenta

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'])
    # Process alarm data
    sqs.delete_message(QueueUrl=queue_url,
                       ReceiptHandle=message['ReceiptHandle'])
Monitoring and Troubleshooting AWS

Fan-out s filtrováním a frontami nedoručených zpráv

Cílené doručení podle odběru

  • Fronta pro ticketing: {"NewStateValue":["ALARM"],"Severity":["Critical"]}
  • Fronta pro logování: bez filtru (přijímá vše)
  • Fronta pro metriky: {"MessageType":["Metric"]}

 

Fronty nedoručených zpráv (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 and Troubleshooting AWS

SNS vs. SQS: kdy použít co

Porovnání doručování zpráv SNS metodou push a řazení zpráv do fronty SQS metodou pull

Monitoring and Troubleshooting AWS

Příklady architektur

 

Jednoduchý vzor alertu odesílající SNS notifikaci na e-mail

 

Vzor asynchronního zpracování, kde API odesílá do fronty SQS konzumované workerem

Vzor vícekanálového alertu, kde jeden alarm rozvětvuje notifikace do několika kanálů

Vzor pipeline událostí směrující zdrojovou událost do více front SQS ke zpracování

Monitoring and Troubleshooting AWS

Shrnutí videa

 

  • Témata SNS doručují notifikace alarmů přes e-mail, SMS, HTTP, Lambda a SQS
  • Vzor fan-out: jedna zpráva SNS → více front SQS pro paralelní a spolehlivé zpracování
  • Filtrování zpráv snižuje šum u jednotlivých odběratelů
  • Fronty nedoručených zpráv zachytávají chybně zpracované zprávy
  • SNS pro push notifikace, SQS pro spolehlivé zpracování, obojí pro fan-out se zárukami
Monitoring and Troubleshooting AWS

Pojďme cvičit!

Monitoring and Troubleshooting AWS

Preparing Video For Download...