Integrasi SNS dan SQS dengan CloudWatch

Pemantauan dan Pemecahan Masalah AWS

John Q. Martin

Principal Consultant

Menghubungkan alarm CloudWatch ke 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

 

Alur: CloudWatch Alarm mengirim via --alarm-actions ke topik SNS, yang menyebar ke pelanggan — Email, SMS, Lambda, dan SQS

Pemantauan dan Pemecahan Masalah AWS

Konsep inti SNS

Komponen

  • SNS adalah publisher/subscriber: topik, publisher, subscriber
  • Topik: kanal bernama; publisher mengirim, subscriber menerima
  • Terbit sekali, terkirim serentak ke semua subscriber

Protokol subscriber (satu topik, banyak endpoint):

  • Email, SMS
  • HTTP / HTTPS
  • Lambda, SQS
  • Mobile push, Kinesis Firehose
Pemantauan dan Pemecahan Masalah AWS

Tipe topik SNS

 

Perbandingan tipe topik SNS Standard dan FIFO berdasarkan pengurutan, throughput, dan jaminan pengiriman

Pemantauan dan Pemecahan Masalah AWS

Membuat topik SNS: AWS CLI

Topik Standard

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

Topik FIFO

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

Dengan enkripsi

aws sns create-topic \
  --name production-alerts \
  --attributes KmsMasterKeyId=alias/aws/sns
Pemantauan dan Pemecahan Masalah AWS

Menambahkan subscriber Lambda dan 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
Pemantauan dan Pemecahan Masalah AWS

Format pesan SNS dari 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"
  }
}
Pemantauan dan Pemecahan Masalah AWS

Penyaringan pesan 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
Pemantauan dan Pemecahan Masalah AWS

Pemformatan notifikasi kustom dengan 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
    )

 

Rantai: topik alarm mentah memberi makan Lambda yang memformat pesan agar mudah dibaca dan menerbitkannya ke topik formatted-alerts untuk engineer on-call, sementara konsumen mesin tetap pada topik mentah

Pemantauan dan Pemecahan Masalah AWS

Arsitektur fan-out dengan SQS

Arsitektur fan-out di mana satu pesan SNS dikirim ke banyak antrean SQS dan satu konsumen Lambda

Pemantauan dan Pemecahan Masalah AWS

Menyiapkan Fan-Out

Empat langkah

  1. Buat antrean SQS (satu per konsumen)
  2. Konfigurasikan kebijakan antrean (izinkan SNS mengirim pesan)
  3. Langganan antrean ke topik SNS
  4. Bangun konsumen (poll, proses, hapus)

Kebijakan antrean

{
  "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"
    }
  }
}
Pemantauan dan Pemecahan Masalah AWS

Melanggankan Antrean

 

Berlangganan tiap antrean

aws sns subscribe \
  --topic-arn arn:aws:sns:...:production-alerts \
  --protocol sqs \
  --notification-endpoint arn:aws:sqs:...:alarm-logging-queue
Pemantauan dan Pemecahan Masalah AWS

Memproses Pesan

Pola konsumen

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'])
Pemantauan dan Pemecahan Masalah AWS

Fan-Out dengan penyaringan dan dead letter queue

Pengiriman terarah per langganan

  • Antrean tiket: {"NewStateValue":["ALARM"],"Severity":["Critical"]}
  • Antrean logging: tanpa filter (menerima semua)
  • Antrean metrik: {"MessageType":["Metric"]}

 

Dead letter queue (DLQ)

aws sqs set-queue-attributes \
  --queue-url https://sqs..../alarm-logging-queue \
  --attributes '{
    "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:...:alarm-logging-dlq\",\"maxReceiveCount\":\"3\"}"
  }'
Pemantauan dan Pemecahan Masalah AWS

SNS vs. SQS: Kapan Menggunakan Masing-Masing

Perbandingan pengiriman berbasis push SNS versus antrian pesan berbasis pull SQS

Pemantauan dan Pemecahan Masalah AWS

Contoh arsitektur

 

Pola peringatan sederhana yang mengirim notifikasi SNS ke email

 

Pola pemrosesan asinkron dengan API yang mengirim ke antrean SQS yang dikonsumsi oleh worker

Pola peringatan multikanal di mana satu alarm menyebar ke beberapa kanal notifikasi

Pola pipeline peristiwa yang merutekan event sumber ke beberapa antrean SQS untuk diproses

Pemantauan dan Pemecahan Masalah AWS

Ringkasan video

 

  • Topik SNS mengirim notifikasi alarm via email, SMS, HTTP, Lambda, dan SQS
  • Pola fan-out: satu pesan SNS → banyak antrean SQS untuk pemrosesan paralel dan andal
  • Penyaringan pesan mengurangi kebisingan per subscriber
  • Dead letter queue menangkap pesan yang gagal
  • SNS untuk push notifications, SQS untuk pemrosesan andal, keduanya untuk fan-out yang andal
Pemantauan dan Pemecahan Masalah AWS

Ayo berlatih!

Pemantauan dan Pemecahan Masalah AWS

Preparing Video For Download...