Integrarea SNS și SQS cu CloudWatch

Monitorizare și depanare în AWS

John Q. Martin

Principal Consultant

Conectarea alarmelor CloudWatch la 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: o alarmă CloudWatch trimite prin --alarm-actions către un topic SNS, care distribuie abonaților — Email, SMS, Lambda și SQS

Monitorizare și depanare în AWS

Concepte de bază SNS

Componente

  • SNS folosește modelul publicare/abonare: topicuri, editori, abonați
  • Topic: canal denumit; editorii trimit, abonații primesc
  • Publicat o dată, livrat simultan tuturor abonaților

Protocoale de abonare (un topic, mai multe destinații):

  • Email, SMS
  • HTTP / HTTPS
  • Lambda, SQS
  • Push mobil, Kinesis Firehose
Monitorizare și depanare în AWS

Tipuri de topicuri SNS

 

Comparație între tipurile de topicuri SNS Standard și FIFO: ordonare, capacitate și garanții de livrare

Monitorizare și depanare în AWS

Crearea topicurilor SNS: AWS CLI

Topic Standard

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

Topic FIFO

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

Cu criptare

aws sns create-topic \
  --name production-alerts \
  --attributes KmsMasterKeyId=alias/aws/sns
Monitorizare și depanare în AWS

Adăugarea abonaților Lambda și 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
Monitorizare și depanare în AWS

Formatul mesajelor SNS din alarmele 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"
  }
}
Monitorizare și depanare în AWS

Filtrarea mesajelor 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
Monitorizare și depanare în AWS

Formatare personalizată a notificărilor cu 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
    )

 

Lanț: topicul de alarme brute alimentează un Lambda care formatează un mesaj lizibil și îl publică în topicul formatted-alerts pentru inginerul de gardă, în timp ce consumatorii automatizați rămân pe topicul brut

Monitorizare și depanare în AWS

Arhitectură fan-out cu SQS

Arhitectură fan-out în care un mesaj SNS este livrat mai multor cozi SQS și unui consumator Lambda

Monitorizare și depanare în AWS

Configurarea fan-out

Patru pași

  1. Creează cozi SQS (câte una per consumator)
  2. Configurează politicile cozilor (permite SNS să trimită mesaje)
  3. Abonează cozile la topicul SNS
  4. Construiește consumatorii (interogare, procesare, ștergere)

Politica cozii

{
  "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"
    }
  }
}
Monitorizare și depanare în AWS

Abonarea cozilor

 

Abonează fiecare coadă

aws sns subscribe \
  --topic-arn arn:aws:sns:...:production-alerts \
  --protocol sqs \
  --notification-endpoint arn:aws:sqs:...:alarm-logging-queue
Monitorizare și depanare în AWS

Procesarea mesajelor

Modelul consumatorului

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'])
Monitorizare și depanare în AWS

Fan-out cu filtrare și cozi pentru mesaje eșuate

Livrare țintită per abonament

  • Coada de ticketing: {"NewStateValue":["ALARM"],"Severity":["Critical"]}
  • Coada de logging: fără filtru (primește tot)
  • Coada de metrici: {"MessageType":["Metric"]}

 

Cozi pentru mesaje eșuate (DLQ)

aws sqs set-queue-attributes \
  --queue-url https://sqs..../alarm-logging-queue \
  --attributes '{
    "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:...:alarm-logging-dlq\",\"maxReceiveCount\":\"3\"}"
  }'
Monitorizare și depanare în AWS

SNS vs. SQS: când să folosești fiecare

Comparație între livrarea push a SNS și sistemul de cozi pull al SQS

Monitorizare și depanare în AWS

Exemple de arhitecturi

 

Model simplu de alertă care trimite o notificare SNS prin email

 

Model de procesare asincronă cu un API care trimite într-o coadă SQS consumată de un worker

Model de alertare multi-canal în care o singură alarmă distribuie notificări pe mai multe canale

Model de pipeline de evenimente care rutează un eveniment sursă către mai multe cozi SQS pentru procesare

Monitorizare și depanare în AWS

Rezumatul lecției

 

  • Topicurile SNS livrează notificări de alarmă prin email, SMS, HTTP, Lambda și SQS
  • Modelul fan-out: un mesaj SNS → mai multe cozi SQS pentru procesare paralelă și fiabilă
  • Filtrarea mesajelor reduce zgomotul per abonat
  • Cozile DLQ captează mesajele eșuate
  • SNS pentru notificări push, SQS pentru procesare fiabilă, ambele pentru fan-out cu fiabilitate
Monitorizare și depanare în AWS

Hai să exersăm!

Monitorizare și depanare în AWS

Preparing Video For Download...