Tích hợp SNS và SQS với CloudWatch

Giám sát và Khắc phục sự cố trên AWS

John Q. Martin

Principal Consultant

Kết nối CloudWatch alarms với 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

 

Luồng: một CloudWatch Alarm gửi qua --alarm-actions đến một chủ đề SNS, chủ đề này phát tán tới người đăng ký — Email, SMS, Lambda và SQS

Giám sát và Khắc phục sự cố trên AWS

Khái niệm cốt lõi của SNS

Thành phần

  • SNS theo mô hình publisher/subscriber: topics, publishers, subscribers
  • Topic: kênh có tên; publisher gửi, subscriber nhận
  • Xuất bản một lần, giao đồng thời tới tất cả subscribers

Giao thức subscriber (một topic, nhiều endpoint):

  • Email, SMS
  • HTTP / HTTPS
  • Lambda, SQS
  • Mobile push, Kinesis Firehose
Giám sát và Khắc phục sự cố trên AWS

Các loại topic SNS

 

So sánh các loại topic SNS Standard và FIFO theo thứ tự, thông lượng và cam kết giao hàng

Giám sát và Khắc phục sự cố trên AWS

Tạo SNS topics: 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

Kèm mã hóa

aws sns create-topic \
  --name production-alerts \
  --attributes KmsMasterKeyId=alias/aws/sns
Giám sát và Khắc phục sự cố trên AWS

Thêm subscribers Lambda và 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
Giám sát và Khắc phục sự cố trên AWS

Định dạng thông điệp SNS từ CloudWatch alarms

{
  "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"
  }
}
Giám sát và Khắc phục sự cố trên AWS

Lọc thông điệp trong 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
Giám sát và Khắc phục sự cố trên AWS

Tùy biến định dạng thông báo với 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
    )

 

Chuỗi: topic cảnh báo thô đưa vào Lambda để định dạng thông điệp dễ đọc rồi xuất bản tới topic formatted-alerts cho kỹ sư trực, trong khi hệ thống máy móc vẫn dùng topic thô

Giám sát và Khắc phục sự cố trên AWS

Kiến trúc fan-out với SQS

Kiến trúc fan-out nơi một thông điệp SNS được gửi tới nhiều hàng đợi SQS và một Lambda consumer

Giám sát và Khắc phục sự cố trên AWS

Thiết lập fan-out

Bốn bước

  1. Tạo hàng đợi SQS (mỗi consumer một hàng đợi)
  2. Cấu hình policy cho hàng đợi (cho phép SNS gửi)
  3. Đăng ký hàng đợi vào topic SNS
  4. Xây dựng consumers (poll, xử lý, xóa)

Queue policy

{
  "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"
    }
  }
}
Giám sát và Khắc phục sự cố trên AWS

Đăng ký hàng đợi

 

Đăng ký từng hàng đợi

aws sns subscribe \
  --topic-arn arn:aws:sns:...:production-alerts \
  --protocol sqs \
  --notification-endpoint arn:aws:sqs:...:alarm-logging-queue
Giám sát và Khắc phục sự cố trên AWS

Xử lý thông điệp

Mẫu consumer

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'])
    # Xử lý dữ liệu alarm
    sqs.delete_message(QueueUrl=queue_url,
                       ReceiptHandle=message['ReceiptHandle'])
Giám sát và Khắc phục sự cố trên AWS

Fan-out với lọc và dead letter queues

Giao hàng theo mục tiêu cho từng đăng ký

  • Hàng đợi tạo ticket: {"NewStateValue":["ALARM"],"Severity":["Critical"]}
  • Hàng đợi logging: không lọc (nhận tất cả)
  • Hàng đợi metrics: {"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\"}"
  }'
Giám sát và Khắc phục sự cố trên AWS

SNS vs. SQS: Khi nào dùng mỗi dịch vụ

So sánh giao hàng dựa trên đẩy của SNS và hàng đợi thông điệp dựa trên kéo của SQS

Giám sát và Khắc phục sự cố trên AWS

Ví dụ kiến trúc

 

Mẫu cảnh báo đơn giản gửi thông báo SNS đến email

 

Mẫu xử lý bất đồng bộ với một API gửi vào hàng đợi SQS được tiêu thụ bởi worker

Mẫu cảnh báo đa kênh nơi một alarm phát tán tới nhiều kênh thông báo

Mẫu đường ống sự kiện định tuyến một sự kiện nguồn tới nhiều hàng đợi SQS để xử lý

Giám sát và Khắc phục sự cố trên AWS

Tóm tắt video

 

  • Topics của SNS gửi thông báo cảnh báo qua email, SMS, HTTP, Lambda và SQS
  • Mẫu fan-out: một thông điệp SNS → nhiều hàng đợi SQS để xử lý song song, tin cậy
  • Lọc thông điệp giảm nhiễu cho từng subscriber
  • Dead letter queues bắt thông điệp lỗi
  • SNS cho push notifications, SQS cho xử lý tin cậy; cả hai hỗ trợ fan-out với độ tin cậy
Giám sát và Khắc phục sự cố trên AWS

Cùng luyện tập nào!

Giám sát và Khắc phục sự cố trên AWS

Preparing Video For Download...