CloudWatch ile SNS ve SQS entegrasyonu

AWS'i İzleme ve Sorun Giderme

John Q. Martin

Principal Consultant

CloudWatch alarmlarını SNS'e bağlama

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

 

Akış: Bir CloudWatch Alarmı --alarm-actions ile bir SNS konusuna gönderir; bu konu e-posta, SMS, Lambda ve SQS gibi abonelere dağıtır

AWS'i İzleme ve Sorun Giderme

Temel SNS kavramları

Bileşenler

  • SNS yayıncı/abone modelidir: konular, yayıncılar, aboneler
  • Konu: adlandırılmış kanal; yayıncı gönderir, abone alır
  • Bir kez yayınla, tüm abonelere aynı anda teslim edilir

Abone protokolleri (tek konu, çok uç nokta):

  • E-posta, SMS
  • HTTP / HTTPS
  • Lambda, SQS
  • Mobil push, Kinesis Firehose
AWS'i İzleme ve Sorun Giderme

SNS konu tipleri

 

SNS Standard ve FIFO konu tiplerinin sıralama, throughput ve teslimat garantileri karşılaştırması

AWS'i İzleme ve Sorun Giderme

SNS konuları oluşturma: AWS CLI

Standard konu

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

FIFO konu

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

Şifrelemeli

aws sns create-topic \
  --name production-alerts \
  --attributes KmsMasterKeyId=alias/aws/sns
AWS'i İzleme ve Sorun Giderme

Lambda ve SMS aboneleri ekleme

 

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
AWS'i İzleme ve Sorun Giderme

CloudWatch alarmlarından SNS mesaj formatı

{
  "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"
  }
}
AWS'i İzleme ve Sorun Giderme

SNS mesaj filtreleme

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
AWS'i İzleme ve Sorun Giderme

Lambda ile özel bildirim biçimlendirme

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
    )

 

Zincir: ham alarm konusu, okunabilir bir mesajı biçimlendiren ve on-call mühendise yönelik formatted-alerts konusuna yayınlayan bir Lambda'yı besler; makine tüketiciler ham konuda kalır

AWS'i İzleme ve Sorun Giderme

SQS ile fan-out mimarisi

Tek bir SNS mesajının birden çok SQS kuyruğuna ve bir Lambda tüketicisine teslim edildiği fan-out mimarisi

AWS'i İzleme ve Sorun Giderme

Fan-Out Kurulumu

Dört adım

  1. SQS kuyruklarını oluştur (tüketici başına bir)
  2. Kuyruk ilkelerini yapılandır (SNS'in mesaj göndermesine izin ver)
  3. Kuyrukları SNS konusuna abone et
  4. Tüketicileri oluştur (poll, işle, sil)

Kuyruk ilkesi

{
  "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"
    }
  }
}
AWS'i İzleme ve Sorun Giderme

Kuyrukları Abone Etme

 

Her kuyruğu abone et

aws sns subscribe \
  --topic-arn arn:aws:sns:...:production-alerts \
  --protocol sqs \
  --notification-endpoint arn:aws:sqs:...:alarm-logging-queue
AWS'i İzleme ve Sorun Giderme

Mesajları İşleme

Tüketici deseni

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'])
AWS'i İzleme ve Sorun Giderme

Filtreleme ve dead letter kuyruklarıyla fan-out

Abonelik başına hedefli teslimat

  • Ticketing kuyruğu: {"NewStateValue":["ALARM"],"Severity":["Critical"]}
  • Logging kuyruğu: filtre yok (her şeyi alır)
  • Metrics kuyruğu: {"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\"}"
  }'
AWS'i İzleme ve Sorun Giderme

SNS ve SQS: Hangisi ne zaman?

SNS itme tabanlı teslimat ile SQS çekme tabanlı kuyruklamanın karşılaştırması

AWS'i İzleme ve Sorun Giderme

Mimari örnekler

 

Basit uyarı deseni: bir SNS bildirimi e-postaya gönderilir

 

Asenkron işleme deseni: bir API, bir işçi tarafından tüketilen bir SQS kuyruğuna gönderir

Çok kanallı uyarı deseni: tek bir alarm birden fazla bildirim kanalına fan-out yapar

Bir olay hattı deseni: kaynak olayı işleme için birden çok SQS kuyruğuna yönlendirir

AWS'i İzleme ve Sorun Giderme

Video özeti

 

  • SNS konuları e-posta, SMS, HTTP, Lambda ve SQS ile alarm bildirimi iletir
  • Fan-out deseni: bir SNS mesajı → paralel ve güvenilir işleme için birden çok SQS kuyruğu
  • Mesaj filtreleme, abone başına gürültüyü azaltır
  • Dead letter kuyrukları başarısız mesajları yakalar
  • Push bildirim için SNS, güvenilir işleme için SQS; güvenilir fan-out için ikisi birlikte
AWS'i İzleme ve Sorun Giderme

Hadi pratik yapalım!

AWS'i İzleme ve Sorun Giderme

Preparing Video For Download...